@limetech/lime-elements 38.37.1 → 38.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"names":["objectProto","Object","prototype","hasOwnProperty","baseHas","object","key","call","has","path","hasPath","baseSet","value","customizer","isObject","castPath","index","length","lastIndex","nested","toKey","newValue","objValue","undefined","isIndex","assignValue","basePickBy","paths","predicate","result","baseGet","pickBy","props","arrayMap","getAllKeysIn","prop","baseIteratee","CoreFeature","constructor","table","this","reloadData","data","silent","columnsChanged","dataLoader","load","langText","modules","localize","getText","arguments","langBind","bind","langLocale","getLocale","commsConnections","comms","getConnections","commsSend","send","layoutMode","layout","getMode","layoutRefresh","force","subscribe","eventBus","unsubscribe","subscribed","subscriptionChange","dispatch","chain","confirm","dispatchExternal","externalEvents","subscribedExternal","subscriptionChangeExternal","options","setOption","deprecationCheck","oldOption","newOption","convert","deprecationAdvisor","check","deprecationCheckMsg","msg","checkMsg","deprecationMsg","module","Helpers","static","el","offsetWidth","offsetHeight","box","getBoundingClientRect","top","window","pageYOffset","document","documentElement","clientTop","left","pageXOffset","clientLeft","separator","field","structure","split","output","i","obj","clone","list","__proto__","arrayProto","assign","Array","isArray","subject","match","copy","findIndex","item","unshift","deepClone","Popup$1","Popup","element","parent","super","container","_lookupContainer","reversedX","childPopup","blurable","blurCallback","blurEventsBound","renderedCallback","visible","hideable","classList","add","blurEvent","hide","escEvent","_escapeCheck","destroyBinding","tableDestroyed","destroyed","popupContainer","querySelector","console","warn","_checkContainerIsParent","body","parentNode","renderCallback","callback","containerEventCoords","e","touch","MouseEvent","x","touches","pageX","y","pageY","parentOffset","elOffset","elementPositionCoords","position","offset","containerOffset","show","origin","parentEl","coords","HTMLElement","style","appendChild","_fitToScreen","addEventListener","stopPropagation","scrollTop","right","Math","max","scrollHeight","parseInt","height","isVisible","hideOnBlur","setTimeout","rowManager","keyCode","blockHide","restoreHide","removeEventListener","removeChild","child","Module","name","_handler","initialize","registerTableOption","optionsList","register","registerColumnOption","columnManager","registerTableFunction","func","args","initGuard","registerComponentFunction","component","handler","componentFunctionBinder","registerDataHandler","priority","registerDataPipelineHandler","registerDisplayHandler","registerDisplayPipelineHandler","displayRows","adjust","lookupIndex","displayPipeline","getDisplayRows","activeRows","refreshData","renderInPosition","refreshActiveData","footerAppend","footerManager","append","footerPrepend","prepend","footerRemove","remove","popup","menuEl","menuContainer","alert","content","type","alertManager","clearAlert","clear","defaultAccessors","rownum","params","column","row","getPosition","Accessor","allowedTypes","initializeColumn","transformRow","config","forEach","charAt","toUpperCase","slice","accessor","definition","lookupAccessor","accessors","rowComponent","getComponent","traverse","colComponent","getFieldValue","setFieldValue","defaultConfig","method","generateParamsList$1","prefix","concat","push","serializeParams","encoded","encodeURIComponent","join","urlBuilder","url","keys","toLowerCase","includes","defaultLoaderPromise","contentType","Promise","resolve","reject","urlGenerator","ajaxContentType","contentTypeFormatters","headers","Accept","mode","location","credentials","fetch","then","response","ok","json","catch","error","status","statusText","generateParamsList","defaultContentTypeFormatters","JSON","stringify","form","FormData","Ajax","loaderPromise","ajaxRequestFunc","ajaxURLGenerator","defaultURLGenerator","ajaxURL","setUrl","setDefaultConfig","ajaxConfig","getUrl","requestDataCheck","requestParams","requestData","ajaxParams","previousData","generateConfig","sendRequest","ajaxRequesting","ajaxResponse","defaultPasteActions","replace","setData","update","updateOrAddData","insert","addData","defaultPasteParsers","clipboard","headerFindSuccess","columns","columnMap","rows","find","title","trim","columnsByIndex","shift","bindings$2","copyToClipboard","actions$2","edit","currentCell","modExists","extensions$4","keybindings","bindings","actions","Clipboard","pasteParser","pasteAction","customSelection","rowRange","blocked","clipboardCopyRowRange","plain","html","preventDefault","clipboardCopyFormatter","export","generateExportList","clipboardCopyConfig","clipboardCopyStyled","generateHTMLTable","generatePlainContent","clipboardData","originalEvent","reset","paste","setPasteParser","clipboardPasteParser","setPasteAction","clipboardPasteAction","rowData","col","getKey","range","internal","sel","textRange","getSelection","createRange","selectNodeContents","toString","removeAllRanges","addRange","selection","createTextRange","moveToElementText","select","execCommand","action","pasteActions","parser","pasteParsers","checkPasteOrigin","getPasteData","mutateData","mutator","valid","target","tagName","getData","CalcComponent","_row","Proxy","get","receiver","handle","transform","getElement","getTable","getCells","cells","cell","getCell","_getSelf","CellComponent","_cell","getValue","getOldValue","getInitialValue","initialValue","getRow","getType","getField","getColumn","setValue","mutate","restoreOldValue","setValueActual","restoreInitialValue","checkHeight","Cell","oldValue","width","minWidth","loaded","build","generateElement","setWidth","_configureCell","createElement","className","setAttribute","isRowHeader","vertAligns","bottom","middle","hozAligns","center","textAlign","hozAlign","vertAlign","display","alignItems","justifyContent","cssClass","classNames","_generateContents","val","innerHTML","Node","firstChild","cellRendered","containerOnly","layoutElement","changed","setValueProcessData","cellEdited","widthStyled","clearWidth","getWidth","setMinWidth","minWidthStyled","setMaxWidth","maxWidth","maxWidthStyled","reinitializeHeight","clearHeight","setHeight","heightStyled","getHeight","delete","redrawBlock","deleteCell","calcs","getIndex","getCellIndex","ColumnComponent","_column","getDefinition","getTitleDownload","isGroup","toggle","getSubColumns","getParentColumn","getParentComponent","scrollTo","ifVisible","scrollToColumn","move","to","after","toColumn","findColumn","moveColumn","getNextColumn","nextCol","nextColumn","getPrevColumn","prevCol","prevColumn","updateDefinition","updates","reinitializeWidth","rerenderColumns","defaultColumnOptions","maxInitialWidth","variableHeight","headerVertical","headerHozAlign","headerWordWrap","editableTitle","Column","def","rowHeader","contentElement","titleHolderElement","titleElement","groupElement","createGroupElement","fieldStructure","titleDownload","titleFormatterRendered","mapDefinitions","setField","widthFixed","newCol","attachColumn","checkColumnVisibility","registerColumnField","_initialize","columnHeaderVertAlign","defaults","columnDefaults","generate","defaultOptionList","checkDefinition","indexOf","nestedFieldSeparator","_getNestedData","_getFlatData","_setNestedData","_setFlatData","registerColumnPosition","reRegisterPosition","_buildColumnHeaderContent","_buildGroupHeader","_buildColumnHeader","_buildColumnHeaderTitle","focus","text","_formatColumnHeaderTitle","contents","dataObj","columnRendered","verticalAlign","alignment","parentHeight","getGroupElement","clientHeight","getHeadersElement","minHeight","clearVerticalAlign","paddingTop","getFirstColumn","getLastColumn","getColumns","getTopColumn","updateBranches","colDefs","responsiveToggle","verticalAlignHeaders","matchChildWidths","childWidth","initialized","splice","setWidthActual","isNaN","floor","clientWidth","min","checkCellHeights","heightInitialized","offsetParent","clearCellHeight","calcHeight","setCellHeight","getLeftOffset","offsetLeft","ceil","cellCount","deregisterColumn","generateCell","findColumnIndex","_nextVisibleColumn","getColumnByIndex","_prevVisibleColumn","fitToData","setTo","addColumn","getVisibleColumnsByIndex","RowComponent","watchPosition","scrollToRow","moveToRow","updateData","normalizeHeight","reformat","reinitialize","getNextRow","nextRow","getPrevRow","prevRow","Row","manualHeight","outerHeight","positionWatchers","created","create","detachElement","generateCells","inFragment","deleteCells","renderer","renderRowCells","rowFormatter","rerenderRowCells","rendered","deinitialize","deinitializeHeight","children","maxHeight","rowHeight","calcMinHeight","calcMaxHeight","resizableRows","updatedData","elVisible","tempData","newRowData","parse","attrname","getColumnsByFieldRoot","findCell","nextDisplayRow","prevDisplayRow","before","toRow","findRow","moveRowActual","deleteActual","blockRedraw","detachModules","deleteRow","wipe","isDisplayed","setPosition","getGroup","group","defaultCalculations","avg","values","calcParams","precision","reduce","sum","Number","toFixed","parseFloat","String","count","unique","filter","ColumnCalcs","topCalcs","botCalcs","genColumn","topElement","botElement","topRow","botRow","topInitialized","botInitialized","recalcAfterBlock","cellValueChanged","initializeColumnCheck","rowsUpdated","scrollHorizontal","recalcActiveRows","recalcActiveRowsRefresh","tableRedraw","visibleRows","adjustForScrollbar","restoreRedraw","resizeHolderWidth","getResults","userRecalc","headersElement","recalc","redraw","blockCheck","viewable","groupBy","recalcRowGroup","dataTreeStartExpanded","dataTree","recalcAll","topCalc","bottomCalc","columnCalcs","topCalcParams","botCalcParams","bottomCalcParams","calculations","initializeTopRow","botCalc","initializeBottomRow","removeCalcs","adjustTableSize","reinitializeCalcs","fragment","createDocumentFragment","getContentsElement","insertBefore","nextSibling","scrollLeft","rowsToData","generateRow","frozenColumns","recalcGroup","groupRows","getRowGroup","groups","getChildGroups","generateRowData","generateTopRow","generateBottomRow","hasDataTreeColumnCalcs","dataTreeChildColumnCalcs","open","getFilteredTreeChildren","dataRow","pos","disable","enable","format","formatter","lookupFormatter","paramKey","hasTopCalcs","hasBottomCalcs","results","getGroups","getGroupResults","groupObj","subGroups","getSubGroups","subGroupResults","subgroup","rtl","paddingLeft","paddingRight","DataTree","indent","collapseEl","expandEl","branchEl","elementField","startOpen","collapseRow","expandRow","toggleRow","getTreeParent","getRowChildren","addTreeChildRow","isRowExpanded","dummyEl","dataTreeChildField","dataTreeChildIndent","dataTreeBranchElement","dataTreeCollapseElement","tabIndex","dataTreeExpandElement","initializeRow","layoutRow","rowDeleting","rowDelete","rowDataChanged","columnMoving","initializeElementField","tableRedrawing","getRows","reinitializeRowChildren","firstCol","getFirstVisibleColumn","dataTreeElementColumn","getTreeChildren","redrawNeeded","childArray","controlEl","generateControlElement","cloneNode","marginRight","marginLeft","getComputedStyle","getPropertyValue","oldControl","replaceChild","getChildren","allChildren","sortOnly","generateChildren","dataTreeFilter","dataTreeSort","sort","subChildren","sub","childData","childRow","getTreeParentRoot","childIndex","findChildIndex","recurse","getChildField","csv$1","setFileContents","delimiter","fileContents","depth","bom","json$2","pdf","header","autoTableParams","rowGroupStyles","fontStyle","fontSize","cellPadding","fillColor","rowCalcStyles","jsPDFParams","jsPDF","jspdfLib","doc","orientation","unit","parseRow","styles","colSpan","rowSpan","dependencyRegistry","lookup","autoTable","didDrawPage","head","documentProcessing","xlsx$1","self","sheetName","XLSXLib","workbook","utils","book_new","tableFeatures","compression","compress","writeOptions","bookType","bookSST","SheetNames","Sheets","generateSheet","merges","worksheet","s","c","r","a","b","j","Date","sheet_add_aoa","encode_range","sheetOnly","sheets","sheet","active","intercept","s2ab","buf","ArrayBuffer","view","Uint8Array","charCodeAt","write","html$1","jsonLines","defaultDownloaders","csv","xlsx","Download","mimeType","Blob","deprecatedOptionsCheck","download","downloadToTab","filename","interceptCallback","downloadFunc","buildLink","mime","triggerDownload","downloaders","downloadConfig","downloadRowRange","groupHeader","groupHeaderDownload","_group","getRowCount","newTab","blob","downloadEncoder","URL","createObjectURL","navigator","msSaveOrOpenBlob","click","commsReceived","maskInput","mask","maskLetter","maskLetterChar","maskNumber","maskNumberChar","maskWildcard","maskWildcardChar","fillSymbols","symbol","char","ctrlKey","metaKey","maskAutoFill","placeholder","input","onRendered","success","cancel","editorParams","cellValue","search","padding","boxSizing","elementAttributes","getAttribute","preventScroll","selectContents","onChange","textarea$1","vertNav","verticalNavigation","whiteSpace","resize","heightNow","shiftKey","shiftEnterSubmit","selectionStart","stopImmediatePropagation","number$1","step","blurFunc","date$1","inputFormat","DT","DateTime","luxon","convertDate","newDatetime","isDateTime","fromISO","fromFormat","toFormat","luxDate","toISO","relatedTarget","rangeParent","explicitOriginalTarget","time$1","luxTime","datetime$2","luxDateTime","Edit$1","Edit","editor","_initializeParams","displayItems","currentItems","focusedItem","_createInputElement","listEl","_createListElement","initialValues","isFilter","filterTimeout","filtered","typing","listIteration","lastAction","filterTerm","_deprecatedOptionsCheck","_initializeValue","_onRendered","defaultValue","multiselect","headerFilterInitialListGen","cellEl","clickStop","_preventPopupBlur","_preventBlur","_inputKeyDown","_setListWidth","attribs","clearable","autocomplete","cursor","caretColor","_bindInputEvents","valueKeys","valueCheck","placeholderLoading","placeholderEmpty","filterDelay","emptyValue","freetext","filterFunc","filterRemote","allowEmpty","listOnEmpty","valuesLookup","valuesURL","_inputFocus","_inputClick","_inputBlur","_inputSearch","_inputKeyUp","rebuildOptionsList","_filter","clearTimeout","_filterList","_resolveValue","_clearChoices","_keyUp","_keyDown","_keySide","_keyEnter","_keyEsc","_keyHomeEnd","_keyTab","_keySelectLetter","_keyAutoCompLetter","_chooseItem","_focusItem","_cancel","_scrollToValue","character","fromCharCode","label","startsWith","scrollIntoView","behavior","block","inline","_generateOptions","_sortOptions","_buildList","_showList","isInteger","_filterOptions","iteration","_ajaxRequest","_uniqueColumnValues","valuesLookupField","_addPlaceholder","responseValues","_parseList","_clearList","term","getColumnByField","_emptyValueCheck","inputValues","entries","map","_parseListItem","option","level","_parseListGroup","itemParams","selected","original","sorter","_defaultSortFunction","_sortGroup","as","bs","a1","b1","L","rx","rd","emptyAlign","isFinite","test","_defaultFilterFunc","_filterItem","matches","_buildItem","itemFormatter","_groupClick","_itemClick","_styleItem","startVis","blur","star$1","maxStars","getElementsByTagName","size","stars","starsHolder","star","createElementNS","starChange","browser","buildStar","starHolder","nextStar","changeValue","overflow","textOverflow","progress$1","percent","bar","mouseDrag","mouseDragWidth","updateValue","calcVal","round","backgroundColor","screenX","tickCross$1","tristate","indetermValue","indeterminateValue","indetermState","trueValueSet","falseValueSet","marginTop","indeterminate","checked","trueValue","checkedValue","falseValue","adaptable$1","editorFunc","defaultLookup","editorLookup","paramsLookup","lookupEditor","defaultEditors","textarea","number","date","time","datetime","progress","tickCross","adaptable","mouseClick","recursionBlock","invalidEdit","editedCells","convertEmptyValues","editors","emptyValueCheck","getEditedCells","clearCellEdited","navigatePrev","navigateNext","navigateLeft","navigateRight","navigateUp","navigateDown","cellIsEdited","clearEdited","editCell","cellCancelEdit","bindEditor","updateCellClass","columnDeleteCheck","rowDeleteCheck","rowEditableCheck","cancelEdit","pasteBlocker","keybindingNavigateNext","newRow","addRow","edited","allowEdit","nextCell","findPrevEditableCell","findNextEditableCell","prevCell","convertEmpty","editable","editorEmptyValue","editorEmptyValueFunc","getCurrentCell","clearEditor","cellEditCancelled","button","contains","focusCellNoEvent","forceEdit","focusScrollAdjust","getRenderMode","topEdge","bottomEdge","rowEl","offsetTop","leftEdge","rightEdge","leftMargin","rightMargin","renderHorizontal","vDomPadLeft","editFinished","cellEditor","validationMode","transformEmptyValues","cellClick","cellEditing","mod","checkFunc","editIndex","ExportRow","ExportColumn","columnLookups$1","rowLookups$1","getVisibleRows","all","selectRow","selectedRows","pagination","Export","cloneTableStyle","colVisProp","colVisPropAttach","getHtml","colLookup","columnLookups","columnVisCheck","columnHeaders","headersToExportRows","generateColumnGroupHeaders","bodyToExportRows","rowLookup","generateTable","generateTableElement","rowLookups","columnGroups","colData","processColumnGroup","maxDepth","groupData","subGroup","subGroupData","visProp","rowHeaders","headerDepth","exportRows","parseColumnGroup","rowGroups","exportCols","headerEl","bodyEl","lookupTableStyles","setup","treeElementField","mapElementStyles","generateHeaderElement","generateGroupElement","generateCalcElement","generateRowElement","evenRow","oddRow","calcRow","firstRow","firstGroup","getElementsByClassName","styleCells","styleRowHeader","firstCell","lastCell","generator","cellStyle","styleProps","cellWrapper","formatCells","formatExportValue","align","formatComponent","holder","htmlOutputConfig","from","color","fromStyle","defaultFilters","filterVal","rowVal","filterParams","regex","RegExp","like","keywords","keyword","matchAll","starts","ends","endsWith","in","Filter","filterList","headerFilters","headerFilterColumns","prevHeaderFilterChangeCheck","tableInitialized","searchRows","searchData","userSetFilter","userRefreshFilter","userAddFilter","getFilters","userSetHeaderFilterFocus","userGetHeaderFilterValue","userSetHeaderFilterValue","getHeaderFilters","userRemoveFilter","userClearFilter","userClearHeaderFilter","setHeaderFilterFocus","reloadHeaderFilter","getHeaderFilterValue","setHeaderFilterValue","initializeColumnHeaderFilter","hideHeaderFilterElements","showHeaderFilterElements","tableBuilt","generatePlaceholder","filterMode","remoteFilterParams","initialFilter","setFilter","initialHeaderFilter","placeholderHeaderFilter","refreshFilter","addFilter","removeFilter","clearFilter","clearHeaderFilter","headerFilter","filterType","tagType","attrType","filterChangeCheck","prevSuccess","emptyFunc","headerFilterFunc","filters","headerFilterFuncParams","fieldVal","colVal","trackChanges","generateHeaderFilterElement","filterElement","editorElement","typingTimer","searchTrigger","onRenderedCallback","headerElement","headerFilterEmptyCheck","headerFilterParams","headerFilterPlaceholder","contentsElement","headerPos","headerFilterLiveFilterDelay","hasAttribute","headerFilterLiveFilter","hasChanged","findFilter","findSubFilters","ajax","filtersToArray","searchType","filterRecurse","rowList","activeRowComponents","filterRow","subFilter","plaintext","formatterParams","emptyToSpace","sanitizeHTML","money","floatVal","sign","integer","decimal","rgx","decimalSym","thousandSym","thousand","negativeSign","symbolAfter","abs","link","urlPrefix","labelTraverse","labelField","urlField","retrieveNestedData","image","src","urlSuffix","empty","truthy","allowTruthy","tick","tickElement","cross","crossElement","datetime$1","outputFormat","invalid","invalidPlaceholder","isValid","timezone","setZone","datetimediff","suffix","humanize","now","diff","toHuman","starActive","starInactive","traffic","colors","percentValue","legendAlign","legend","legendColor","barEl","barContainer","legendEl","holderEl","buttonTick","buttonCross","sizePx","containEl","switchEl","onValue","offValue","state","onTruthy","flexDirection","onColor","background","offColor","borderRadius","clickable","relativeToPage","page","getPageSize","getPage","innerText","formatterFunc","formatterLookup","array$2","valueMap","json$1","multiline","replacer","defaultFormatters","array","Format","formatValue","formatHeader","lookupTypeFormatter","formatterPrint","print","formatterClipboard","formatterHtmlOutput","htmlOutput","formatters","mockCell","titleFormatter","titleFormatterParams","entityMap","FrozenColumns","leftColumns","rightColumns","initializationMode","layoutCell","reinitializeColumns","blockLayout","unblockLayout","margin","edge","frozenCheck","frozen","layoutCalcRows","layoutGroupCalcs","groupList","layoutColumnPosition","allCells","leftParents","marginValue","getColGroupParentElement","reinitializeRows","otherRows","getTableElement","getFrozenColumns","_calcSpace","FrozenRows","freezeRow","unfreezeRow","isRowFrozen","detachRow","frozenRows","initializeRows","rowType","isFrozen","styleRows","styleRow","GroupComponent","groupManager","getParentGroup","toggleVisibility","Group","oldGroup","hasSubGroups","groupIDLookups","_addRowToGroup","_addRow","old","elementContents","arrowElement","createElements","addBindings","createValueGroups","elementsOnly","arrow","movableRows","moveRow","initializeGroupHeader","allowedValues","_createGroup","toggleElement","groupToggleElement","groupID","groupKey","headerGenerator","insertRow","conformRowData","toIndex","updateGroupRows","scrollHeader","getRowIndex","removeRow","groupValues","removeGroup","generateGroupHeaderContents","getHeadersAndRows","_visSet","groupClosedShowCalcs","prev","includeChildren","getPath","childNodes","GroupRows","displayHandler","setGroupBy","setGroupValues","setGroupStartOpen","setGroupHeader","userGetGroups","userGetGroupedData","rowGetGroup","_blockRedrawing","_restore_redrawing","groupUpdateOnCellEdit","cellUpdated","reassignRowToGroup","configureGroupSetup","scrollHeaders","rowMoving","rowAddingIndex","rowSample","virtualRenderFill","groupStartOpen","langValue","lang","items","cols","getRealColumns","lookupFunc","prevValue","tableElement","assignRowToGroup","moveRowInArray","getGroupedData","toGroup","fromGroup","generateGroups","groupComponents","pullGroupListData","groupListData","rowCount","headerContent","countGroups","oldGroups","createGroup","assignRowToExistingGroup","newGroupNeeded","oldRowGroup","oldGroupPath","newGroupPath","getExpectedPath","samePath","every","groupPath","groupId","checkBasicModeGroupHeaderWidth","onlyGroupHeaders","defaultUndoers","cellEdit","rowAdd","checkPlaceholder","addRowActual","_rebindRow","rowMove","posFrom","posTo","getRowFromPosition","regenerateRowPositions","reRenderInPosition","defaultRedoers","bindings$1","undo","redo","actions$1","history","extensions$3","History","clearComponentHistory","rowDeleted","rowAdded","rowMoved","getHistoryUndoSize","getHistoryRedoSize","undoers","redoers","oldRow","HtmlTableImport","fieldIndex","hasIndex","tableElementCheck","originalElement","parseTable","_extractOptions","_extractHeaders","_generateBlankHeaders","defaultOptions","attributes","optionsArr","attrib","_attribValue","_findCol","exists","textContent","replaceAll","registeredDefaults","inQuote","nextChar","array$1","workbook2","read","sheet_to_json","defaultImporters","Import","importFromFile","importFormat","loadDataCheck","loadData","importData","lookupImporter","structureData","err","importer","importers","extension","importReader","pickFile","validateData","alertError","extensions","accept","file","files","reader","FileReader","validateFile","readAsArrayBuffer","readAsBinaryString","readAsDataURL","readAsText","onload","onerror","alertLoader","parsedData","autoColumns","structureArrayToObject","structureArrayToColumns","transformHeader","importHeaderTransform","transformData","importValueTransform","importFileValidator","importDataValidator","Interaction","eventMap","rowClick","rowDblClick","rowContext","rowMouseEnter","rowMouseLeave","rowMouseOver","rowMouseOut","rowMouseMove","rowMouseDown","rowMouseUp","rowTap","rowDblTap","rowTapHold","cellDblClick","cellContext","cellMouseEnter","cellMouseLeave","cellMouseOver","cellMouseOut","cellMouseMove","cellMouseDown","cellMouseUp","cellTap","cellDblTap","cellTapHold","headerClick","headerDblClick","headerContext","headerMouseEnter","headerMouseLeave","headerMouseOver","headerMouseOut","headerMouseMove","headerMouseDown","headerMouseUp","headerTap","headerDblTap","headerTapHold","groupClick","groupDblClick","groupContext","groupMouseEnter","groupMouseLeave","groupMouseOver","groupMouseOut","groupMouseMove","groupMouseDown","groupMouseUp","groupTap","groupDblTap","groupTapHold","subscribers","touchSubscribers","columnSubscribers","touchWatchers","tap","tapDbl","tapHold","initializeExternalEvents","cellContentsSelectionFixer","clearTouchWatchers","types","selectNode","subscriptionChanged","added","subscribeTouchEvents","unsubscribeTouchEvents","handleTouch","noTouch","dispatchEvent","watchers","componentObj","defaultBindings","navPrev","navNext","navUp","navDown","navLeft","navRight","scrollPageUp","scrollPageDown","scrollToStart","scrollToEnd","defaultActions","keyBlock","newPos","displayRowsCount","scrollMax","Keybindings","watchKeys","pressedKeys","keyupBinding","keydownBinding","mergedBindings","mapBindings","bindEvents","clearBindings","binding","bindingList","mapBinding","symbolsList","ctrl","meta","symbols","code","checkBinding","Menu","nestedMenuBlock","currentComponent","rootPopup","initializeRowWatchers","initializeGroupWatchers","rowContextMenu","loadMenuEvent","on","rowClickMenu","rowDblClickMenu","groupContextMenu","groupClickMenu","groupDblClickMenu","headerContextMenu","loadMenuTableColumnEvent","headerClickMenu","headerDblClickMenu","headerMenu","initializeColumnHeaderMenu","contextMenu","loadMenuTableCellEvent","clickMenu","dblClickMenu","icon","headerMenuIcon","headerMenuEl","menu","loadMenu","parentPopup","itemEl","disabled","MoveColumns","placeholderElement","createPlaceholderElement","hoverElement","checkTimeout","checkPeriod","moving","toCol","toColAfter","startX","autoScrollMargin","autoScrollStep","autoScrollTimeout","touchMove","moveHover","endMove","movableColumns","abortMove","colEl","mousemove","which","startMove","bindTouchEvents","startXMove","nextColWidth","prevColWidth","nextColWidthLast","prevColWidthLast","passive","moveToCol","selectRange","columnSelection","mousedown","selecting","_bindMouseMove","_unbindMouseMove","movingCells","moveColumnActual","columnHolder","xPos","scrollPos","defaultSenders","fromRow","toTable","defaultReceivers","fromTable","MoveRows","toRowAfter","hasHandle","startY","tableRowDropEvent","connection","connectionSelectorsTables","connectionSelectorsElements","connectionElements","connections","connectedTable","connectedRow","movableRowsConnectedTables","movableRowsConnectedElements","initializeCell","mouseup","tableRowDrop","previousSibling","rowHandle","startYMove","nextRowHeight","prevRowHeight","nextRowHeightLast","prevRowHeightLast","setStartPosition","connectToTables","pointerEvents","disconnectFromTables","moveHoverConnections","moveHoverTable","rowHolder","yPos","elementRowDrop","connectionTables","query","querySelectorAll","dropEvent","tabulatorElementDropEvent","connect","disconnect","dropComplete","sender","movableRowsSender","senders","movableRowsReceiver","receivers","defaultMutators","Mutator","enabled","transformCell","mutateLink","lookupMutator","mutators","mutatorEdit","links","linkCell","pageSize","currentRow","currentPage","totalRows","totalPages","showingEl","valueEl","ofEl","totalEl","rowsEl","pages","defaultPageCounters","Page","progressiveLoad","pageCounterElement","pageCounter","remoteRowCountEstimate","initialLoad","dataChanging","pageSizes","setMaxPage","setPage","userSetPageToRow","userSetPageSize","previousPage","nextPage","getPageMax","setPageToRow","initialLoadComplete","calculatePageSizes","footerRedraw","paginationAddRow","rowAddingPosition","paginationMode","remotePageParams","_parseRemoteData","restOnRenderBefore","initializePageCounter","initializePaginator","initializeProgressive","scrollVertical","testElRow","testElCell","paginationSize","visibility","generatePageSizeSelectList","setPageSize","dir","loading","progressiveLoadScrollMargin","pagesElement","firstBut","prevBut","nextBut","lastBut","paginationSizeSelector","pageSizeSelect","counter","paginationCounter","pageCounters","hidden","pageSelectLabel","paginationCounterHolder","paginationElement","paginationCounterElement","paginationInitialPage","paginationButtonCount","setMaxRows","trigger","_setPageCounter","_setPageButtons","leftSize","rightSize","_generatePageButton","actualRowPageSize","start","end","actualStartRow","actualRows","finally","paginationOutOfRange","last_page","last_row","addRows","progressiveLoadDelay","footer","containerElement","scrollWidth","defaultReaders","local","id","localStorage","getItem","cookie","cookiePos","defaultWriters","setItem","expireDate","setDate","getDate","toUTCString","Persistence","defWatcherBlock","readFunc","writeFunc","localStorageTest","testKey","removeItem","persistence","persistenceMode","persistenceID","retrievedData","persistenceReaderFunc","readers","persistenceWriterFunc","writers","retrieveData","save","eventSave","getColumnLayout","setColumnLayout","sorters","initialSort","parseColumns","setColumns","mergeDefinition","getOwnPropertyDescriptor","defineProperty","set","current","oldCols","newCols","mergeAllNew","_findColumn","validateSorters","getSort","getGroupConfig","getPageConfig","definitions","excludedKeys","defStore","colDef","_componentPopupCall","loadPopupEvent","rowContextPopup","rowClickPopup","rowDblClickPopup","groupContextPopup","groupClickPopup","groupDblClickPopup","headerContextPopup","loadPopupTableColumnEvent","headerClickPopup","headerDblClickPopup","headerPopup","initializeColumnHeaderPopup","contextPopup","loadPopupTableCellEvent","clickPopup","dblClickPopup","headerPopupIcon","headerPopupEl","loadPopup","contentsEl","Print","manualBlock","beforeprintEventHandler","afterprintEventHandler","printAsHtml","replaceTable","cleanup","destroy","printFullscreen","printConfig","printStyled","printRowRange","scrollX","scrollY","footerEl","tableEl","footerContent","printHeader","printFooter","printFormatter","ReactiveData","origFuncs","currentVersion","reactiveData","unblock","watchRow","watchData","unwatchData","version","enumerable","configurable","arg","apply","getRowFromDataObject","pop","newRows","startRow","reverse","oldRows","writable","watchKey","watchTreeChildren","childField","rebuildTree","unwatchRow","ResizeColumns","startColumn","startWidth","latestX","initialNextColumn","layoutColumnHeader","initializeEventWatchers","layoutCellHandles","deInitializeComponent","resizeHandle","columnLayoutUpdated","deInitializeColumn","columnWidthUpdated","resizable","reinitializeColumn","frozenColumnOffset","frozenOffset","handleEl","nearestColumn","_checkResizability","handleDown","_mouseDown","oldWidth","parentElement","clientX","startDiff","moveDiff","blockedBefore","blockedAfter","resizableColumnFit","colWidth","browserSlow","calcGuidePosition","mouseX","handleX","tableX","columnX","mouseDiff","guideEl","resizableColumnGuide","mouseMove","mouseUp","ResizeRows","startHeight","prevHandle","prevHandleDown","screenY","mouseY","handleY","tableY","rowY","resizableRowGuide","ResizeTable","visibilityObserver","resizeObserver","containerObserver","tableHeight","tableWidth","containerHeight","containerWidth","autoResize","initialRedraw","tableStyle","IntersectionObserver","ResizeObserver","initializeVisibilityObserver","entry","browserMobile","nodeHeight","contentRect","nodeWidth","redrawTable","observe","fixedHeight","tableResized","isIntersecting","unobserve","responsiveCollapse","responsiveLayout","toggleList","isOpen","extensions$2","ResponsiveLayout","hiddenColumns","collapseFormatter","collapseStartOpen","collapseHandleColumn","updateColumnVisibility","initializeResponsivity","generateCollapsedRowContent","responsiveLayoutCollapseFormatter","formatCollapsedData","responsiveLayoutCollapseStartOpen","responsive","order","generateCollapsedContent","hideColumn","colCount","showColumn","working","getFlexBaseWidth","headerVisible","activeRowsCount","renderEmptyScroll","generateCollapsedRowData","mockCellComponent","responsiveLayoutCollapseUseFormatters","titleData","valueData","node_content","titleHighlight","rowSelection","checkbox","selectableRowsRangeMode","toggleSelect","handleComplexRowClick","isSelected","registerRowSelectCheckbox","deselectRow","registerHeaderSelectCheckbox","extensions$1","SelectRow","lastClickedRow","selectPrev","headerCheckboxElement","selectRows","deselectRows","getSelectedRows","getSelectedData","isRowSelected","selectableRows","selectableRange","clearSelectionData","rowRetrieve","selectableRowsPersistence","_deselectRow","prevSelected","_rowSelectionChanged","selectable","checkRowSelectability","endSelect","_clearSelection","lastClickedRowIdx","getDisplayRowIndex","rowIdx","fromRowIdx","toRowIdx","toggledRows","toggledRow","selectableRowsCheck","_selectRow","changes","rowMatch","change","rowInfo","selectableRowsRollingSelection","checkboxEl","dataTreeSelectPropagate","childRowSelection","selectedRow","deselected","RangeComponent","_range","getStructuredCells","getBounds","getTopEdge","getBottomEdge","getLeftEdge","getRightEdge","setBounds","destroyedGuard","setStartBound","setEndBound","rangeManager","clearValues","Range","initializing","initElement","initBounds","_updateMinMax","setStart","setEnd","rowsCount","_getTableRows","_getTableColumns","_vDomTop","vDomTop","_vDomBottom","vDomBottom","_vDomLeft","leftCol","_vDomRight","rightCol","topLeftCell","bottomRightCell","topLeftCellEl","bottomRightCellEl","topLeftRowEl","bottomRightRowEl","Infinity","overlaps","atTopLeft","atBottomRight","occupies","occupiesRow","occupiesColumn","structured","arr","clearValue","selectableRangeClearCellsValue","notify","rangeRemoved","rangeJumpUp","rangeJumpDown","rangeJumpLeft","rangeJumpRight","rangeExpandUp","rangeExpandDown","rangeExpandLeft","rangeExpandRight","rangeExpandJumpUp","rangeExpandJumpDown","rangeExpandJumpLeft","rangeExpandJumpRight","activeRange","singleCell","bounds","startCell","rowWidth","dataLength","startCol","itemLength","selectedColumns","SelectRange","ranges","overlay","layoutChangeTimeout","maxRanges","blockKeydown","keyDownEvent","_handleKeyDown","mouseUpEvent","_handleMouseUp","getRangesData","getRanges","addRangeFromComponent","cellGetRanges","rowGetRanges","colGetRanges","initializeTable","initializeWatchers","rangeContainer","activeRangeCellElement","resetRanges","handleColumnMouseDown","handleColumnMouseMove","handleColumnResized","handleColumnMoving","handleColumnMoved","layoutChange","updateHeaderColumn","renderCell","handleCellMouseDown","handleCellMouseMove","handleCellClick","handleEditingCell","finishEditingCell","restoreFocus","keyNavigate","keyNavigateRange","headerSort","frozenCols","getActiveCell","initializeFocus","some","selectedColumn","_event","_to","_after","event","newSelection","rangeIdx","dataset","navigate","jump","expand","moved","rangeEdge","prevRect","rowRect","rowManagerRect","columnRect","columnManagerRect","findJumpCellLeft","findJumpCellRight","findJumpCellUp","findJumpCellDown","getTableColumns","getTableRows","getRowByRangePos","getColumnByRangePos","autoScroll","getRowHeaderWidth","removed","findJumpRow","emptyStart","emptySide","findJumpItem","findJumpCol","valueResolver","nextItem","currentItem","currentValue","rowPos","colPos","isStartingCellEmpty","isEmpty","isLeftOfStartingCellEmpty","targetCols","jumpCol","isRightOfStartingCellEmpty","isTopOfStartingCellEmpty","jumpRow","isBottomOfStartingCellEmpty","tableHolder","rect","withinHorizontalView","withinVerticalView","scrollbarWidth","layoutRanges","layoutColumn","occupied","activeCell","activeCellEl","activeRowEl","colIdx","visibleCells","aRow","bRow","alignEmptyValues","decimalSeparator","thousandSeparator","string","locale","localeCompare","boolean","el1","el2","calc","d","alphanum","defaultSorters","Sort","sortList","userSetSort","clearSort","sortMode","remoteSortParams","setSort","refreshSort","arrowEl","sorterParams","startingDir","headerSortStartingDir","headerSortTristate","headerSortClickElement","headerSortElement","setColumnHeaderSortIcon","columnHeaderSortMulti","newSortList","findSorter","sortOrderReverse","sortListActual","rowComponents","clearColumnHeaders","sortObj","setColumnHeader","_sortItems","sortEl","sorterCount","sortItem","_sortRow","el1Comp","el2Comp","GridCalculator","columnCount","columnString","genColumns","incrementChar","genRows","setRowCount","setColumnCount","SheetComponent","_sheet","getTitle","setTitle","setRows","Sheet","spreadsheetManager","isActive","grid","defaultColumnDefinition","columnDefinition","columnDefs","rowDefs","columnFields","initializeElement","initializeColumns","loadSheet","ref","refs","_id","unload","wasInactive","full","rowWidths","outputWidth","outputHeight","findLastIndex","removeSheet","Spreadsheet","setSheets","addSheet","getSheets","getSheetDefinitions","setSheetData","getSheet","getSheetData","clearSheet","removeSheetFunc","activeSheetFunc","loadRemoteData","spreadsheetData","compatibilityCheck","initializeTabset","altContainer","loadSheets","data1","data2","log","newSheet","destroySheets","activeSheet","prevSheet","lookupSheet","Tooltip","tooltipSubscriber","headerSubscriber","timeout","popupInstance","headerTooltip","mousemoveCheck","mouseoutCheck","tooltip","clearPopup","loadTooltip","tooltipDelay","defaultValidators","parameters","float","numeric","alphanumeric","reg","minLength","maxLength","cellData","required","Validate","invalidCells","getInvalidCells","userClearCellValidation","userValidate","cellIsValid","clearValidation","cellValidate","columnValidate","rowValidate","editValidate","editorClear","editedClear","previousValue","validate","cancelled","validator","_extractValidator","substring","_buildValidator","validators","failedValidators","invalidIndex","allModules","freeze","AccessorModule","AjaxModule","ClipboardModule","ColumnCalcsModule","DataTreeModule","DownloadModule","EditModule","ExportModule","FilterModule","FormatModule","FrozenColumnsModule","FrozenRowsModule","GroupRowsModule","HistoryModule","HtmlTableImportModule","ImportModule","InteractionModule","KeybindingsModule","MenuModule","MoveColumnsModule","MoveRowsModule","MutatorModule","PageModule","PersistenceModule","PopupModule","PrintModule","ReactiveDataModule","ResizeColumnsModule","ResizeRowsModule","ResizeTableModule","ResponsiveLayoutModule","SelectRangeModule","SelectRowModule","SortModule","SpreadsheetModule","TooltipModule","ValidateModule","debugEventsExternal","debugEventsInternal","debugInvalidOptions","debugInvalidComponentFuncs","debugInitialization","debugDeprecation","autoColumnsDefinitions","footerElement","textDirection","addRowPos","renderVertical","renderVerticalBuffer","scrollToRowPosition","scrollToRowIfVisible","scrollToColumnPosition","scrollToColumnIfVisible","rowFormatterPrint","rowFormatterClipboard","rowFormatterHtmlOutput","dataLoaderLoading","dataLoaderError","dataLoaderErrorTimeout","dataSendParams","dataReceiveParams","dependencies","OptionsList","msgType","userOptions","Renderer","elementVertical","elementHorizontal","verticalFillMode","clearRows","clearColumns","reinitializeColumnWidths","renderRows","renderColumns","rerenderRows","scrollColumns","scrollRows","scrollToRowNearestTop","includingBuffer","render","rerender","rowIndex","BasicHorizontal","rowFrag","VirtualDomHorizontal","vDomScrollPosLeft","vDomScrollPosRight","vDomPadRight","fitDataColAvg","windowBuffer","isFitData","layoutCheck","vertScrollListen","clearVisRowCache","dataChange","scroll","calcWindowBuffer","buffer","leftPos","rightPos","fitDataCheck","vdomHoz","reinitChanged","reinitializeRow","colEnd","addColRight","removeColLeft","addColLeft","removeColRight","colPositionAdjust","fitDataColActualWidthCheck","ex","message","newWidth","widthDiff","appendCell","ColumnManager","blockHozScrollEvent","columnsByField","redrawBlockUpdate","initializeRenderer","createHeadersElement","createHeaderContentsElement","createHeaderElement","initializeScrollWheelWatcher","padVerticalScrollbar","renderClass","renderers","virtual","basic","deltaX","generateColumnsFromRowData","collProgress","calculateSorterFromValue","_addColumn","_reIndexColumns","getComponents","nextToColumn","topColumn","parentIndex","nextEl","root","fieldRoot","getDefinitions","getDefinitionTree","_moveColumnInArray","updateRows","fromIndex","totalWidth","fixedWidth","resetScroll","BasicVertical","tableFrag","tableEmpty","rowTop","VirtualDomVertical","vDomRowHeight","vDomScrollPosTop","vDomScrollPosBottom","vDomTopPad","vDomBottomPad","vDomMaxRenderChain","vDomWindowBuffer","vDomWindowMinTotalRows","vDomWindowMinMarginRows","vDomTopNewRows","vDomBottomNewRows","paddingBottom","_virtualRenderFill","topOffset","topDiff","bottomDiff","_addTopRow","vDomScrollHeight","_removeBottomRow","_addBottomRow","_removeTopRow","topFound","bottomRow","forceMove","topPad","rowsHeight","heightOccupied","topPadHeight","rowFragment","renderedRows","totalRowsRendered","rowsToRender","avgRowHeight","resized","fillableSpace","addedRows","paddingAdjust","_quickNormalizeRowHeight","removableRows","RowManager","createHolderElement","createTableElement","heightFixer","placeholderContents","firstRender","renderMode","activeRowsPipeline","redrawBlockRestoreConfig","redrawBlockRenderInPosition","dataPipeline","initializePlaceholder","leftDir","topDir","_positionPlaceholder","_setDataActual","_wipeElements","allIndex","activeIndex","setActiveRows","displayRowIterator","displayIndex","refreshDisplayOnly","findAddRowPos","_clearPlaceholder","chainResult","clearData","findRowIndex","rowOnly","getDataCount","skipStage","stage","cascadeOrder","refreshPipelines","renderTable","layoutColumnsOnNewData","resetDisplayRows","setDisplayRows","scrollBarCheck","_clearTable","_showPlaceholder","initialHeight","otherHeight","external","createEvent","initEvent","Event","FooterManager","createContainerElement","activate","deactivate","InteractionManager","abortClasses","previousTargets","listeners","componentMap","pseudoTrackers","subscriber","pseudoTracking","buildListenerMap","bindSubscriptionWatchers","listenerMap","listener","components","bindPseudoEvents","pseudoMouseEnter","pseudoMouseLeave","leaveList","linkedKeys","comp","clearWatchers","updateEventListeners","track","composedPath","targets","findTargets","bindComponents","triggerEvents","abort","elTargets","targetMatches","previousTarget","closest","ComponentFunctionBinder","funcName","DataLoader","requestOrder","requestNo","mapParams","objectInvert","blockActiveLoad","shouldLoad","ExternalEventBus","debug","events","subscriptionNotifiers","_debugDispatch","_dispatch","_notifySubscriptionChange","notifiers","callResult","InternalEventBus","_debugChain","_chain","_debugConfirm","_confirm","fallback","confirmed","DeprecationAdvisor","_warnUser","DependencyRegistry","deps","lookupProp","lookupKey","dependency","fitData","forced","fitDataGeneral","fitDataStretch","colsWidth","gap","lastCol","fitColumns","flexWidth","flexGrowUnits","flexColWidth","flexColumns","fixedShrinkColumns","flexShrinkUnits","overflowWidth","gapFill","calcWidth","scaleColumns","freeSpace","shrinkCols","oversizeCols","oversizeSpace","remainingSpace","remainingFlexGrowUnits","changeUnits","undersizeCols","calcGrow","widthGrow","calcShrink","widthShrink","defaultModes","fitDataFill","fitDataTable","Layout","modes","dataChanged","defaultLangs","default","page_size","page_title","first","first_title","last","last_title","prev_title","next","next_title","showing","of","Localize","langList","langs","setHeaderFilterPlaceholder","installLang","setLocale","getLang","_setLangProp","desiredLocale","traverseLang","trans","language","_executeBindings","fillPath","pathArray","_getLangElement","rootPath","Comms","receive","selectors","registry","lookupTable","con","tableComms","coreModules","CommsModule","LayoutModule","LocalizeModule","TableRegistry","tables","deregister","matchElement","ModuleBinder","defaultModules","modulesRegistered","_registerModules","property","moduleBindings","source","core","mods","moduleCore","_registerModule","_registerModuleBinding","_registerModuleExtensions","moduleName","moduleExtensions","modKey","ext","propKey","_extendModule","_extendModuleFromQueue","_bindModules","orderedStartMods","orderedEndMods","unOrderedMods","modulesCore","moduleInitOrder","modulesRegular","Alert","_createAlertElement","msgElement","_createMsgElement","_typeClass","Tabulator","initializeModuleBinder","interactionMonitor","initializeCoreSystems","_create","_clearObjectPointers","_mapDeprecatedFunctionality","_rtlCheck","_buildElement","_initializeTable","_loadInitialData","direction","newElement","_detectBrowser","ua","userAgent","vendor","opera","stack","line","Error","replaceData","responses","foundRows","updateOrAddRow","updateRow","getRowPosition","getColumnDefinitions","toggleColumn","deleteColumn","updateColumnDefinition","fromColumn","off","plugin","Tabulator$1","TabulatorFull","TabulatorFull$1","ca","esca","pe","m","escape","es","ColumnDefinitionFactory","pool","horizontalAlign","headerComponent","_a","createFormatter","aggregator","getColumnAggregator","customElement","propsFactory","setElementProperties","formatCell","columnElementExists","createCustomComponent","isNativeElement","customElementExists","customElements","createResizeObserver","properties","negate","isEventListener","getEventName","eventListener","RESIZE_TIMEOUT","COLUMN_PADDING","observer","createColumnSorter","isAggregatorFunction","ElementPool","isFree","usedElements","releaseAll","release","WeakMap","Selection","getDataByIndex","toggleRange","selectedItems","lowerBound","upperBound","updatedIndexes","updatedItems","lastToggledIndex","indexes","Set","toggleSelection","toggleSelectionFromLastIndex","LIMEL_CHECKBOX","getRowId","TableSelection","selectEvent","getTranslation","rowSelectorCellClick","ev","clickedRow","rowPosition","updateRowSelectors","emit","getRowData","changeSet","getRowByIndex","updateRowSelector","checkBox","getActiveRows","hasSelection","setSelection","newItems","oldItem","columnDefinitions","getRowSelectorColumnDefinition","getRowSelectorFormatter","mapLayout","layouts","stretchLastColumn","stretchColumns","lowDensity","areRowsEqual","newData","oldData","newItem","isEqual","tableCss","FIRST_PAGE","Table","hostRef","shouldSort","tabulator","getActiveRowsData","selectAllOnChange","selectAll","detail","tableSelection","getColumnOptions","handleMoveColumn","_","Boolean","changeColumns","translate","handleDataSorting","handlePageLoaded","handleRenderComplete","handleAjaxRequesting","onClickRow","formatRow","formatRows","updateMaxPage","initTabulatorComponent","addColumnAggregator","columnFactory","componentWillLoad","initTableSelection","componentDidLoad","init","disconnectedCallback","totalRowsChanged","pageSizeChanged","pageChanged","activeRowChanged","newIds","getRowIds","oldIds","shouldReplace","shouldReplaceData","hasRowUpdates","updateColumns","newColumns","oldColumns","areSameColumns","columnsInTable","oldColumnsInTable","updateAggregates","newAggregates","oldAggregates","haveSameAggregateFields","updateSelection","updateSelectable","updateSortableColumns","updateSorting","newSorting","getColumnSorter","oldSorting","areEqualIds","isSameOrder","newIdSet","oldIdSet","oldAggregateFields","host","shadowRoot","createTabulator","requestAnimationFrame","_b","getOptions","isRemoteMode","calculatePageCount","ajaxOptions","getAjaxOptions","paginationOptions","getPaginationOptions","columnOptions","getInitialSorting","currentSorting","sorting","toLocaleLowerCase","columnSortable","sortableColumns","aggregates","aggregate","remoteUrl","ajaxSorting","__","changePage","columnSorters","resolveExistingData","currentLoad","defaultPrevented","isActiveRow","activeRow","interactiveFeedbackElement","ownerDocument","activeRowId","total","hasAggregation","h","Host","class","paginationLocation","renderEmptyMessage","renderSelectAll","showSelectAll","_c","showEmptyMessage","emptyMessage"],"sources":["./node_modules/lodash-es/_baseHas.js","./node_modules/lodash-es/has.js","./node_modules/lodash-es/_baseSet.js","./node_modules/lodash-es/_basePickBy.js","./node_modules/lodash-es/pickBy.js","./node_modules/tabulator-tables/dist/js/tabulator_esm.mjs","./node_modules/html-escaper/esm/index.js","./src/components/table/columns.ts","./src/components/table/element-pool.ts","./src/components/table/selection.ts","./src/components/table/table-selection.ts","./src/components/table/layout.ts","./src/components/table/utils.ts","./src/components/table/table.scss?tag=limel-table&encapsulation=shadow","./src/components/table/table.tsx"],"sourcesContent":["/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\n}\n\nexport default baseHas;\n","import baseHas from './_baseHas.js';\nimport hasPath from './_hasPath.js';\n\n/**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\nfunction has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n}\n\nexport default has;\n","import assignValue from './_assignValue.js';\nimport castPath from './_castPath.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\nimport toKey from './_toKey.js';\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n return object;\n }\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n}\n\nexport default baseSet;\n","import baseGet from './_baseGet.js';\nimport baseSet from './_baseSet.js';\nimport castPath from './_castPath.js';\n\n/**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\nfunction basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n}\n\nexport default basePickBy;\n","import arrayMap from './_arrayMap.js';\nimport baseIteratee from './_baseIteratee.js';\nimport basePickBy from './_basePickBy.js';\nimport getAllKeysIn from './_getAllKeysIn.js';\n\n/**\n * Creates an object composed of the `object` properties `predicate` returns\n * truthy for. The predicate is invoked with two arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pickBy(object, _.isNumber);\n * // => { 'a': 1, 'c': 3 }\n */\nfunction pickBy(object, predicate) {\n if (object == null) {\n return {};\n }\n var props = arrayMap(getAllKeysIn(object), function(prop) {\n return [prop];\n });\n predicate = baseIteratee(predicate);\n return basePickBy(object, props, function(value, path) {\n return predicate(value, path[0]);\n });\n}\n\nexport default pickBy;\n","/* Tabulator v6.3.1 (c) Oliver Folkerd 2025 */\nclass CoreFeature{\n\n\tconstructor(table){\n\t\tthis.table = table;\n\t}\n\n\t//////////////////////////////////////////\n\t/////////////// DataLoad /////////////////\n\t//////////////////////////////////////////\n\n\treloadData(data, silent, columnsChanged){\n\t\treturn this.table.dataLoader.load(data, undefined, undefined, undefined, silent, columnsChanged);\n\t}\n\n\t//////////////////////////////////////////\n\t///////////// Localization ///////////////\n\t//////////////////////////////////////////\n\n\tlangText(){\n\t\treturn this.table.modules.localize.getText(...arguments);\n\t}\n\n\tlangBind(){\n\t\treturn this.table.modules.localize.bind(...arguments);\n\t}\n\n\tlangLocale(){\n\t\treturn this.table.modules.localize.getLocale(...arguments);\n\t}\n\n\n\t//////////////////////////////////////////\n\t////////// Inter Table Comms /////////////\n\t//////////////////////////////////////////\n\n\tcommsConnections(){\n\t\treturn this.table.modules.comms.getConnections(...arguments);\n\t}\n\n\tcommsSend(){\n\t\treturn this.table.modules.comms.send(...arguments);\n\t}\n\n\t//////////////////////////////////////////\n\t//////////////// Layout /////////////////\n\t//////////////////////////////////////////\n\n\tlayoutMode(){\n\t\treturn this.table.modules.layout.getMode();\n\t}\n\n\tlayoutRefresh(force){\n\t\treturn this.table.modules.layout.layout(force);\n\t}\n\n\n\t//////////////////////////////////////////\n\t/////////////// Event Bus ////////////////\n\t//////////////////////////////////////////\n\n\tsubscribe(){\n\t\treturn this.table.eventBus.subscribe(...arguments);\n\t}\n\n\tunsubscribe(){\n\t\treturn this.table.eventBus.unsubscribe(...arguments);\n\t}\n\n\tsubscribed(key){\n\t\treturn this.table.eventBus.subscribed(key);\n\t}\n\n\tsubscriptionChange(){\n\t\treturn this.table.eventBus.subscriptionChange(...arguments);\n\t}\n\n\tdispatch(){\n\t\treturn this.table.eventBus.dispatch(...arguments);\n\t}\n\n\tchain(){\n\t\treturn this.table.eventBus.chain(...arguments);\n\t}\n\n\tconfirm(){\n\t\treturn this.table.eventBus.confirm(...arguments);\n\t}\n\n\tdispatchExternal(){\n\t\treturn this.table.externalEvents.dispatch(...arguments);\n\t}\n\n\tsubscribedExternal(key){\n\t\treturn this.table.externalEvents.subscribed(key);\n\t}\n\n\tsubscriptionChangeExternal(){\n\t\treturn this.table.externalEvents.subscriptionChange(...arguments);\n\t}\n\n\t//////////////////////////////////////////\n\t//////////////// Options /////////////////\n\t//////////////////////////////////////////\n\n\toptions(key){\n\t\treturn this.table.options[key];\n\t}\n\n\tsetOption(key, value){\n\t\tif(typeof value !== \"undefined\"){\n\t\t\tthis.table.options[key] = value;\n\t\t}\n\n\t\treturn this.table.options[key];\n\t}\n\n\t//////////////////////////////////////////\n\t/////////// Deprecation Checks ///////////\n\t//////////////////////////////////////////\n\n\tdeprecationCheck(oldOption, newOption, convert){\n\t\treturn this.table.deprecationAdvisor.check(oldOption, newOption, convert);\n\t}\n\n\tdeprecationCheckMsg(oldOption, msg){\n\t\treturn this.table.deprecationAdvisor.checkMsg(oldOption, msg);\n\t}\n\n\tdeprecationMsg(msg){\n\t\treturn this.table.deprecationAdvisor.msg(msg);\n\t}\n\t//////////////////////////////////////////\n\t//////////////// Modules /////////////////\n\t//////////////////////////////////////////\n\n\tmodule(key){\n\t\treturn this.table.module(key);\n\t}\n}\n\nclass Helpers{\n\n\tstatic elVisible(el){\n\t\treturn !(el.offsetWidth <= 0 && el.offsetHeight <= 0);\n\t}\n\n\tstatic elOffset(el){\n\t\tvar box = el.getBoundingClientRect();\n\n\t\treturn {\n\t\t\ttop: box.top + window.pageYOffset - document.documentElement.clientTop,\n\t\t\tleft: box.left + window.pageXOffset - document.documentElement.clientLeft\n\t\t};\n\t}\n\n\tstatic retrieveNestedData(separator, field, data){\n\t\tvar structure = separator ? field.split(separator) : [field],\n\t\tlength = structure.length,\n\t\toutput;\n\n\t\tfor(let i = 0; i < length; i++){\n\n\t\t\tdata = data[structure[i]];\n\n\t\t\toutput = data;\n\n\t\t\tif(!data){\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn output;\n\t}\n\n\tstatic deepClone(obj, clone, list = []){\n\t\tvar objectProto = {}.__proto__,\n\t\tarrayProto = [].__proto__;\n\n\t\tif (!clone){\n\t\t\tclone = Object.assign(Array.isArray(obj) ? [] : {}, obj);\n\t\t}\n\n\t\tfor(var i in obj) {\n\t\t\tlet subject = obj[i],\n\t\t\tmatch, copy;\n\n\t\t\tif(subject != null && typeof subject === \"object\" && (subject.__proto__ === objectProto || subject.__proto__ === arrayProto)){\n\t\t\t\tmatch = list.findIndex((item) => {\n\t\t\t\t\treturn item.subject === subject;\n\t\t\t\t});\n\n\t\t\t\tif(match > -1){\n\t\t\t\t\tclone[i] = list[match].copy;\n\t\t\t\t}else {\n\t\t\t\t\tcopy = Object.assign(Array.isArray(subject) ? [] : {}, subject);\n\n\t\t\t\t\tlist.unshift({subject, copy});\n\n\t\t\t\t\tclone[i] = this.deepClone(subject, copy, list);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn clone;\n\t}\n}\n\nlet Popup$1 = class Popup extends CoreFeature{\n\tconstructor(table, element, parent){\n\t\tsuper(table);\n\t\t\n\t\tthis.element = element;\n\t\tthis.container = this._lookupContainer();\n\t\t\n\t\tthis.parent = parent;\n\t\t\n\t\tthis.reversedX = false;\n\t\tthis.childPopup = null;\n\t\tthis.blurable = false;\n\t\tthis.blurCallback = null;\n\t\tthis.blurEventsBound = false;\n\t\tthis.renderedCallback = null;\n\t\t\n\t\tthis.visible = false;\n\t\tthis.hideable = true;\n\t\t\n\t\tthis.element.classList.add(\"tabulator-popup-container\");\n\t\t\n\t\tthis.blurEvent = this.hide.bind(this, false);\n\t\tthis.escEvent = this._escapeCheck.bind(this);\n\t\t\n\t\tthis.destroyBinding = this.tableDestroyed.bind(this);\n\t\tthis.destroyed = false;\n\t}\n\t\n\ttableDestroyed(){\n\t\tthis.destroyed = true;\n\t\tthis.hide(true);\n\t}\n\t\n\t_lookupContainer(){\n\t\tvar container = this.table.options.popupContainer;\n\t\t\n\t\tif(typeof container === \"string\"){\n\t\t\tcontainer = document.querySelector(container);\n\t\t\t\n\t\t\tif(!container){\n\t\t\t\tconsole.warn(\"Menu Error - no container element found matching selector:\", this.table.options.popupContainer , \"(defaulting to document body)\");\n\t\t\t}\n\t\t}else if (container === true){\n\t\t\tcontainer = this.table.element;\n\t\t}\n\t\t\n\t\tif(container && !this._checkContainerIsParent(container)){\n\t\t\tcontainer = false;\n\t\t\tconsole.warn(\"Menu Error - container element does not contain this table:\", this.table.options.popupContainer , \"(defaulting to document body)\");\n\t\t}\n\t\t\n\t\tif(!container){\n\t\t\tcontainer = document.body;\n\t\t}\n\t\t\n\t\treturn container;\n\t}\n\t\n\t_checkContainerIsParent(container, element = this.table.element){\n\t\tif(container === element){\n\t\t\treturn true;\n\t\t}else {\n\t\t\treturn element.parentNode ? this._checkContainerIsParent(container, element.parentNode) : false;\n\t\t}\n\t}\n\t\n\trenderCallback(callback){\n\t\tthis.renderedCallback = callback;\n\t}\n\t\n\tcontainerEventCoords(e){\n\t\tvar touch = !(e instanceof MouseEvent);\n\t\t\n\t\tvar x = touch ? e.touches[0].pageX : e.pageX;\n\t\tvar y = touch ? e.touches[0].pageY : e.pageY;\n\t\t\n\t\tif(this.container !== document.body){\n\t\t\tlet parentOffset = Helpers.elOffset(this.container);\n\t\t\t\n\t\t\tx -= parentOffset.left;\n\t\t\ty -= parentOffset.top;\n\t\t}\n\t\t\n\t\treturn {x, y};\n\t}\n\t\n\telementPositionCoords(element, position = \"right\"){\n\t\tvar offset = Helpers.elOffset(element),\n\t\tcontainerOffset, x, y;\n\t\t\n\t\tif(this.container !== document.body){\n\t\t\tcontainerOffset = Helpers.elOffset(this.container);\n\t\t\t\n\t\t\toffset.left -= containerOffset.left;\n\t\t\toffset.top -= containerOffset.top;\n\t\t}\n\t\t\n\t\tswitch(position){\n\t\t\tcase \"right\":\n\t\t\t\tx = offset.left + element.offsetWidth;\n\t\t\t\ty = offset.top - 1;\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase \"bottom\":\n\t\t\t\tx = offset.left;\n\t\t\t\ty = offset.top + element.offsetHeight;\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase \"left\":\n\t\t\t\tx = offset.left;\n\t\t\t\ty = offset.top - 1;\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase \"top\":\n\t\t\t\tx = offset.left;\n\t\t\t\ty = offset.top;\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase \"center\":\n\t\t\t\tx = offset.left + (element.offsetWidth / 2);\n\t\t\t\ty = offset.top + (element.offsetHeight / 2);\n\t\t\t\tbreak;\n\t\t\t\n\t\t}\n\t\t\n\t\treturn {x, y, offset};\n\t}\n\t\n\tshow(origin, position){\n\t\tvar x, y, parentEl, parentOffset, coords;\n\t\t\n\t\tif(this.destroyed || this.table.destroyed){\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\tif(origin instanceof HTMLElement){\n\t\t\tparentEl = origin;\n\t\t\tcoords = this.elementPositionCoords(origin, position);\n\t\t\t\n\t\t\tparentOffset = coords.offset;\n\t\t\tx = coords.x;\n\t\t\ty = coords.y;\n\t\t\t\n\t\t}else if(typeof origin === \"number\"){\n\t\t\tparentOffset = {top:0, left:0};\n\t\t\tx = origin;\n\t\t\ty = position;\n\t\t}else {\n\t\t\tcoords = this.containerEventCoords(origin);\n\t\t\t\n\t\t\tx = coords.x;\n\t\t\ty = coords.y;\n\t\t\t\n\t\t\tthis.reversedX = false;\n\t\t}\n\t\t\n\t\tthis.element.style.top = y + \"px\";\n\t\tthis.element.style.left = x + \"px\";\n\t\t\n\t\tthis.container.appendChild(this.element);\n\t\t\n\t\tif(typeof this.renderedCallback === \"function\"){\n\t\t\tthis.renderedCallback();\n\t\t}\n\t\t\n\t\tthis._fitToScreen(x, y, parentEl, parentOffset, position);\n\t\t\n\t\tthis.visible = true;\n\t\t\n\t\tthis.subscribe(\"table-destroy\", this.destroyBinding);\n\t\t\n\t\tthis.element.addEventListener(\"mousedown\", (e) => {\n\t\t\te.stopPropagation();\n\t\t});\n\t\t\n\t\treturn this;\n\t}\n\t\n\t_fitToScreen(x, y, parentEl, parentOffset, position){\n\t\tvar scrollTop = this.container === document.body ? document.documentElement.scrollTop : this.container.scrollTop;\n\t\t\n\t\t//move menu to start on right edge if it is too close to the edge of the screen\n\t\tif((x + this.element.offsetWidth) >= this.container.offsetWidth || this.reversedX){\n\t\t\tthis.element.style.left = \"\";\n\t\t\t\n\t\t\tif(parentEl){\n\t\t\t\tthis.element.style.right = (this.container.offsetWidth - parentOffset.left) + \"px\";\n\t\t\t}else {\n\t\t\t\tthis.element.style.right = (this.container.offsetWidth - x) + \"px\";\n\t\t\t}\n\t\t\t\n\t\t\tthis.reversedX = true;\n\t\t}\n\t\t\n\t\t//move menu to start on bottom edge if it is too close to the edge of the screen\n\t\tlet offsetHeight = Math.max(this.container.offsetHeight, scrollTop ? this.container.scrollHeight : 0);\n\t\tif((y + this.element.offsetHeight) > offsetHeight) {\n\t\t\tif(parentEl){\n\t\t\t\tswitch(position){\n\t\t\t\t\tcase \"bottom\":\n\t\t\t\t\t\tthis.element.style.top = (parseInt(this.element.style.top) - this.element.offsetHeight - parentEl.offsetHeight - 1) + \"px\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthis.element.style.top = (parseInt(this.element.style.top) - this.element.offsetHeight + parentEl.offsetHeight + 1) + \"px\";\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}else {\n\t\t\t\tthis.element.style.height = offsetHeight + \"px\";\n\t\t\t}\n\t\t}\n\t}\n\t\n\tisVisible(){\n\t\treturn this.visible;\n\t}\n\t\n\thideOnBlur(callback){\n\t\tthis.blurable = true;\n\t\t\n\t\tif(this.visible){\n\t\t\tsetTimeout(() => {\n\t\t\t\tif(this.visible){\n\t\t\t\t\tthis.table.rowManager.element.addEventListener(\"scroll\", this.blurEvent);\n\t\t\t\t\tthis.subscribe(\"cell-editing\", this.blurEvent);\n\t\t\t\t\tdocument.body.addEventListener(\"click\", this.blurEvent);\n\t\t\t\t\tdocument.body.addEventListener(\"contextmenu\", this.blurEvent);\n\t\t\t\t\tdocument.body.addEventListener(\"mousedown\", this.blurEvent);\n\t\t\t\t\twindow.addEventListener(\"resize\", this.blurEvent);\n\t\t\t\t\tdocument.body.addEventListener(\"keydown\", this.escEvent);\n\n\t\t\t\t\tthis.blurEventsBound = true;\n\t\t\t\t}\n\t\t\t}, 100);\n\t\t\t\n\t\t\tthis.blurCallback = callback;\n\t\t}\n\t\t\n\t\treturn this;\n\t}\n\t\n\t_escapeCheck(e){\n\t\tif(e.keyCode == 27){\n\t\t\tthis.hide();\n\t\t}\n\t}\n\t\n\tblockHide(){\n\t\tthis.hideable = false;\n\t}\n\t\n\trestoreHide(){\n\t\tthis.hideable = true;\n\t}\n\t\n\thide(silent = false){\n\t\tif(this.visible && this.hideable){\n\t\t\tif(this.blurable && this.blurEventsBound){\n\t\t\t\tdocument.body.removeEventListener(\"keydown\", this.escEvent);\n\t\t\t\tdocument.body.removeEventListener(\"click\", this.blurEvent);\n\t\t\t\tdocument.body.removeEventListener(\"contextmenu\", this.blurEvent);\n\t\t\t\tdocument.body.removeEventListener(\"mousedown\", this.blurEvent);\n\t\t\t\twindow.removeEventListener(\"resize\", this.blurEvent);\n\t\t\t\tthis.table.rowManager.element.removeEventListener(\"scroll\", this.blurEvent);\n\t\t\t\tthis.unsubscribe(\"cell-editing\", this.blurEvent);\n\n\t\t\t\tthis.blurEventsBound = false;\n\t\t\t}\n\t\t\t\n\t\t\tif(this.childPopup){\n\t\t\t\tthis.childPopup.hide();\n\t\t\t}\n\t\t\t\n\t\t\tif(this.parent){\n\t\t\t\tthis.parent.childPopup = null;\n\t\t\t}\n\t\t\t\n\t\t\tif(this.element.parentNode){\n\t\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t\t}\n\t\t\t\n\t\t\tthis.visible = false;\n\t\t\t\n\t\t\tif(this.blurCallback && !silent){\n\t\t\t\tthis.blurCallback();\n\t\t\t}\n\t\t\t\n\t\t\tthis.unsubscribe(\"table-destroy\", this.destroyBinding);\n\t\t}\n\t\t\n\t\treturn this;\n\t}\n\t\n\tchild(element){\n\t\tif(this.childPopup){\n\t\t\tthis.childPopup.hide();\n\t\t}\n\t\t\n\t\tthis.childPopup = new Popup(this.table, element, this);\n\t\t\n\t\treturn this.childPopup;\n\t}\n};\n\nclass Module extends CoreFeature{\n\t\n\tconstructor(table, name){\n\t\tsuper(table);\n\t\t\n\t\tthis._handler = null;\n\t}\n\t\n\tinitialize(){\n\t\t// setup module when table is initialized, to be overridden in module\n\t}\n\t\n\t\n\t///////////////////////////////////\n\t////// Options Registration ///////\n\t///////////////////////////////////\n\t\n\tregisterTableOption(key, value){\n\t\tthis.table.optionsList.register(key, value);\n\t}\n\t\n\tregisterColumnOption(key, value){\n\t\tthis.table.columnManager.optionsList.register(key, value);\n\t}\n\t\n\t///////////////////////////////////\n\t/// Public Function Registration ///\n\t///////////////////////////////////\n\t\n\tregisterTableFunction(name, func){\n\t\tif(typeof this.table[name] === \"undefined\"){\n\t\t\tthis.table[name] = (...args) => {\n\t\t\t\tthis.table.initGuard(name);\n\t\t\t\t\n\t\t\t\treturn func(...args);\n\t\t\t};\n\t\t}else {\n\t\t\tconsole.warn(\"Unable to bind table function, name already in use\", name);\n\t\t}\n\t}\n\t\n\tregisterComponentFunction(component, func, handler){\n\t\treturn this.table.componentFunctionBinder.bind(component, func, handler);\n\t}\n\t\n\t///////////////////////////////////\n\t////////// Data Pipeline //////////\n\t///////////////////////////////////\n\t\n\tregisterDataHandler(handler, priority){\n\t\tthis.table.rowManager.registerDataPipelineHandler(handler, priority);\n\t\tthis._handler = handler;\n\t}\n\t\n\tregisterDisplayHandler(handler, priority){\n\t\tthis.table.rowManager.registerDisplayPipelineHandler(handler, priority);\n\t\tthis._handler = handler;\n\t}\n\t\n\tdisplayRows(adjust){\n\t\tvar index = this.table.rowManager.displayRows.length - 1, \n\t\tlookupIndex;\n\t\t\n\t\tif(this._handler){\n\t\t\tlookupIndex = this.table.rowManager.displayPipeline.findIndex((item) => {\n\t\t\t\treturn item.handler === this._handler;\n\t\t\t});\n\n\t\t\tif(lookupIndex > -1){\n\t\t\t\tindex = lookupIndex;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif(adjust){\n\t\t\tindex = index + adjust;\n\t\t}\n\n\t\tif(this._handler){\n\t\t\tif(index > -1){\n\t\t\t\treturn this.table.rowManager.getDisplayRows(index);\n\t\t\t}else {\n\t\t\t\treturn this.activeRows();\n\t\t\t}\n\t\t}\t\n\t}\n\t\n\tactiveRows(){\n\t\treturn this.table.rowManager.activeRows;\n\t}\n\t\n\trefreshData(renderInPosition, handler){\n\t\tif(!handler){\n\t\t\thandler = this._handler;\n\t\t}\n\t\t\n\t\tif(handler){\n\t\t\tthis.table.rowManager.refreshActiveData(handler, false, renderInPosition);\n\t\t}\n\t}\n\t\n\t///////////////////////////////////\n\t//////// Footer Management ////////\n\t///////////////////////////////////\n\t\n\tfooterAppend(element){\n\t\treturn this.table.footerManager.append(element);\n\t}\n\t\n\tfooterPrepend(element){\n\t\treturn this.table.footerManager.prepend(element);\n\t}\n\t\n\tfooterRemove(element){\n\t\treturn this.table.footerManager.remove(element);\n\t} \n\t\n\t///////////////////////////////////\n\t//////// Popups Management ////////\n\t///////////////////////////////////\n\t\n\tpopup(menuEl, menuContainer){\n\t\treturn new Popup$1(this.table, menuEl, menuContainer);\n\t}\n\t\n\t///////////////////////////////////\n\t//////// Alert Management ////////\n\t///////////////////////////////////\n\t\n\talert(content, type){\n\t\treturn this.table.alertManager.alert(content, type);\n\t}\n\t\n\tclearAlert(){\n\t\treturn this.table.alertManager.clear();\n\t}\n\t\n}\n\nvar defaultAccessors = {\r\n\trownum:function(value, data, type, params, column, row){\r\n\t\treturn row.getPosition();\r\n\t}\r\n};\n\nclass Accessor extends Module{\n\t\n\tstatic moduleName = \"accessor\";\n\n\t//load defaults\n\tstatic accessors = defaultAccessors;\n\n\tconstructor(table){\n\t\tsuper(table);\n\n\t\tthis.allowedTypes = [\"\", \"data\", \"download\", \"clipboard\", \"print\", \"htmlOutput\"]; //list of accessor types\n\n\t\tthis.registerColumnOption(\"accessor\");\n\t\tthis.registerColumnOption(\"accessorParams\");\n\t\tthis.registerColumnOption(\"accessorData\");\n\t\tthis.registerColumnOption(\"accessorDataParams\");\n\t\tthis.registerColumnOption(\"accessorDownload\");\n\t\tthis.registerColumnOption(\"accessorDownloadParams\");\n\t\tthis.registerColumnOption(\"accessorClipboard\");\n\t\tthis.registerColumnOption(\"accessorClipboardParams\");\n\t\tthis.registerColumnOption(\"accessorPrint\");\n\t\tthis.registerColumnOption(\"accessorPrintParams\");\n\t\tthis.registerColumnOption(\"accessorHtmlOutput\");\n\t\tthis.registerColumnOption(\"accessorHtmlOutputParams\");\n\t}\n\n\tinitialize(){\n\t\tthis.subscribe(\"column-layout\", this.initializeColumn.bind(this));\n\t\tthis.subscribe(\"row-data-retrieve\", this.transformRow.bind(this));\n\t}\n\n\t//initialize column accessor\n\tinitializeColumn(column){\n\t\tvar match = false,\n\t\tconfig = {};\n\n\t\tthis.allowedTypes.forEach((type) => {\n\t\t\tvar key = \"accessor\" + (type.charAt(0).toUpperCase() + type.slice(1)),\n\t\t\taccessor;\n\n\t\t\tif(column.definition[key]){\n\t\t\t\taccessor = this.lookupAccessor(column.definition[key]);\n\n\t\t\t\tif(accessor){\n\t\t\t\t\tmatch = true;\n\n\t\t\t\t\tconfig[key] = {\n\t\t\t\t\t\taccessor:accessor,\n\t\t\t\t\t\tparams: column.definition[key + \"Params\"] || {},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tif(match){\n\t\t\tcolumn.modules.accessor = config;\n\t\t}\n\t}\n\n\tlookupAccessor(value){\n\t\tvar accessor = false;\n\n\t\t//set column accessor\n\t\tswitch(typeof value){\n\t\t\tcase \"string\":\n\t\t\t\tif(Accessor.accessors[value]){\n\t\t\t\t\taccessor = Accessor.accessors[value];\n\t\t\t\t}else {\n\t\t\t\t\tconsole.warn(\"Accessor Error - No such accessor found, ignoring: \", value);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"function\":\n\t\t\t\taccessor = value;\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn accessor;\n\t}\n\n\t//apply accessor to row\n\ttransformRow(row, type){\n\t\tvar key = \"accessor\" + (type.charAt(0).toUpperCase() + type.slice(1)),\n\t\trowComponent = row.getComponent();\n\n\t\t//clone data object with deep copy to isolate internal data from returned result\n\t\tvar data = Helpers.deepClone(row.data || {});\n\n\t\tthis.table.columnManager.traverse(function(column){\n\t\t\tvar value, accessor, params, colComponent;\n\n\t\t\tif(column.modules.accessor){\n\n\t\t\t\taccessor = column.modules.accessor[key] || column.modules.accessor.accessor || false;\n\n\t\t\t\tif(accessor){\n\t\t\t\t\tvalue = column.getFieldValue(data);\n\n\t\t\t\t\tif(value != \"undefined\"){\n\t\t\t\t\t\tcolComponent = column.getComponent();\n\t\t\t\t\t\tparams = typeof accessor.params === \"function\" ? accessor.params(value, data, type, colComponent, rowComponent) : accessor.params;\n\t\t\t\t\t\tcolumn.setFieldValue(data, accessor.accessor(value, data, type, params, colComponent, rowComponent));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn data;\n\t}\n}\n\nvar defaultConfig = {\n\tmethod: \"GET\",\n};\n\nfunction generateParamsList$1(data, prefix){\n\tvar output = [];\n\n\tprefix = prefix || \"\";\n\n\tif(Array.isArray(data)){\n\t\tdata.forEach((item, i) => {\n\t\t\toutput = output.concat(generateParamsList$1(item, prefix ? prefix + \"[\" + i + \"]\" : i));\n\t\t});\n\t}else if (typeof data === \"object\"){\n\t\tfor (var key in data){\n\t\t\toutput = output.concat(generateParamsList$1(data[key], prefix ? prefix + \"[\" + key + \"]\" : key));\n\t\t}\n\t}else {\n\t\toutput.push({key:prefix, value:data});\n\t}\n\n\treturn output;\n}\n\nfunction serializeParams(params){\n\tvar output = generateParamsList$1(params),\n\tencoded = [];\n\n\toutput.forEach(function(item){\n\t\tencoded.push(encodeURIComponent(item.key) + \"=\" + encodeURIComponent(item.value));\n\t});\n\n\treturn encoded.join(\"&\");\n}\n\nfunction urlBuilder(url, config, params){\n\tif(url){\n\t\tif(params && Object.keys(params).length){\n\t\t\tif(!config.method || config.method.toLowerCase() == \"get\"){\n\t\t\t\tconfig.method = \"get\";\n\n\t\t\t\turl += (url.includes(\"?\") ? \"&\" : \"?\") + serializeParams(params);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn url;\n}\n\nfunction defaultLoaderPromise(url, config, params){\n\tvar contentType;\n\n\treturn new Promise((resolve, reject) => {\n\t\t//set url\n\t\turl = this.urlGenerator.call(this.table, url, config, params);\n\n\t\t//set body content if not GET request\n\t\tif(config.method.toUpperCase() != \"GET\"){\n\t\t\tcontentType = typeof this.table.options.ajaxContentType === \"object\" ? this.table.options.ajaxContentType : this.contentTypeFormatters[this.table.options.ajaxContentType];\n\t\t\tif(contentType){\n\n\t\t\t\tfor(var key in contentType.headers){\n\t\t\t\t\tif(!config.headers){\n\t\t\t\t\t\tconfig.headers = {};\n\t\t\t\t\t}\n\n\t\t\t\t\tif(typeof config.headers[key] === \"undefined\"){\n\t\t\t\t\t\tconfig.headers[key] = contentType.headers[key];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconfig.body = contentType.body.call(this, url, config, params);\n\n\t\t\t}else {\n\t\t\t\tconsole.warn(\"Ajax Error - Invalid ajaxContentType value:\", this.table.options.ajaxContentType);\n\t\t\t}\n\t\t}\n\n\t\tif(url){\n\t\t\t//configure headers\n\t\t\tif(typeof config.headers === \"undefined\"){\n\t\t\t\tconfig.headers = {};\n\t\t\t}\n\n\t\t\tif(typeof config.headers.Accept === \"undefined\"){\n\t\t\t\tconfig.headers.Accept = \"application/json\";\n\t\t\t}\n\n\t\t\tif(typeof config.headers[\"X-Requested-With\"] === \"undefined\"){\n\t\t\t\tconfig.headers[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\t\t\t}\n\n\t\t\tif(typeof config.mode === \"undefined\"){\n\t\t\t\tconfig.mode = \"cors\";\n\t\t\t}\n\n\t\t\tif(config.mode == \"cors\"){\n\t\t\t\tif(typeof config.headers[\"Origin\"] === \"undefined\"){\n\t\t\t\t\tconfig.headers[\"Origin\"] = window.location.origin;\n\t\t\t\t}\n \n\t\t\t\tif(typeof config.credentials === \"undefined\"){\n\t\t\t\t\tconfig.credentials = 'same-origin';\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tif(typeof config.credentials === \"undefined\"){\n\t\t\t\t\tconfig.credentials = 'include';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//send request\n\t\t\tfetch(url, config)\n\t\t\t\t.then((response)=>{\n\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\tresponse.json()\n\t\t\t\t\t\t\t.then((data)=>{\n\t\t\t\t\t\t\t\tresolve(data);\n\t\t\t\t\t\t\t}).catch((error)=>{\n\t\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t\t\tconsole.warn(\"Ajax Load Error - Invalid JSON returned\", error);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t}else {\n\t\t\t\t\t\tconsole.error(\"Ajax Load Error - Connection Error: \" + response.status, response.statusText);\n\t\t\t\t\t\treject(response);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch((error)=>{\n\t\t\t\t\tconsole.error(\"Ajax Load Error - Connection Error: \", error);\n\t\t\t\t\treject(error);\n\t\t\t\t});\n\t\t}else {\n\t\t\tconsole.warn(\"Ajax Load Error - No URL Set\");\n\t\t\tresolve([]);\n\t\t}\n\t});\n}\n\nfunction generateParamsList(data, prefix){\n\tvar output = [];\n\n\tprefix = prefix || \"\";\n\n\tif(Array.isArray(data)){\n\t\tdata.forEach((item, i) => {\n\t\t\toutput = output.concat(generateParamsList(item, prefix ? prefix + \"[\" + i + \"]\" : i));\n\t\t});\n\t}else if (typeof data === \"object\"){\n\t\tfor (var key in data){\n\t\t\toutput = output.concat(generateParamsList(data[key], prefix ? prefix + \"[\" + key + \"]\" : key));\n\t\t}\n\t}else {\n\t\toutput.push({key:prefix, value:data});\n\t}\n\n\treturn output;\n}\n\nvar defaultContentTypeFormatters = {\n\t\"json\":{\n\t\theaders:{\n\t\t\t'Content-Type': 'application/json',\n\t\t},\n\t\tbody:function(url, config, params){\n\t\t\treturn JSON.stringify(params);\n\t\t},\n\t},\n\t\"form\":{\n\t\theaders:{\n\t\t},\n\t\tbody:function(url, config, params){\n\n\t\t\tvar output = generateParamsList(params),\n\t\t\tform = new FormData();\n\n\t\t\toutput.forEach(function(item){\n\t\t\t\tform.append(item.key, item.value);\n\t\t\t});\n\n\t\t\treturn form;\n\t\t},\n\t},\n};\n\nclass Ajax extends Module{\n\n\tstatic moduleName = \"ajax\";\n\n\t//load defaults\n\tstatic defaultConfig = defaultConfig;\n\tstatic defaultURLGenerator = urlBuilder;\n\tstatic defaultLoaderPromise = defaultLoaderPromise;\n\tstatic contentTypeFormatters = defaultContentTypeFormatters;\n\t\n\tconstructor(table){\n\t\tsuper(table);\n\t\t\n\t\tthis.config = {}; //hold config object for ajax request\n\t\tthis.url = \"\"; //request URL\n\t\tthis.urlGenerator = false;\n\t\tthis.params = false; //request parameters\n\t\t\n\t\tthis.loaderPromise = false;\n\t\t\n\t\tthis.registerTableOption(\"ajaxURL\", false); //url for ajax loading\n\t\tthis.registerTableOption(\"ajaxURLGenerator\", false);\n\t\tthis.registerTableOption(\"ajaxParams\", {}); //params for ajax loading\n\t\tthis.registerTableOption(\"ajaxConfig\", \"get\"); //ajax request type\n\t\tthis.registerTableOption(\"ajaxContentType\", \"form\"); //ajax request type\n\t\tthis.registerTableOption(\"ajaxRequestFunc\", false); //promise function\n\t\t\n\t\tthis.registerTableOption(\"ajaxRequesting\", function(){});\n\t\tthis.registerTableOption(\"ajaxResponse\", false);\n\t\t\n\t\tthis.contentTypeFormatters = Ajax.contentTypeFormatters;\n\t}\n\t\n\t//initialize setup options\n\tinitialize(){\n\t\tthis.loaderPromise = this.table.options.ajaxRequestFunc || Ajax.defaultLoaderPromise;\n\t\tthis.urlGenerator = this.table.options.ajaxURLGenerator || Ajax.defaultURLGenerator;\n\t\t\n\t\tif(this.table.options.ajaxURL){\n\t\t\tthis.setUrl(this.table.options.ajaxURL);\n\t\t}\n\n\n\t\tthis.setDefaultConfig(this.table.options.ajaxConfig);\n\t\t\n\t\tthis.registerTableFunction(\"getAjaxUrl\", this.getUrl.bind(this));\n\t\t\n\t\tthis.subscribe(\"data-loading\", this.requestDataCheck.bind(this));\n\t\tthis.subscribe(\"data-params\", this.requestParams.bind(this));\n\t\tthis.subscribe(\"data-load\", this.requestData.bind(this));\n\t}\n\t\n\trequestParams(data, config, silent, params){\n\t\tvar ajaxParams = this.table.options.ajaxParams;\n\t\t\n\t\tif(ajaxParams){\n\t\t\tif(typeof ajaxParams === \"function\"){\n\t\t\t\tajaxParams = ajaxParams.call(this.table);\n\t\t\t}\n\t\t\t\n\t\t\tparams = Object.assign(Object.assign({}, ajaxParams), params);\n\t\t}\t\t\n\t\t\n\t\treturn params;\n\t}\n\t\n\trequestDataCheck(data, params, config, silent){\n\t\treturn !!((!data && this.url) || typeof data === \"string\");\n\t}\n\t\n\trequestData(url, params, config, silent, previousData){\n\t\tvar ajaxConfig;\n\t\t\n\t\tif(!previousData && this.requestDataCheck(url)){\n\t\t\tif(url){\n\t\t\t\tthis.setUrl(url);\n\t\t\t}\n\t\t\t\n\t\t\tajaxConfig = this.generateConfig(config);\n\t\t\t\n\t\t\treturn this.sendRequest(this.url, params, ajaxConfig);\n\t\t}else {\n\t\t\treturn previousData;\n\t\t}\n\t}\n\t\n\tsetDefaultConfig(config = {}){\n\t\tthis.config = Object.assign({}, Ajax.defaultConfig);\n\n\t\tif(typeof config == \"string\"){\n\t\t\tthis.config.method = config;\n\t\t}else {\n\t\t\tObject.assign(this.config, config);\n\t\t}\n\t}\n\t\n\t//load config object\n\tgenerateConfig(config = {}){\n\t\tvar ajaxConfig = Object.assign({}, this.config);\n\t\t\n\t\tif(typeof config == \"string\"){\n\t\t\tajaxConfig.method = config;\n\t\t}else {\n\t\t\tObject.assign(ajaxConfig, config);\n\t\t}\n\t\t\n\t\treturn ajaxConfig;\n\t}\n\t\n\t//set request url\n\tsetUrl(url){\n\t\tthis.url = url;\n\t}\n\t\n\t//get request url\n\tgetUrl(){\n\t\treturn this.url;\n\t}\n\t\n\t//send ajax request\n\tsendRequest(url, params, config){\n\t\tif(this.table.options.ajaxRequesting.call(this.table, url, params) !== false){\n\t\t\treturn this.loaderPromise(url, config, params)\n\t\t\t\t.then((data)=>{\n\t\t\t\t\tif(this.table.options.ajaxResponse){\n\t\t\t\t\t\tdata = this.table.options.ajaxResponse.call(this.table, url, params, data);\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\treturn data;\n\t\t\t\t});\n\t\t}else {\n\t\t\treturn Promise.reject();\n\t\t}\n\t}\n}\n\nvar defaultPasteActions = {\n\treplace:function(data){\n\t\treturn this.table.setData(data);\n\t},\n\tupdate:function(data){\n\t\treturn this.table.updateOrAddData(data);\n\t},\n\tinsert:function(data){\n\t\treturn this.table.addData(data);\n\t},\n};\n\nvar defaultPasteParsers = {\n\ttable:function(clipboard){\n\t\tvar data = [],\n\t\theaderFindSuccess = true,\n\t\tcolumns = this.table.columnManager.columns,\n\t\tcolumnMap = [],\n\t\trows = [];\n\t\t\n\t\t//get data from clipboard into array of columns and rows.\n\t\tclipboard = clipboard.split(\"\\n\");\n\t\t\n\t\tclipboard.forEach(function(row){\n\t\t\tdata.push(row.split(\"\\t\"));\n\t\t});\n\t\t\n\t\tif(data.length && !(data.length === 1 && data[0].length < 2)){\n\t\t\t\n\t\t\t//check if headers are present by title\n\t\t\tdata[0].forEach(function(value){\n\t\t\t\tvar column = columns.find(function(column){\n\t\t\t\t\treturn value && column.definition.title && value.trim() && column.definition.title.trim() === value.trim();\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tif(column){\n\t\t\t\t\tcolumnMap.push(column);\n\t\t\t\t}else {\n\t\t\t\t\theaderFindSuccess = false;\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\t//check if column headers are present by field\n\t\t\tif(!headerFindSuccess){\n\t\t\t\theaderFindSuccess = true;\n\t\t\t\tcolumnMap = [];\n\t\t\t\t\n\t\t\t\tdata[0].forEach(function(value){\n\t\t\t\t\tvar column = columns.find(function(column){\n\t\t\t\t\t\treturn value && column.field && value.trim() && column.field.trim() === value.trim();\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tif(column){\n\t\t\t\t\t\tcolumnMap.push(column);\n\t\t\t\t\t}else {\n\t\t\t\t\t\theaderFindSuccess = false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tif(!headerFindSuccess){\n\t\t\t\t\tcolumnMap = this.table.columnManager.columnsByIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//remove header row if found\n\t\t\tif(headerFindSuccess){\n\t\t\t\tdata.shift();\n\t\t\t}\n\t\t\t\n\t\t\tdata.forEach(function(item){\n\t\t\t\tvar row = {};\n\t\t\t\t\n\t\t\t\titem.forEach(function(value, i){\n\t\t\t\t\tif(columnMap[i]){\n\t\t\t\t\t\trow[columnMap[i].field] = value;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\trows.push(row);\n\t\t\t});\n\t\t\t\n\t\t\treturn rows;\n\t\t}else {\n\t\t\treturn false;\n\t\t}\n\t},\n};\n\nvar bindings$2 = {\r\n\tcopyToClipboard:[\"ctrl + 67\", \"meta + 67\"],\r\n};\n\nvar actions$2 = {\r\n\tcopyToClipboard:function(e){\r\n\t\tif(!this.table.modules.edit.currentCell){\r\n\t\t\tif(this.table.modExists(\"clipboard\", true)){\r\n\t\t\t\tthis.table.modules.clipboard.copy(false, true);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\n\nvar extensions$4 = {\r\n\tkeybindings:{\r\n\t\tbindings:bindings$2,\r\n\t\tactions:actions$2\r\n\t},\r\n};\n\nclass Clipboard extends Module{\n\n\tstatic moduleName = \"clipboard\";\n\tstatic moduleExtensions = extensions$4;\n\n\t//load defaults\n\tstatic pasteActions = defaultPasteActions;\n\tstatic pasteParsers = defaultPasteParsers;\n\n\tconstructor(table){\n\t\tsuper(table);\n\n\t\tthis.mode = true;\n\t\tthis.pasteParser = function(){};\n\t\tthis.pasteAction = function(){};\n\t\tthis.customSelection = false;\n\t\tthis.rowRange = false;\n\t\tthis.blocked = true; //block copy actions not originating from this command\n\n\t\tthis.registerTableOption(\"clipboard\", false); //enable clipboard\n\t\tthis.registerTableOption(\"clipboardCopyStyled\", true); //formatted table data\n\t\tthis.registerTableOption(\"clipboardCopyConfig\", false); //clipboard config\n\t\tthis.registerTableOption(\"clipboardCopyFormatter\", false); //DEPRECATED - REMOVE in 5.0\n\t\tthis.registerTableOption(\"clipboardCopyRowRange\", \"active\"); //restrict clipboard to visible rows only\n\t\tthis.registerTableOption(\"clipboardPasteParser\", \"table\"); //convert pasted clipboard data to rows\n\t\tthis.registerTableOption(\"clipboardPasteAction\", \"insert\"); //how to insert pasted data into the table\n\n\t\tthis.registerColumnOption(\"clipboard\");\n\t\tthis.registerColumnOption(\"titleClipboard\");\n\t}\n\n\tinitialize(){\n\t\tthis.mode = this.table.options.clipboard;\n\n\t\tthis.rowRange = this.table.options.clipboardCopyRowRange;\n\n\t\tif(this.mode === true || this.mode === \"copy\"){\n\t\t\tthis.table.element.addEventListener(\"copy\", (e) => {\n\t\t\t\tvar plain, html, list;\n\n\t\t\t\tif(!this.blocked){\n\t\t\t\t\te.preventDefault();\n\n\t\t\t\t\tif(this.customSelection){\n\t\t\t\t\t\tplain = this.customSelection;\n\n\t\t\t\t\t\tif(this.table.options.clipboardCopyFormatter){\n\t\t\t\t\t\t\tplain = this.table.options.clipboardCopyFormatter(\"plain\", plain);\n\t\t\t\t\t\t}\n\t\t\t\t\t}else {\n\n\t\t\t\t\t\tlist = this.table.modules.export.generateExportList(this.table.options.clipboardCopyConfig, this.table.options.clipboardCopyStyled, this.rowRange, \"clipboard\");\n\n\t\t\t\t\t\thtml = this.table.modules.export.generateHTMLTable(list);\n\t\t\t\t\t\tplain = html ? this.generatePlainContent(list) : \"\";\n\n\t\t\t\t\t\tif(this.table.options.clipboardCopyFormatter){\n\t\t\t\t\t\t\tplain = this.table.options.clipboardCopyFormatter(\"plain\", plain);\n\t\t\t\t\t\t\thtml = this.table.options.clipboardCopyFormatter(\"html\", html);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (window.clipboardData && window.clipboardData.setData) {\n\t\t\t\t\t\twindow.clipboardData.setData('Text', plain);\n\t\t\t\t\t} else if (e.clipboardData && e.clipboardData.setData) {\n\t\t\t\t\t\te.clipboardData.setData('text/plain', plain);\n\t\t\t\t\t\tif(html){\n\t\t\t\t\t\t\te.clipboardData.setData('text/html', html);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (e.originalEvent && e.originalEvent.clipboardData.setData) {\n\t\t\t\t\t\te.originalEvent.clipboardData.setData('text/plain', plain);\n\t\t\t\t\t\tif(html){\n\t\t\t\t\t\t\te.originalEvent.clipboardData.setData('text/html', html);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.dispatchExternal(\"clipboardCopied\", plain, html);\n\n\t\t\t\t\tthis.reset();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif(this.mode === true || this.mode === \"paste\"){\n\t\t\tthis.table.element.addEventListener(\"paste\", (e) => {\n\t\t\t\tthis.paste(e);\n\t\t\t});\n\t\t}\n\n\t\tthis.setPasteParser(this.table.options.clipboardPasteParser);\n\t\tthis.setPasteAction(this.table.options.clipboardPasteAction);\n\n\t\tthis.registerTableFunction(\"copyToClipboard\", this.copy.bind(this));\n\t}\n\n\treset(){\n\t\tthis.blocked = true;\n\t\tthis.customSelection = false;\n\t}\n\n\tgeneratePlainContent (list) {\n\t\tvar output = [];\n\n\t\tlist.forEach((row) => {\n\t\t\tvar rowData = [];\n\n\t\t\trow.columns.forEach((col) => {\n\t\t\t\tvar value = \"\";\n\n\t\t\t\tif(col){\n\n\t\t\t\t\tif(row.type === \"group\"){\n\t\t\t\t\t\tcol.value = col.component.getKey();\n\t\t\t\t\t}\n\n\t\t\t\t\tif(col.value === null){\n\t\t\t\t\t\tvalue = \"\";\n\t\t\t\t\t}else {\n\t\t\t\t\t\tswitch(typeof col.value){\n\t\t\t\t\t\t\tcase \"object\":\n\t\t\t\t\t\t\t\tvalue = JSON.stringify(col.value);\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase \"undefined\":\n\t\t\t\t\t\t\t\tvalue = \"\";\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tvalue = col.value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\trowData.push(value);\n\t\t\t});\n\n\t\t\toutput.push(rowData.join(\"\\t\"));\n\t\t});\n\n\t\treturn output.join(\"\\n\");\n\t}\n\n\tcopy (range, internal) {\n\t\tvar sel, textRange;\n\t\tthis.blocked = false;\n\t\tthis.customSelection = false;\n\t\n\n\t\tif (this.mode === true || this.mode === \"copy\") {\n\n\t\t\tthis.rowRange = range || this.table.options.clipboardCopyRowRange;\n\n\t\t\tif (typeof window.getSelection != \"undefined\" && typeof document.createRange != \"undefined\") {\n\t\t\t\trange = document.createRange();\n\t\t\t\trange.selectNodeContents(this.table.element);\n\t\t\t\tsel = window.getSelection();\n\n\t\t\t\tif (sel.toString() && internal) {\n\t\t\t\t\tthis.customSelection = sel.toString();\n\t\t\t\t}\n\n\t\t\t\tsel.removeAllRanges();\n\t\t\t\tsel.addRange(range);\n\t\t\t} else if (typeof document.selection != \"undefined\" && typeof document.body.createTextRange != \"undefined\") {\n\t\t\t\ttextRange = document.body.createTextRange();\n\t\t\t\ttextRange.moveToElementText(this.table.element);\n\t\t\t\ttextRange.select();\n\t\t\t}\n\n\t\t\tdocument.execCommand('copy');\n\n\t\t\tif (sel) {\n\t\t\t\tsel.removeAllRanges();\n\t\t\t}\n\t\t}\n\t}\n\n\t//PASTE EVENT HANDLING\n\tsetPasteAction(action){\n\n\t\tswitch(typeof action){\n\t\t\tcase \"string\":\n\t\t\t\tthis.pasteAction = Clipboard.pasteActions[action];\n\n\t\t\t\tif(!this.pasteAction){\n\t\t\t\t\tconsole.warn(\"Clipboard Error - No such paste action found:\", action);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"function\":\n\t\t\t\tthis.pasteAction = action;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tsetPasteParser(parser){\n\t\tswitch(typeof parser){\n\t\t\tcase \"string\":\n\t\t\t\tthis.pasteParser = Clipboard.pasteParsers[parser];\n\n\t\t\t\tif(!this.pasteParser){\n\t\t\t\t\tconsole.warn(\"Clipboard Error - No such paste parser found:\", parser);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"function\":\n\t\t\t\tthis.pasteParser = parser;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpaste(e){\n\t\tvar data, rowData, rows;\n\n\t\tif(this.checkPasteOrigin(e)){\n\n\t\t\tdata = this.getPasteData(e);\n\n\t\t\trowData = this.pasteParser.call(this, data);\n\n\t\t\tif(rowData){\n\t\t\t\te.preventDefault();\n\n\t\t\t\tif(this.table.modExists(\"mutator\")){\n\t\t\t\t\trowData = this.mutateData(rowData);\n\t\t\t\t}\n\n\t\t\t\trows = this.pasteAction.call(this, rowData);\n\n\t\t\t\tthis.dispatchExternal(\"clipboardPasted\", data, rowData, rows);\n\t\t\t}else {\n\t\t\t\tthis.dispatchExternal(\"clipboardPasteError\", data);\n\t\t\t}\n\t\t}\n\t}\n\n\tmutateData(data){\n\t\tvar output = [];\n\n\t\tif(Array.isArray(data)){\n\t\t\tdata.forEach((row) => {\n\t\t\t\toutput.push(this.table.modules.mutator.transformRow(row, \"clipboard\"));\n\t\t\t});\n\t\t}else {\n\t\t\toutput = data;\n\t\t}\n\n\t\treturn output;\n\t}\n\n\n\tcheckPasteOrigin(e){\n\t\tvar valid = true;\n\t\tvar blocked = this.confirm(\"clipboard-paste\", [e]);\n\n\t\tif(blocked || ![\"DIV\", \"SPAN\"].includes(e.target.tagName)){\n\t\t\tvalid = false;\n\t\t}\n\n\t\treturn valid;\n\t}\n\n\tgetPasteData(e){\n\t\tvar data;\n\n\t\tif (window.clipboardData && window.clipboardData.getData) {\n\t\t\tdata = window.clipboardData.getData('Text');\n\t\t} else if (e.clipboardData && e.clipboardData.getData) {\n\t\t\tdata = e.clipboardData.getData('text/plain');\n\t\t} else if (e.originalEvent && e.originalEvent.clipboardData.getData) {\n\t\t\tdata = e.originalEvent.clipboardData.getData('text/plain');\n\t\t}\n\n\t\treturn data;\n\t}\n}\n\nclass CalcComponent{\n\tconstructor (row){\n\t\tthis._row = row;\n\n\t\treturn new Proxy(this, {\n\t\t\tget: function(target, name, receiver) {\n\t\t\t\tif (typeof target[name] !== \"undefined\") {\n\t\t\t\t\treturn target[name];\n\t\t\t\t}else {\n\t\t\t\t\treturn target._row.table.componentFunctionBinder.handle(\"row\", target._row, name);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tgetData(transform){\n\t\treturn this._row.getData(transform);\n\t}\n\n\tgetElement(){\n\t\treturn this._row.getElement();\n\t}\n\n\tgetTable(){\n\t\treturn this._row.table;\n\t}\n\n\tgetCells(){\n\t\tvar cells = [];\n\n\t\tthis._row.getCells().forEach(function(cell){\n\t\t\tcells.push(cell.getComponent());\n\t\t});\n\n\t\treturn cells;\n\t}\n\n\tgetCell(column){\n\t\tvar cell = this._row.getCell(column);\n\t\treturn cell ? cell.getComponent() : false;\n\t}\n\n\t_getSelf(){\n\t\treturn this._row;\n\t}\n}\n\n//public cell object\nclass CellComponent {\n\n\tconstructor (cell){\n\t\tthis._cell = cell;\n\n\t\treturn new Proxy(this, {\n\t\t\tget: function(target, name, receiver) {\n\t\t\t\tif (typeof target[name] !== \"undefined\") {\n\t\t\t\t\treturn target[name];\n\t\t\t\t}else {\n\t\t\t\t\treturn target._cell.table.componentFunctionBinder.handle(\"cell\", target._cell, name);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tgetValue(){\n\t\treturn this._cell.getValue();\n\t}\n\n\tgetOldValue(){\n\t\treturn this._cell.getOldValue();\n\t}\n\n\tgetInitialValue(){\n\t\treturn this._cell.initialValue;\n\t}\n\n\tgetElement(){\n\t\treturn this._cell.getElement();\n\t}\n\n\tgetRow(){\n\t\treturn this._cell.row.getComponent();\n\t}\n\n\tgetData(transform){\n\t\treturn this._cell.row.getData(transform);\n\t}\n\tgetType(){\n\t\treturn \"cell\";\n\t}\n\tgetField(){\n\t\treturn this._cell.column.getField();\n\t}\n\n\tgetColumn(){\n\t\treturn this._cell.column.getComponent();\n\t}\n\n\tsetValue(value, mutate){\n\t\tif(typeof mutate == \"undefined\"){\n\t\t\tmutate = true;\n\t\t}\n\n\t\tthis._cell.setValue(value, mutate);\n\t}\n\n\trestoreOldValue(){\n\t\tthis._cell.setValueActual(this._cell.getOldValue());\n\t}\n\n\trestoreInitialValue(){\n\t\tthis._cell.setValueActual(this._cell.initialValue);\n\t}\n\n\tcheckHeight(){\n\t\tthis._cell.checkHeight();\n\t}\n\n\tgetTable(){\n\t\treturn this._cell.table;\n\t}\n\n\t_getSelf(){\n\t\treturn this._cell;\n\t}\n}\n\nclass Cell extends CoreFeature{\n\tconstructor(column, row){\n\t\tsuper(column.table);\n\n\t\tthis.table = column.table;\n\t\tthis.column = column;\n\t\tthis.row = row;\n\t\tthis.element = null;\n\t\tthis.value = null;\n\t\tthis.initialValue;\n\t\tthis.oldValue = null;\n\t\tthis.modules = {};\n\n\t\tthis.height = null;\n\t\tthis.width = null;\n\t\tthis.minWidth = null;\n\n\t\tthis.component = null;\n\n\t\tthis.loaded = false; //track if the cell has been added to the DOM yet\n\n\t\tthis.build();\n\t}\n\n\t//////////////// Setup Functions /////////////////\n\t//generate element\n\tbuild(){\n\t\tthis.generateElement();\n\n\t\tthis.setWidth();\n\n\t\tthis._configureCell();\n\n\t\tthis.setValueActual(this.column.getFieldValue(this.row.data));\n\n\t\tthis.initialValue = this.value;\n\t}\n\n\tgenerateElement(){\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = \"tabulator-cell\";\n\t\tthis.element.setAttribute(\"role\", \"gridcell\");\n\n\t\tif(this.column.isRowHeader){\n\t\t\tthis.element.classList.add(\"tabulator-row-header\");\n\t\t}\n\t}\n\n\t_configureCell(){\n\t\tvar element = this.element,\n\t\tfield = this.column.getField(),\n\t\tvertAligns = {\n\t\t\ttop:\"flex-start\",\n\t\t\tbottom:\"flex-end\",\n\t\t\tmiddle:\"center\",\n\t\t},\n\t\thozAligns = {\n\t\t\tleft:\"flex-start\",\n\t\t\tright:\"flex-end\",\n\t\t\tcenter:\"center\",\n\t\t};\n\n\t\t//set text alignment\n\t\telement.style.textAlign = this.column.hozAlign;\n\n\t\tif(this.column.vertAlign){\n\t\t\telement.style.display = \"inline-flex\";\n\n\t\t\telement.style.alignItems = vertAligns[this.column.vertAlign] || \"\";\n\n\t\t\tif(this.column.hozAlign){\n\t\t\t\telement.style.justifyContent = hozAligns[this.column.hozAlign] || \"\";\n\t\t\t}\n\t\t}\n\n\t\tif(field){\n\t\t\telement.setAttribute(\"tabulator-field\", field);\n\t\t}\n\n\t\t//add class to cell if needed\n\t\tif(this.column.definition.cssClass){\n\t\t\tvar classNames = this.column.definition.cssClass.split(\" \");\n\t\t\tclassNames.forEach((className) => {\n\t\t\t\telement.classList.add(className);\n\t\t\t});\n\t\t}\n\n\t\tthis.dispatch(\"cell-init\", this);\n\n\t\t//hide cell if not visible\n\t\tif(!this.column.visible){\n\t\t\tthis.hide();\n\t\t}\n\t}\n\n\t//generate cell contents\n\t_generateContents(){\n\t\tvar val;\n\n\t\tval = this.chain(\"cell-format\", this, null, () => {\n\t\t\treturn this.element.innerHTML = this.value;\n\t\t});\n\n\t\tswitch(typeof val){\n\t\t\tcase \"object\":\n\t\t\t\tif(val instanceof Node){\n\n\t\t\t\t\t//clear previous cell contents\n\t\t\t\t\twhile(this.element.firstChild) this.element.removeChild(this.element.firstChild);\n\n\t\t\t\t\tthis.element.appendChild(val);\n\t\t\t\t}else {\n\t\t\t\t\tthis.element.innerHTML = \"\";\n\n\t\t\t\t\tif(val != null){\n\t\t\t\t\t\tconsole.warn(\"Format Error - Formatter has returned a type of object, the only valid formatter object return is an instance of Node, the formatter returned:\", val);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"undefined\":\n\t\t\t\tthis.element.innerHTML = \"\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthis.element.innerHTML = val;\n\t\t}\n\t}\n\n\tcellRendered(){\n\t\tthis.dispatch(\"cell-rendered\", this);\n\t}\n\n\t//////////////////// Getters ////////////////////\n\tgetElement(containerOnly){\n\t\tif(!this.loaded){\n\t\t\tthis.loaded = true;\n\t\t\tif(!containerOnly){\n\t\t\t\tthis.layoutElement();\n\t\t\t}\n\t\t}\n\n\t\treturn this.element;\n\t}\n\n\tgetValue(){\n\t\treturn this.value;\n\t}\n\n\tgetOldValue(){\n\t\treturn this.oldValue;\n\t}\n\n\t//////////////////// Actions ////////////////////\n\tsetValue(value, mutate, force){\n\t\tvar changed = this.setValueProcessData(value, mutate, force);\n\n\t\tif(changed){\n\t\t\tthis.dispatch(\"cell-value-updated\", this);\n\n\t\t\tthis.cellRendered();\n\n\t\t\tif(this.column.definition.cellEdited){\n\t\t\t\tthis.column.definition.cellEdited.call(this.table, this.getComponent());\n\t\t\t}\n\n\t\t\tthis.dispatchExternal(\"cellEdited\", this.getComponent());\n\n\t\t\tif(this.subscribedExternal(\"dataChanged\")){\n\t\t\t\tthis.dispatchExternal(\"dataChanged\", this.table.rowManager.getData());\n\t\t\t}\n\t\t}\n\t}\n\n\tsetValueProcessData(value, mutate, force){\n\t\tvar changed = false;\n\n\t\tif(this.value !== value || force){\n\n\t\t\tchanged = true;\n\n\t\t\tif(mutate){\n\t\t\t\tvalue = this.chain(\"cell-value-changing\", [this, value], null, value);\n\t\t\t}\n\t\t}\n\n\t\tthis.setValueActual(value);\n\n\t\tif(changed){\n\t\t\tthis.dispatch(\"cell-value-changed\", this);\n\t\t}\n\n\t\treturn changed;\n\t}\n\n\tsetValueActual(value){\n\t\tthis.oldValue = this.value;\n\n\t\tthis.value = value;\n\n\t\tthis.dispatch(\"cell-value-save-before\", this);\n\n\t\tthis.column.setFieldValue(this.row.data, value);\n\n\t\tthis.dispatch(\"cell-value-save-after\", this);\n\n\t\tif(this.loaded){\n\t\t\tthis.layoutElement();\n\t\t}\n\t}\n\n\tlayoutElement(){\n\t\tthis._generateContents();\n\n\t\tthis.dispatch(\"cell-layout\", this);\n\t}\n\n\tsetWidth(){\n\t\tthis.width = this.column.width;\n\t\tthis.element.style.width = this.column.widthStyled;\n\t}\n\n\tclearWidth(){\n\t\tthis.width = \"\";\n\t\tthis.element.style.width = \"\";\n\t}\n\n\tgetWidth(){\n\t\treturn this.width || this.element.offsetWidth;\n\t}\n\n\tsetMinWidth(){\n\t\tthis.minWidth = this.column.minWidth;\n\t\tthis.element.style.minWidth = this.column.minWidthStyled;\n\t}\n\n\tsetMaxWidth(){\n\t\tthis.maxWidth = this.column.maxWidth;\n\t\tthis.element.style.maxWidth = this.column.maxWidthStyled;\n\t}\n\n\tcheckHeight(){\n\t\t// var height = this.element.css(\"height\");\n\t\tthis.row.reinitializeHeight();\n\t}\n\n\tclearHeight(){\n\t\tthis.element.style.height = \"\";\n\t\tthis.height = null;\n\n\t\tthis.dispatch(\"cell-height\", this, \"\");\n\t}\n\n\tsetHeight(){\n\t\tthis.height = this.row.height;\n\t\tthis.element.style.height = this.row.heightStyled;\n\n\t\tthis.dispatch(\"cell-height\", this, this.row.heightStyled);\n\t}\n\n\tgetHeight(){\n\t\treturn this.height || this.element.offsetHeight;\n\t}\n\n\tshow(){\n\t\tthis.element.style.display = this.column.vertAlign ? \"inline-flex\" : \"\";\n\t}\n\n\thide(){\n\t\tthis.element.style.display = \"none\";\n\t}\n\n\tdelete(){\n\t\tthis.dispatch(\"cell-delete\", this);\n\n\t\tif(!this.table.rowManager.redrawBlock && this.element.parentNode){\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\n\t\tthis.element = false;\n\t\tthis.column.deleteCell(this);\n\t\tthis.row.deleteCell(this);\n\t\tthis.calcs = {};\n\t}\n\n\tgetIndex(){\n\t\treturn this.row.getCellIndex(this);\n\t}\n\n\t//////////////// Object Generation /////////////////\n\tgetComponent(){\n\t\tif(!this.component){\n\t\t\tthis.component = new CellComponent(this);\n\t\t}\n\n\t\treturn this.component;\n\t}\n}\n\n//public column object\nclass ColumnComponent {\n\tconstructor (column){\n\t\tthis._column = column;\n\t\tthis.type = \"ColumnComponent\";\n\n\t\treturn new Proxy(this, {\n\t\t\tget: function(target, name, receiver) {\n\t\t\t\tif (typeof target[name] !== \"undefined\") {\n\t\t\t\t\treturn target[name];\n\t\t\t\t}else {\n\t\t\t\t\treturn target._column.table.componentFunctionBinder.handle(\"column\", target._column, name);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tgetElement(){\n\t\treturn this._column.getElement();\n\t}\n\n\tgetDefinition(){\n\t\treturn this._column.getDefinition();\n\t}\n\n\tgetField(){\n\t\treturn this._column.getField();\n\t}\n\n\tgetTitleDownload() {\n\t\treturn this._column.getTitleDownload();\n\t}\n\n\tgetCells(){\n\t\tvar cells = [];\n\n\t\tthis._column.cells.forEach(function(cell){\n\t\t\tcells.push(cell.getComponent());\n\t\t});\n\n\t\treturn cells;\n\t}\n\n\tisVisible(){\n\t\treturn this._column.visible;\n\t}\n\n\tshow(){\n\t\tif(this._column.isGroup){\n\t\t\tthis._column.columns.forEach(function(column){\n\t\t\t\tcolumn.show();\n\t\t\t});\n\t\t}else {\n\t\t\tthis._column.show();\n\t\t}\n\t}\n\n\thide(){\n\t\tif(this._column.isGroup){\n\t\t\tthis._column.columns.forEach(function(column){\n\t\t\t\tcolumn.hide();\n\t\t\t});\n\t\t}else {\n\t\t\tthis._column.hide();\n\t\t}\n\t}\n\n\ttoggle(){\n\t\tif(this._column.visible){\n\t\t\tthis.hide();\n\t\t}else {\n\t\t\tthis.show();\n\t\t}\n\t}\n\n\tdelete(){\n\t\treturn this._column.delete();\n\t}\n\n\tgetSubColumns(){\n\t\tvar output = [];\n\n\t\tif(this._column.columns.length){\n\t\t\tthis._column.columns.forEach(function(column){\n\t\t\t\toutput.push(column.getComponent());\n\t\t\t});\n\t\t}\n\n\t\treturn output;\n\t}\n\n\tgetParentColumn(){\n\t\treturn this._column.getParentComponent();\n\t}\n\n\t_getSelf(){\n\t\treturn this._column;\n\t}\n\n\tscrollTo(position, ifVisible){\n\t\treturn this._column.table.columnManager.scrollToColumn(this._column, position, ifVisible);\n\t}\n\n\tgetTable(){\n\t\treturn this._column.table;\n\t}\n\n\tmove(to, after){\n\t\tvar toColumn = this._column.table.columnManager.findColumn(to);\n\n\t\tif(toColumn){\n\t\t\tthis._column.table.columnManager.moveColumn(this._column, toColumn, after);\n\t\t}else {\n\t\t\tconsole.warn(\"Move Error - No matching column found:\", toColumn);\n\t\t}\n\t}\n\n\tgetNextColumn(){\n\t\tvar nextCol = this._column.nextColumn();\n\n\t\treturn nextCol ? nextCol.getComponent() : false;\n\t}\n\n\tgetPrevColumn(){\n\t\tvar prevCol = this._column.prevColumn();\n\n\t\treturn prevCol ? prevCol.getComponent() : false;\n\t}\n\n\tupdateDefinition(updates){\n\t\treturn this._column.updateDefinition(updates);\n\t}\n\n\tgetWidth(){\n\t\treturn this._column.getWidth();\n\t}\n\n\tsetWidth(width){\n\t\tvar result;\n\n\t\tif(width === true){\n\t\t\tresult = this._column.reinitializeWidth(true);\n\t\t}else {\n\t\t\tresult = this._column.setWidth(width);\n\t\t}\n\n\t\tthis._column.table.columnManager.rerenderColumns(true);\n\n\t\treturn result;\n\t}\n}\n\nvar defaultColumnOptions = {\n\t\"title\": undefined,\n\t\"field\": undefined,\n\t\"columns\": undefined,\n\t\"visible\": undefined,\n\t\"hozAlign\": undefined,\n\t\"vertAlign\": undefined,\n\t\"width\": undefined,\n\t\"minWidth\": 40,\n\t\"maxWidth\": undefined,\n\t\"maxInitialWidth\": undefined,\n\t\"cssClass\": undefined,\n\t\"variableHeight\": undefined,\n\t\"headerVertical\": undefined,\n\t\"headerHozAlign\": undefined,\n\t\"headerWordWrap\": false,\n\t\"editableTitle\": undefined,\n};\n\nclass Column extends CoreFeature{\n\t\n\tstatic defaultOptionList = defaultColumnOptions;\n\t\n\tconstructor(def, parent, rowHeader){\n\t\tsuper(parent.table);\n\t\t\n\t\tthis.definition = def; //column definition\n\t\tthis.parent = parent; //hold parent object\n\t\tthis.type = \"column\"; //type of element\n\t\tthis.columns = []; //child columns\n\t\tthis.cells = []; //cells bound to this column\n\t\tthis.isGroup = false;\n\t\tthis.isRowHeader = rowHeader;\n\t\tthis.element = this.createElement(); //column header element\n\t\tthis.contentElement = false;\n\t\tthis.titleHolderElement = false;\n\t\tthis.titleElement = false;\n\t\tthis.groupElement = this.createGroupElement(); //column group holder element\n\t\tthis.hozAlign = \"\"; //horizontal text alignment\n\t\tthis.vertAlign = \"\"; //vert text alignment\n\t\t\n\t\t//multi dimensional filed handling\n\t\tthis.field =\"\";\n\t\tthis.fieldStructure = \"\";\n\t\tthis.getFieldValue = \"\";\n\t\tthis.setFieldValue = \"\";\n\t\t\n\t\tthis.titleDownload = null;\n\t\tthis.titleFormatterRendered = false;\n\t\t\n\t\tthis.mapDefinitions();\n\t\t\n\t\tthis.setField(this.definition.field);\n\t\t\n\t\tthis.modules = {}; //hold module variables;\n\t\t\n\t\tthis.width = null; //column width\n\t\tthis.widthStyled = \"\"; //column width pre-styled to improve render efficiency\n\t\tthis.maxWidth = null; //column maximum width\n\t\tthis.maxWidthStyled = \"\"; //column maximum pre-styled to improve render efficiency\n\t\tthis.maxInitialWidth = null;\n\t\tthis.minWidth = null; //column minimum width\n\t\tthis.minWidthStyled = \"\"; //column minimum pre-styled to improve render efficiency\n\t\tthis.widthFixed = false; //user has specified a width for this column\n\t\t\n\t\tthis.visible = true; //default visible state\n\t\t\n\t\tthis.component = null;\n\t\t\n\t\t//initialize column\n\t\tif(this.definition.columns){\n\t\t\t\n\t\t\tthis.isGroup = true;\n\t\t\t\n\t\t\tthis.definition.columns.forEach((def, i) => {\n\t\t\t\tvar newCol = new Column(def, this);\n\t\t\t\tthis.attachColumn(newCol);\n\t\t\t});\n\t\t\t\n\t\t\tthis.checkColumnVisibility();\n\t\t}else {\n\t\t\tparent.registerColumnField(this);\n\t\t}\n\t\t\n\t\tthis._initialize();\n\t}\n\t\n\tcreateElement (){\n\t\tvar el = document.createElement(\"div\");\n\t\t\n\t\tel.classList.add(\"tabulator-col\");\n\t\tel.setAttribute(\"role\", \"columnheader\");\n\t\tel.setAttribute(\"aria-sort\", \"none\");\n\n\t\tif(this.isRowHeader){\n\t\t\tel.classList.add(\"tabulator-row-header\");\n\t\t}\n\t\t\n\t\tswitch(this.table.options.columnHeaderVertAlign){\n\t\t\tcase \"middle\":\n\t\t\t\tel.style.justifyContent = \"center\";\n\t\t\t\tbreak;\n\t\t\tcase \"bottom\":\n\t\t\t\tel.style.justifyContent = \"flex-end\";\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\treturn el;\n\t}\n\t\n\tcreateGroupElement (){\n\t\tvar el = document.createElement(\"div\");\n\t\t\n\t\tel.classList.add(\"tabulator-col-group-cols\");\n\t\t\n\t\treturn el;\n\t}\n\t\n\tmapDefinitions(){\n\t\tvar defaults = this.table.options.columnDefaults;\n\t\t\n\t\t//map columnDefaults onto column definitions\n\t\tif(defaults){\n\t\t\tfor(let key in defaults){\n\t\t\t\tif(typeof this.definition[key] === \"undefined\"){\n\t\t\t\t\tthis.definition[key] = defaults[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tthis.definition = this.table.columnManager.optionsList.generate(Column.defaultOptionList, this.definition);\n\t}\n\t\n\tcheckDefinition(){\n\t\tObject.keys(this.definition).forEach((key) => {\n\t\t\tif(Column.defaultOptionList.indexOf(key) === -1){\n\t\t\t\tconsole.warn(\"Invalid column definition option in '\" + (this.field || this.definition.title) + \"' column:\", key);\n\t\t\t}\n\t\t});\n\t}\n\n\tsetField(field){\n\t\tthis.field = field;\n\t\tthis.fieldStructure = field ? (this.table.options.nestedFieldSeparator ? field.split(this.table.options.nestedFieldSeparator) : [field]) : [];\n\t\tthis.getFieldValue = this.fieldStructure.length > 1 ? this._getNestedData : this._getFlatData;\n\t\tthis.setFieldValue = this.fieldStructure.length > 1 ? this._setNestedData : this._setFlatData;\n\t}\n\t\n\t//register column position with column manager\n\tregisterColumnPosition(column){\n\t\tthis.parent.registerColumnPosition(column);\n\t}\n\t\n\t//register column position with column manager\n\tregisterColumnField(column){\n\t\tthis.parent.registerColumnField(column);\n\t}\n\t\n\t//trigger position registration\n\treRegisterPosition(){\n\t\tif(this.isGroup){\n\t\t\tthis.columns.forEach(function(column){\n\t\t\t\tcolumn.reRegisterPosition();\n\t\t\t});\n\t\t}else {\n\t\t\tthis.registerColumnPosition(this);\n\t\t}\n\t}\n\t\n\t//build header element\n\t_initialize(){\n\t\tvar def = this.definition;\n\t\t\n\t\twhile(this.element.firstChild) this.element.removeChild(this.element.firstChild);\n\t\t\n\t\tif(def.headerVertical){\n\t\t\tthis.element.classList.add(\"tabulator-col-vertical\");\n\t\t\t\n\t\t\tif(def.headerVertical === \"flip\"){\n\t\t\t\tthis.element.classList.add(\"tabulator-col-vertical-flip\");\n\t\t\t}\n\t\t}\n\t\t\n\t\tthis.contentElement = this._buildColumnHeaderContent();\n\t\t\n\t\tthis.element.appendChild(this.contentElement);\n\t\t\n\t\tif(this.isGroup){\n\t\t\tthis._buildGroupHeader();\n\t\t}else {\n\t\t\tthis._buildColumnHeader();\n\t\t}\n\t\t\n\t\tthis.dispatch(\"column-init\", this);\n\t}\n\t\n\t//build header element for header\n\t_buildColumnHeader(){\n\t\tvar def = this.definition;\n\t\t\n\t\tthis.dispatch(\"column-layout\", this);\n\t\t\n\t\t//set column visibility\n\t\tif(typeof def.visible != \"undefined\"){\n\t\t\tif(def.visible){\n\t\t\t\tthis.show(true);\n\t\t\t}else {\n\t\t\t\tthis.hide(true);\n\t\t\t}\n\t\t}\n\t\t\n\t\t//assign additional css classes to column header\n\t\tif(def.cssClass){\n\t\t\tvar classNames = def.cssClass.split(\" \");\n\t\t\tclassNames.forEach((className) => {\n\t\t\t\tthis.element.classList.add(className);\n\t\t\t});\n\t\t}\n\t\t\n\t\tif(def.field){\n\t\t\tthis.element.setAttribute(\"tabulator-field\", def.field);\n\t\t}\n\t\t\n\t\t//set min width if present\n\t\tthis.setMinWidth(parseInt(def.minWidth));\n\t\t\n\t\tif (def.maxInitialWidth) {\n\t\t\tthis.maxInitialWidth = parseInt(def.maxInitialWidth);\n\t\t}\n\t\t\n\t\tif(def.maxWidth){\n\t\t\tthis.setMaxWidth(parseInt(def.maxWidth));\n\t\t}\n\t\t\n\t\tthis.reinitializeWidth();\n\t\t\n\t\t//set horizontal text alignment\n\t\tthis.hozAlign = this.definition.hozAlign;\n\t\tthis.vertAlign = this.definition.vertAlign;\n\t\t\n\t\tthis.titleElement.style.textAlign = this.definition.headerHozAlign;\n\t}\n\t\n\t_buildColumnHeaderContent(){\n\t\tvar contentElement = document.createElement(\"div\");\n\t\tcontentElement.classList.add(\"tabulator-col-content\");\n\t\t\n\t\tthis.titleHolderElement = document.createElement(\"div\");\n\t\tthis.titleHolderElement.classList.add(\"tabulator-col-title-holder\");\n\t\t\n\t\tcontentElement.appendChild(this.titleHolderElement);\n\t\t\n\t\tthis.titleElement = this._buildColumnHeaderTitle();\n\t\t\n\t\tthis.titleHolderElement.appendChild(this.titleElement);\n\t\t\n\t\treturn contentElement;\n\t}\n\t\n\t//build title element of column\n\t_buildColumnHeaderTitle(){\n\t\tvar def = this.definition;\n\t\t\n\t\tvar titleHolderElement = document.createElement(\"div\");\n\t\ttitleHolderElement.classList.add(\"tabulator-col-title\");\n\t\t\n\t\tif(def.headerWordWrap){\n\t\t\ttitleHolderElement.classList.add(\"tabulator-col-title-wrap\");\n\t\t}\n\t\t\n\t\tif(def.editableTitle){\n\t\t\tvar titleElement = document.createElement(\"input\");\n\t\t\ttitleElement.classList.add(\"tabulator-title-editor\");\n\t\t\t\n\t\t\ttitleElement.addEventListener(\"click\", (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\ttitleElement.focus();\n\t\t\t});\n\t\t\t\n\t\t\ttitleElement.addEventListener(\"mousedown\", (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t});\n\t\t\t\n\t\t\ttitleElement.addEventListener(\"change\", () => {\n\t\t\t\tdef.title = titleElement.value;\n\t\t\t\tthis.dispatchExternal(\"columnTitleChanged\", this.getComponent());\n\t\t\t});\n\t\t\t\n\t\t\ttitleHolderElement.appendChild(titleElement);\n\t\t\t\n\t\t\tif(def.field){\n\t\t\t\tthis.langBind(\"columns|\" + def.field, (text) => {\n\t\t\t\t\ttitleElement.value = text || (def.title || \"&nbsp;\");\n\t\t\t\t});\n\t\t\t}else {\n\t\t\t\ttitleElement.value = def.title || \"&nbsp;\";\n\t\t\t}\n\t\t\t\n\t\t}else {\n\t\t\tif(def.field){\n\t\t\t\tthis.langBind(\"columns|\" + def.field, (text) => {\n\t\t\t\t\tthis._formatColumnHeaderTitle(titleHolderElement, text || (def.title || \"&nbsp;\"));\n\t\t\t\t});\n\t\t\t}else {\n\t\t\t\tthis._formatColumnHeaderTitle(titleHolderElement, def.title || \"&nbsp;\");\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn titleHolderElement;\n\t}\n\t\n\t_formatColumnHeaderTitle(el, title){\n\t\tvar contents = this.chain(\"column-format\", [this, title, el], null, () => {\n\t\t\treturn title;\n\t\t});\n\t\t\n\t\tswitch(typeof contents){\n\t\t\tcase \"object\":\n\t\t\t\tif(contents instanceof Node){\n\t\t\t\t\tel.appendChild(contents);\n\t\t\t\t}else {\n\t\t\t\t\tel.innerHTML = \"\";\n\t\t\t\t\tconsole.warn(\"Format Error - Title formatter has returned a type of object, the only valid formatter object return is an instance of Node, the formatter returned:\", contents);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"undefined\":\n\t\t\t\tel.innerHTML = \"\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tel.innerHTML = contents;\n\t\t}\n\t}\n\t\n\t//build header element for column group\n\t_buildGroupHeader(){\n\t\tthis.element.classList.add(\"tabulator-col-group\");\n\t\tthis.element.setAttribute(\"role\", \"columngroup\");\n\t\tthis.element.setAttribute(\"aria-title\", this.definition.title);\n\t\t\n\t\t//asign additional css classes to column header\n\t\tif(this.definition.cssClass){\n\t\t\tvar classNames = this.definition.cssClass.split(\" \");\n\t\t\tclassNames.forEach((className) => {\n\t\t\t\tthis.element.classList.add(className);\n\t\t\t});\n\t\t}\n\t\t\n\t\tthis.titleElement.style.textAlign = this.definition.headerHozAlign;\n\t\t\n\t\tthis.element.appendChild(this.groupElement);\n\t}\n\t\n\t//flat field lookup\n\t_getFlatData(data){\n\t\treturn data[this.field];\n\t}\n\t\n\t//nested field lookup\n\t_getNestedData(data){\n\t\tvar dataObj = data,\n\t\tstructure = this.fieldStructure,\n\t\tlength = structure.length,\n\t\toutput;\n\t\t\n\t\tfor(let i = 0; i < length; i++){\n\t\t\t\n\t\t\tdataObj = dataObj[structure[i]];\n\t\t\t\n\t\t\toutput = dataObj;\n\t\t\t\n\t\t\tif(!dataObj){\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn output;\n\t}\n\t\n\t//flat field set\n\t_setFlatData(data, value){\n\t\tif(this.field){\n\t\t\tdata[this.field] = value;\n\t\t}\n\t}\n\t\n\t//nested field set\n\t_setNestedData(data, value){\n\t\tvar dataObj = data,\n\t\tstructure = this.fieldStructure,\n\t\tlength = structure.length;\n\t\t\n\t\tfor(let i = 0; i < length; i++){\n\t\t\t\n\t\t\tif(i == length -1){\n\t\t\t\tdataObj[structure[i]] = value;\n\t\t\t}else {\n\t\t\t\tif(!dataObj[structure[i]]){\n\t\t\t\t\tif(typeof value !== \"undefined\"){\n\t\t\t\t\t\tdataObj[structure[i]] = {};\n\t\t\t\t\t}else {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tdataObj = dataObj[structure[i]];\n\t\t\t}\n\t\t}\n\t}\n\t\n\t//attach column to this group\n\tattachColumn(column){\n\t\tif(this.groupElement){\n\t\t\tthis.columns.push(column);\n\t\t\tthis.groupElement.appendChild(column.getElement());\n\t\t\t\n\t\t\tcolumn.columnRendered();\n\t\t}else {\n\t\t\tconsole.warn(\"Column Warning - Column being attached to another column instead of column group\");\n\t\t}\n\t}\n\t\n\t//vertically align header in column\n\tverticalAlign(alignment, height){\n\t\t\n\t\t//calculate height of column header and group holder element\n\t\tvar parentHeight = this.parent.isGroup ? this.parent.getGroupElement().clientHeight : (height || this.parent.getHeadersElement().clientHeight);\n\t\t// var parentHeight = this.parent.isGroup ? this.parent.getGroupElement().clientHeight : this.parent.getHeadersElement().clientHeight;\n\t\t\n\t\tthis.element.style.height = parentHeight + \"px\";\n\t\t\n\t\tthis.dispatch(\"column-height\", this, this.element.style.height);\n\t\t\n\t\tif(this.isGroup){\n\t\t\tthis.groupElement.style.minHeight = (parentHeight - this.contentElement.offsetHeight) + \"px\";\n\t\t}\n\t\t\n\t\t//vertically align cell contents\n\t\t// if(!this.isGroup && alignment !== \"top\"){\n\t\t// \tif(alignment === \"bottom\"){\n\t\t// \t\tthis.element.style.paddingTop = (this.element.clientHeight - this.contentElement.offsetHeight) + \"px\";\n\t\t// \t}else{\n\t\t// \t\tthis.element.style.paddingTop = ((this.element.clientHeight - this.contentElement.offsetHeight) / 2) + \"px\";\n\t\t// \t}\n\t\t// }\n\t\t\n\t\tthis.columns.forEach(function(column){\n\t\t\tcolumn.verticalAlign(alignment);\n\t\t});\n\t}\n\t\n\t//clear vertical alignment\n\tclearVerticalAlign(){\n\t\tthis.element.style.paddingTop = \"\";\n\t\tthis.element.style.height = \"\";\n\t\tthis.element.style.minHeight = \"\";\n\t\tthis.groupElement.style.minHeight = \"\";\n\t\t\n\t\tthis.columns.forEach(function(column){\n\t\t\tcolumn.clearVerticalAlign();\n\t\t});\n\t\t\n\t\tthis.dispatch(\"column-height\", this, \"\");\n\t}\n\t\n\t//// Retrieve Column Information ////\n\t//return column header element\n\tgetElement(){\n\t\treturn this.element;\n\t}\n\t\n\t//return column group element\n\tgetGroupElement(){\n\t\treturn this.groupElement;\n\t}\n\t\n\t//return field name\n\tgetField(){\n\t\treturn this.field;\n\t}\n\t\n\tgetTitleDownload() {\n\t\treturn this.titleDownload;\n\t}\n\t\n\t//return the first column in a group\n\tgetFirstColumn(){\n\t\tif(!this.isGroup){\n\t\t\treturn this;\n\t\t}else {\n\t\t\tif(this.columns.length){\n\t\t\t\treturn this.columns[0].getFirstColumn();\n\t\t\t}else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t//return the last column in a group\n\tgetLastColumn(){\n\t\tif(!this.isGroup){\n\t\t\treturn this;\n\t\t}else {\n\t\t\tif(this.columns.length){\n\t\t\t\treturn this.columns[this.columns.length -1].getLastColumn();\n\t\t\t}else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t//return all columns in a group\n\tgetColumns(traverse){\n\t\tvar columns = [];\n\t\t\n\t\tif(traverse){\n\t\t\tthis.columns.forEach((column) => {\n\t\t\t\tcolumns.push(column);\n\t\t\t\t\n\t\t\t\tcolumns = columns.concat(column.getColumns(true));\n\t\t\t});\n\t\t}else {\n\t\t\tcolumns = this.columns;\n\t\t}\n\t\t\n\t\treturn columns;\n\t}\n\t\n\t//return all columns in a group\n\tgetCells(){\n\t\treturn this.cells;\n\t}\n\t\n\t//retrieve the top column in a group of columns\n\tgetTopColumn(){\n\t\tif(this.parent.isGroup){\n\t\t\treturn this.parent.getTopColumn();\n\t\t}else {\n\t\t\treturn this;\n\t\t}\n\t}\n\t\n\t//return column definition object\n\tgetDefinition(updateBranches){\n\t\tvar colDefs = [];\n\t\t\n\t\tif(this.isGroup && updateBranches){\n\t\t\tthis.columns.forEach(function(column){\n\t\t\t\tcolDefs.push(column.getDefinition(true));\n\t\t\t});\n\t\t\t\n\t\t\tthis.definition.columns = colDefs;\n\t\t}\n\t\t\n\t\treturn this.definition;\n\t}\n\t\n\t//////////////////// Actions ////////////////////\n\tcheckColumnVisibility(){\n\t\tvar visible = false;\n\t\t\n\t\tthis.columns.forEach(function(column){\n\t\t\tif(column.visible){\n\t\t\t\tvisible = true;\n\t\t\t}\n\t\t});\n\t\t\n\t\tif(visible){\n\t\t\tthis.show();\n\t\t\tthis.dispatchExternal(\"columnVisibilityChanged\", this.getComponent(), false);\n\t\t}else {\n\t\t\tthis.hide();\n\t\t}\n\t}\n\t\n\t//show column\n\tshow(silent, responsiveToggle){\n\t\tif(!this.visible){\n\t\t\tthis.visible = true;\n\t\t\t\n\t\t\tthis.element.style.display = \"\";\n\t\t\t\n\t\t\tif(this.parent.isGroup){\n\t\t\t\tthis.parent.checkColumnVisibility();\n\t\t\t}\n\t\t\t\n\t\t\tthis.cells.forEach(function(cell){\n\t\t\t\tcell.show();\n\t\t\t});\n\t\t\t\n\t\t\tif(!this.isGroup && this.width === null){\n\t\t\t\tthis.reinitializeWidth();\n\t\t\t}\n\t\t\t\n\t\t\tthis.table.columnManager.verticalAlignHeaders();\n\t\t\t\n\t\t\tthis.dispatch(\"column-show\", this, responsiveToggle);\n\t\t\t\n\t\t\tif(!silent){\n\t\t\t\tthis.dispatchExternal(\"columnVisibilityChanged\", this.getComponent(), true);\n\t\t\t}\n\t\t\t\n\t\t\tif(this.parent.isGroup){\n\t\t\t\tthis.parent.matchChildWidths();\n\t\t\t}\n\t\t\t\n\t\t\tif(!this.silent){\n\t\t\t\tthis.table.columnManager.rerenderColumns();\n\t\t\t}\n\t\t}\n\t}\n\t\n\t//hide column\n\thide(silent, responsiveToggle){\n\t\tif(this.visible){\n\t\t\tthis.visible = false;\n\t\t\t\n\t\t\tthis.element.style.display = \"none\";\n\t\t\t\n\t\t\tthis.table.columnManager.verticalAlignHeaders();\n\t\t\t\n\t\t\tif(this.parent.isGroup){\n\t\t\t\tthis.parent.checkColumnVisibility();\n\t\t\t}\n\t\t\t\n\t\t\tthis.cells.forEach(function(cell){\n\t\t\t\tcell.hide();\n\t\t\t});\n\t\t\t\n\t\t\tthis.dispatch(\"column-hide\", this, responsiveToggle);\n\t\t\t\n\t\t\tif(!silent){\n\t\t\t\tthis.dispatchExternal(\"columnVisibilityChanged\", this.getComponent(), false);\n\t\t\t}\n\t\t\t\n\t\t\tif(this.parent.isGroup){\n\t\t\t\tthis.parent.matchChildWidths();\n\t\t\t}\n\t\t\t\n\t\t\tif(!this.silent){\n\t\t\t\tthis.table.columnManager.rerenderColumns();\n\t\t\t}\n\t\t}\n\t}\n\t\n\tmatchChildWidths(){\n\t\tvar childWidth = 0;\n\t\t\n\t\tif(this.contentElement && this.columns.length){\n\t\t\tthis.columns.forEach(function(column){\n\t\t\t\tif(column.visible){\n\t\t\t\t\tchildWidth += column.getWidth();\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tthis.contentElement.style.maxWidth = (childWidth - 1) + \"px\";\n\t\t\tif (this.table.initialized) {\n\t\t\t\tthis.element.style.width = childWidth + \"px\";\n\t\t\t}\n\t\t\t\n\t\t\tif(this.parent.isGroup){\n\t\t\t\tthis.parent.matchChildWidths();\n\t\t\t}\n\t\t}\n\t}\n\t\n\tremoveChild(child){\n\t\tvar index = this.columns.indexOf(child);\n\t\t\n\t\tif(index > -1){\n\t\t\tthis.columns.splice(index, 1);\n\t\t}\n\t\t\n\t\tif(!this.columns.length){\n\t\t\tthis.delete();\n\t\t}\n\t}\n\t\n\tsetWidth(width){\n\t\tthis.widthFixed = true;\n\t\tthis.setWidthActual(width);\n\t}\n\t\n\tsetWidthActual(width){\n\t\tif(isNaN(width)){\n\t\t\twidth = Math.floor((this.table.element.clientWidth/100) * parseInt(width));\n\t\t}\n\t\t\n\t\twidth = Math.max(this.minWidth, width);\n\t\t\n\t\tif(this.maxWidth){\n\t\t\twidth = Math.min(this.maxWidth, width);\n\t\t}\n\t\t\n\t\tthis.width = width;\n\t\tthis.widthStyled = width ? width + \"px\" : \"\";\n\t\t\n\t\tthis.element.style.width = this.widthStyled;\n\t\t\n\t\tif(!this.isGroup){\n\t\t\tthis.cells.forEach(function(cell){\n\t\t\t\tcell.setWidth();\n\t\t\t});\n\t\t}\n\t\t\n\t\tif(this.parent.isGroup){\n\t\t\tthis.parent.matchChildWidths();\n\t\t}\n\t\t\n\t\tthis.dispatch(\"column-width\", this);\n\t\t\n\t\tif(this.subscribedExternal(\"columnWidth\")){\n\t\t\tthis.dispatchExternal(\"columnWidth\", this.getComponent());\n\t\t}\n\t}\n\t\n\tcheckCellHeights(){\n\t\tvar rows = [];\n\t\t\n\t\tthis.cells.forEach(function(cell){\n\t\t\tif(cell.row.heightInitialized){\n\t\t\t\tif(cell.row.getElement().offsetParent !== null){\n\t\t\t\t\trows.push(cell.row);\n\t\t\t\t\tcell.row.clearCellHeight();\n\t\t\t\t}else {\n\t\t\t\t\tcell.row.heightInitialized = false;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t\n\t\trows.forEach(function(row){\n\t\t\trow.calcHeight();\n\t\t});\n\t\t\n\t\trows.forEach(function(row){\n\t\t\trow.setCellHeight();\n\t\t});\n\t}\n\t\n\tgetWidth(){\n\t\tvar width = 0;\n\t\t\n\t\tif(this.isGroup){\n\t\t\tthis.columns.forEach(function(column){\n\t\t\t\tif(column.visible){\n\t\t\t\t\twidth += column.getWidth();\n\t\t\t\t}\n\t\t\t});\n\t\t}else {\n\t\t\twidth = this.width;\n\t\t}\n\t\t\n\t\treturn width;\n\t}\n\t\n\tgetLeftOffset(){\n\t\tvar offset = this.element.offsetLeft;\n\t\t\n\t\tif(this.parent.isGroup){\n\t\t\toffset += this.parent.getLeftOffset();\n\t\t}\n\t\t\n\t\treturn offset;\n\t}\n\t\n\tgetHeight(){\n\t\treturn Math.ceil(this.element.getBoundingClientRect().height);\n\t}\n\t\n\tsetMinWidth(minWidth){\n\t\tif(this.maxWidth && minWidth > this.maxWidth){\n\t\t\tminWidth = this.maxWidth;\n\t\t\t\n\t\t\tconsole.warn(\"the minWidth (\"+ minWidth + \"px) for column '\" + this.field + \"' cannot be bigger that its maxWidth (\"+ this.maxWidthStyled + \")\");\n\t\t}\n\t\t\n\t\tthis.minWidth = minWidth;\n\t\tthis.minWidthStyled = minWidth ? minWidth + \"px\" : \"\";\n\t\t\n\t\tthis.element.style.minWidth = this.minWidthStyled;\n\t\t\n\t\tthis.cells.forEach(function(cell){\n\t\t\tcell.setMinWidth();\n\t\t});\n\t}\n\t\n\tsetMaxWidth(maxWidth){\n\t\tif(this.minWidth && maxWidth < this.minWidth){\n\t\t\tmaxWidth = this.minWidth;\n\t\t\t\n\t\t\tconsole.warn(\"the maxWidth (\"+ maxWidth + \"px) for column '\" + this.field + \"' cannot be smaller that its minWidth (\"+ this.minWidthStyled + \")\");\n\t\t}\n\t\t\n\t\tthis.maxWidth = maxWidth;\n\t\tthis.maxWidthStyled = maxWidth ? maxWidth + \"px\" : \"\";\n\t\t\n\t\tthis.element.style.maxWidth = this.maxWidthStyled;\n\t\t\n\t\tthis.cells.forEach(function(cell){\n\t\t\tcell.setMaxWidth();\n\t\t});\n\t}\n\t\n\tdelete(){\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif(this.isGroup){\n\t\t\t\tthis.columns.forEach(function(column){\n\t\t\t\t\tcolumn.delete();\n\t\t\t\t});\n\t\t\t}\n\t\t\t\n\t\t\tthis.dispatch(\"column-delete\", this);\n\t\t\t\n\t\t\tvar cellCount = this.cells.length;\n\t\t\t\n\t\t\tfor(let i = 0; i < cellCount; i++){\n\t\t\t\tthis.cells[0].delete();\n\t\t\t}\n\t\t\t\n\t\t\tif(this.element.parentNode){\n\t\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t\t}\n\t\t\t\n\t\t\tthis.element = false;\n\t\t\tthis.contentElement = false;\n\t\t\tthis.titleElement = false;\n\t\t\tthis.groupElement = false;\n\t\t\t\n\t\t\tif(this.parent.isGroup){\n\t\t\t\tthis.parent.removeChild(this);\n\t\t\t}\n\t\t\t\n\t\t\tthis.table.columnManager.deregisterColumn(this);\n\t\t\t\n\t\t\tthis.table.columnManager.rerenderColumns(true);\n\t\t\t\n\t\t\tthis.dispatch(\"column-deleted\", this);\n\t\t\t\n\t\t\tresolve();\n\t\t});\n\t}\n\t\n\tcolumnRendered(){\n\t\tif(this.titleFormatterRendered){\n\t\t\tthis.titleFormatterRendered();\n\t\t}\n\t\t\n\t\tthis.dispatch(\"column-rendered\", this);\n\t}\n\t\n\t//////////////// Cell Management /////////////////\n\t//generate cell for this column\n\tgenerateCell(row){\n\t\tvar cell = new Cell(this, row);\n\t\t\n\t\tthis.cells.push(cell);\n\t\t\n\t\treturn cell;\n\t}\n\t\n\tnextColumn(){\n\t\tvar index = this.table.columnManager.findColumnIndex(this);\n\t\treturn index > -1 ? this._nextVisibleColumn(index + 1) : false;\n\t}\n\t\n\t_nextVisibleColumn(index){\n\t\tvar column = this.table.columnManager.getColumnByIndex(index);\n\t\treturn !column || column.visible ? column : this._nextVisibleColumn(index + 1);\n\t}\n\t\n\tprevColumn(){\n\t\tvar index = this.table.columnManager.findColumnIndex(this);\n\t\treturn index > -1 ? this._prevVisibleColumn(index - 1) : false;\n\t}\n\t\n\t_prevVisibleColumn(index){\n\t\tvar column = this.table.columnManager.getColumnByIndex(index);\n\t\treturn !column || column.visible ? column : this._prevVisibleColumn(index - 1);\n\t}\n\t\n\treinitializeWidth(force){\n\t\tthis.widthFixed = false;\n\t\t\n\t\t//set width if present\n\t\tif(typeof this.definition.width !== \"undefined\" && !force){\n\t\t\t// maxInitialWidth ignored here as width specified\n\t\t\tthis.setWidth(this.definition.width);\n\t\t}\n\t\t\n\t\tthis.dispatch(\"column-width-fit-before\", this);\n\t\t\n\t\tthis.fitToData(force);\n\t\t\n\t\tthis.dispatch(\"column-width-fit-after\", this);\n\t}\n\t\n\t//set column width to maximum cell width for non group columns\n\tfitToData(force){\n\t\tif(this.isGroup){\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif(!this.widthFixed){\n\t\t\tthis.element.style.width = \"\";\n\t\t\t\n\t\t\tthis.cells.forEach((cell) => {\n\t\t\t\tcell.clearWidth();\n\t\t\t});\n\t\t}\n\t\t\n\t\tvar maxWidth = this.element.offsetWidth;\n\t\t\n\t\tif(!this.width || !this.widthFixed){\n\t\t\tthis.cells.forEach((cell) => {\n\t\t\t\tvar width = cell.getWidth();\n\t\t\t\t\n\t\t\t\tif(width > maxWidth){\n\t\t\t\t\tmaxWidth = width;\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tif(maxWidth){\n\t\t\t\tvar setTo = maxWidth + 1;\n\t\t\t\t\n\t\t\t\tif(force){\n\t\t\t\t\tthis.setWidth(setTo);\n\t\t\t\t}else {\n\t\t\t\t\tif (this.maxInitialWidth && !force) {\n\t\t\t\t\t\tsetTo = Math.min(setTo, this.maxInitialWidth);\n\t\t\t\t\t}\n\t\t\t\t\tthis.setWidthActual(setTo);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tupdateDefinition(updates){\n\t\tvar definition;\n\t\t\n\t\tif(!this.isGroup){\n\t\t\tif(!this.parent.isGroup){\n\t\t\t\tdefinition = Object.assign({}, this.getDefinition());\n\t\t\t\tdefinition = Object.assign(definition, updates);\n\t\t\t\t\n\t\t\t\treturn this.table.columnManager.addColumn(definition, false, this)\n\t\t\t\t\t.then((column) => {\n\t\t\t\t\t\n\t\t\t\t\t\tif(definition.field == this.field){\n\t\t\t\t\t\t\tthis.field = false; //clear field name to prevent deletion of duplicate column from arrays\n\t\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\treturn this.delete()\n\t\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t\treturn column.getComponent();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t}else {\n\t\t\t\tconsole.error(\"Column Update Error - The updateDefinition function is only available on ungrouped columns\");\n\t\t\t\treturn Promise.reject(\"Column Update Error - The updateDefinition function is only available on columns, not column groups\");\n\t\t\t}\n\t\t}else {\n\t\t\tconsole.error(\"Column Update Error - The updateDefinition function is only available on ungrouped columns\");\n\t\t\treturn Promise.reject(\"Column Update Error - The updateDefinition function is only available on columns, not column groups\");\n\t\t}\n\t}\n\t\n\tdeleteCell(cell){\n\t\tvar index = this.cells.indexOf(cell);\n\t\t\n\t\tif(index > -1){\n\t\t\tthis.cells.splice(index, 1);\n\t\t}\n\t}\n\t\n\t//////////////// Object Generation /////////////////\n\tgetComponent(){\n\t\tif(!this.component){\n\t\t\tthis.component = new ColumnComponent(this);\n\t\t}\n\t\t\n\t\treturn this.component;\n\t}\n\t\n\tgetPosition(){\n\t\treturn this.table.columnManager.getVisibleColumnsByIndex().indexOf(this) + 1;\n\t}\n\t\n\tgetParentComponent(){\n\t\treturn this.parent instanceof Column ? this.parent.getComponent() : false;\n\t}\n}\n\n//public row object\nclass RowComponent {\n\n\tconstructor (row){\n\t\tthis._row = row;\n\n\t\treturn new Proxy(this, {\n\t\t\tget: function(target, name, receiver) {\n\t\t\t\tif (typeof target[name] !== \"undefined\") {\n\t\t\t\t\treturn target[name];\n\t\t\t\t}else {\n\t\t\t\t\treturn target._row.table.componentFunctionBinder.handle(\"row\", target._row, name);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tgetData(transform){\n\t\treturn this._row.getData(transform);\n\t}\n\n\tgetElement(){\n\t\treturn this._row.getElement();\n\t}\n\n\tgetCells(){\n\t\tvar cells = [];\n\n\t\tthis._row.getCells().forEach(function(cell){\n\t\t\tcells.push(cell.getComponent());\n\t\t});\n\n\t\treturn cells;\n\t}\n\n\tgetCell(column){\n\t\tvar cell = this._row.getCell(column);\n\t\treturn cell ? cell.getComponent() : false;\n\t}\n\n\tgetIndex(){\n\t\treturn this._row.getData(\"data\")[this._row.table.options.index];\n\t}\n\n\tgetPosition(){\n\t\treturn this._row.getPosition();\n\t}\n\n\twatchPosition(callback){\n\t\treturn this._row.watchPosition(callback);\n\t}\n\n\tdelete(){\n\t\treturn this._row.delete();\n\t}\n\n\tscrollTo(position, ifVisible){\n\t\treturn this._row.table.rowManager.scrollToRow(this._row, position, ifVisible);\n\t}\n\n\tmove(to, after){\n\t\tthis._row.moveToRow(to, after);\n\t}\n\n\tupdate(data){\n\t\treturn this._row.updateData(data);\n\t}\n\n\tnormalizeHeight(){\n\t\tthis._row.normalizeHeight(true);\n\t}\n\n\t_getSelf(){\n\t\treturn this._row;\n\t}\n\n\treformat(){\n\t\treturn this._row.reinitialize();\n\t}\n\n\tgetTable(){\n\t\treturn this._row.table;\n\t}\n\n\tgetNextRow(){\n\t\tvar row = this._row.nextRow();\n\t\treturn row ? row.getComponent() : row;\n\t}\n\n\tgetPrevRow(){\n\t\tvar row = this._row.prevRow();\n\t\treturn row ? row.getComponent() : row;\n\t}\n}\n\nclass Row extends CoreFeature{\n\tconstructor (data, parent, type = \"row\"){\n\t\tsuper(parent.table);\n\t\t\n\t\tthis.parent = parent;\n\t\tthis.data = {};\n\t\tthis.type = type; //type of element\n\t\tthis.element = false;\n\t\tthis.modules = {}; //hold module variables;\n\t\tthis.cells = [];\n\t\tthis.height = 0; //hold element height\n\t\tthis.heightStyled = \"\"; //hold element height pre-styled to improve render efficiency\n\t\tthis.manualHeight = false; //user has manually set row height\n\t\tthis.outerHeight = 0; //hold elements outer height\n\t\tthis.initialized = false; //element has been rendered\n\t\tthis.heightInitialized = false; //element has resized cells to fit\n\t\tthis.position = 0; //store position of element in row list\n\t\tthis.positionWatchers = [];\n\t\t\n\t\tthis.component = null;\n\t\t\n\t\tthis.created = false;\n\t\t\n\t\tthis.setData(data);\n\t}\n\t\n\tcreate(){\n\t\tif(!this.created){\n\t\t\tthis.created = true;\n\t\t\tthis.generateElement();\n\t\t}\n\t}\n\t\n\tcreateElement (){\n\t\tvar el = document.createElement(\"div\");\n\t\t\n\t\tel.classList.add(\"tabulator-row\");\n\t\tel.setAttribute(\"role\", \"row\");\n\t\t\n\t\tthis.element = el;\n\t}\n\t\n\tgetElement(){\n\t\tthis.create();\n\t\treturn this.element;\n\t}\n\t\n\tdetachElement(){\n\t\tif (this.element && this.element.parentNode){\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n\t\n\tgenerateElement(){\n\t\tthis.createElement();\n\t\tthis.dispatch(\"row-init\", this);\n\t}\n\t\n\tgenerateCells(){\n\t\tthis.cells = this.table.columnManager.generateCells(this);\n\t}\n\t\n\t//functions to setup on first render\n\tinitialize(force, inFragment){\n\t\tthis.create();\n\t\t\n\t\tif(!this.initialized || force){\n\t\t\t\n\t\t\tthis.deleteCells();\n\t\t\t\n\t\t\twhile(this.element.firstChild) this.element.removeChild(this.element.firstChild);\n\t\t\t\n\t\t\tthis.dispatch(\"row-layout-before\", this);\n\t\t\t\n\t\t\tthis.generateCells();\n\t\t\t\n\t\t\tthis.initialized = true;\n\t\t\t\n\t\t\tthis.table.columnManager.renderer.renderRowCells(this, inFragment);\n\t\t\t\n\t\t\tif(force){\n\t\t\t\tthis.normalizeHeight();\n\t\t\t}\n\t\t\t\n\t\t\tthis.dispatch(\"row-layout\", this);\n\t\t\t\n\t\t\tif(this.table.options.rowFormatter){\n\t\t\t\tthis.table.options.rowFormatter(this.getComponent());\n\t\t\t}\n\t\t\t\n\t\t\tthis.dispatch(\"row-layout-after\", this);\n\t\t}else {\n\t\t\tthis.table.columnManager.renderer.rerenderRowCells(this, inFragment);\n\t\t}\n\t}\n\n\trendered(){\n\t\tthis.cells.forEach((cell) => {\n\t\t\tcell.cellRendered();\n\t\t});\n\t}\n\t\n\treinitializeHeight(){\n\t\tthis.heightInitialized = false;\n\t\t\n\t\tif(this.element && this.element.offsetParent !== null){\n\t\t\tthis.normalizeHeight(true);\n\t\t}\n\t}\n\n\tdeinitialize(){\n\t\tthis.initialized = false;\n\t}\n\t\n\tdeinitializeHeight(){\n\t\tthis.heightInitialized = false;\n\t}\n\t\n\treinitialize(children){\n\t\tthis.initialized = false;\n\t\tthis.heightInitialized = false;\n\t\t\n\t\tif(!this.manualHeight){\n\t\t\tthis.height = 0;\n\t\t\tthis.heightStyled = \"\";\n\t\t}\n\t\t\n\t\tif(this.element && this.element.offsetParent !== null){\n\t\t\tthis.initialize(true);\n\t\t}\n\t\t\n\t\tthis.dispatch(\"row-relayout\", this);\n\t}\n\t\n\t//get heights when doing bulk row style calcs in virtual DOM\n\tcalcHeight(force){\n\t\tvar maxHeight = 0, minHeight = 0;\n\n\t\tif(this.table.options.rowHeight){\n\t\t\tthis.height = this.table.options.rowHeight;\n\t\t}else {\n\t\t\tminHeight = this.calcMinHeight();\n\t\t\tmaxHeight = this.calcMaxHeight();\n\t\t\t\n\t\t\tif(force){\n\t\t\t\tthis.height = Math.max(maxHeight, minHeight);\n\t\t\t}else {\n\t\t\t\tthis.height = this.manualHeight ? this.height : Math.max(maxHeight, minHeight);\n\t\t\t}\n\t\t}\n\t\t\n\t\tthis.heightStyled = this.height ? this.height + \"px\" : \"\";\n\t\tthis.outerHeight = this.element.offsetHeight;\n\t}\n\n\tcalcMinHeight(){\n\t\treturn this.table.options.resizableRows ? this.element.clientHeight : 0;\n\t}\n\n\tcalcMaxHeight(){\n\t\tvar maxHeight = 0;\n\n\t\tthis.cells.forEach(function(cell){\n\t\t\tvar height = cell.getHeight();\n\n\t\t\tif(height > maxHeight){\n\t\t\t\tmaxHeight = height;\n\t\t\t}\n\t\t});\n\n\t\treturn maxHeight;\n\t}\n\t\n\t//set of cells\n\tsetCellHeight(){\n\t\tthis.cells.forEach(function(cell){\n\t\t\tcell.setHeight();\n\t\t});\n\t\t\n\t\tthis.heightInitialized = true;\n\t}\n\t\n\tclearCellHeight(){\n\t\tthis.cells.forEach(function(cell){\n\t\t\tcell.clearHeight();\n\t\t});\n\t}\n\t\n\t//normalize the height of elements in the row\n\tnormalizeHeight(force){\n\t\tif(force && !this.table.options.rowHeight){\n\t\t\tthis.clearCellHeight();\n\t\t}\n\t\t\n\t\tthis.calcHeight(force);\n\t\t\n\t\tthis.setCellHeight();\n\t}\n\t\n\t//set height of rows\n\tsetHeight(height, force){\n\t\tif(this.height != height || force){\n\t\t\t\n\t\t\tthis.manualHeight = true;\n\t\t\t\n\t\t\tthis.height = height;\n\t\t\tthis.heightStyled = height ? height + \"px\" : \"\";\n\t\t\t\n\t\t\tthis.setCellHeight();\n\t\t\t\n\t\t\t// this.outerHeight = this.element.outerHeight();\n\t\t\tthis.outerHeight = this.element.offsetHeight;\n\n\t\t\tif(this.subscribedExternal(\"rowHeight\")){\n\t\t\t\tthis.dispatchExternal(\"rowHeight\", this.getComponent());\n\t\t\t}\n\t\t}\n\t}\n\t\n\t//return rows outer height\n\tgetHeight(){\n\t\treturn this.outerHeight;\n\t}\n\t\n\t//return rows outer Width\n\tgetWidth(){\n\t\treturn this.element.offsetWidth;\n\t}\n\t\n\t//////////////// Cell Management /////////////////\n\tdeleteCell(cell){\n\t\tvar index = this.cells.indexOf(cell);\n\t\t\n\t\tif(index > -1){\n\t\t\tthis.cells.splice(index, 1);\n\t\t}\n\t}\n\t\n\t//////////////// Data Management /////////////////\n\tsetData(data){\n\t\tthis.data = this.chain(\"row-data-init-before\", [this, data], undefined, data);\n\t\t\n\t\tthis.dispatch(\"row-data-init-after\", this);\n\t}\n\t\n\t//update the rows data\n\tupdateData(updatedData){\n\t\tvar visible = this.element && Helpers.elVisible(this.element),\n\t\ttempData = {},\n\t\tnewRowData;\n\t\t\n\t\treturn new Promise((resolve, reject) => {\n\t\t\t\n\t\t\tif(typeof updatedData === \"string\"){\n\t\t\t\tupdatedData = JSON.parse(updatedData);\n\t\t\t}\n\t\t\t\n\t\t\tthis.dispatch(\"row-data-save-before\", this);\n\t\t\t\n\t\t\tif(this.subscribed(\"row-data-changing\")){\n\t\t\t\ttempData = Object.assign(tempData, this.data);\n\t\t\t\ttempData = Object.assign(tempData, updatedData);\n\t\t\t}\n\t\t\t\n\t\t\tnewRowData = this.chain(\"row-data-changing\", [this, tempData, updatedData], null, updatedData);\n\t\t\t\n\t\t\t//set data\n\t\t\tfor (let attrname in newRowData) {\n\t\t\t\tthis.data[attrname] = newRowData[attrname];\n\t\t\t}\n\t\t\t\n\t\t\tthis.dispatch(\"row-data-save-after\", this);\n\t\t\t\n\t\t\t//update affected cells only\n\t\t\tfor (let attrname in updatedData) {\n\t\t\t\t\n\t\t\t\tlet columns = this.table.columnManager.getColumnsByFieldRoot(attrname);\n\t\t\t\t\n\t\t\t\tcolumns.forEach((column) => {\n\t\t\t\t\tlet cell = this.getCell(column.getField());\n\t\t\t\t\t\n\t\t\t\t\tif(cell){\n\t\t\t\t\t\tlet value = column.getFieldValue(newRowData);\n\t\t\t\t\t\tif(cell.getValue() !== value){\n\t\t\t\t\t\t\tcell.setValueProcessData(value);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(visible){\n\t\t\t\t\t\t\t\tcell.cellRendered();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\t\n\t\t\t//Partial reinitialization if visible\n\t\t\tif(visible){\n\t\t\t\tthis.normalizeHeight(true);\n\t\t\t\t\n\t\t\t\tif(this.table.options.rowFormatter){\n\t\t\t\t\tthis.table.options.rowFormatter(this.getComponent());\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tthis.initialized = false;\n\t\t\t\tthis.height = 0;\n\t\t\t\tthis.heightStyled = \"\";\n\t\t\t}\n\t\t\t\n\t\t\tthis.dispatch(\"row-data-changed\", this, visible, updatedData);\n\t\t\t\n\t\t\t//this.reinitialize();\n\t\t\t\n\t\t\tthis.dispatchExternal(\"rowUpdated\", this.getComponent());\n\t\t\t\n\t\t\tif(this.subscribedExternal(\"dataChanged\")){\n\t\t\t\tthis.dispatchExternal(\"dataChanged\", this.table.rowManager.getData());\n\t\t\t}\n\t\t\t\n\t\t\tresolve();\n\t\t});\n\t}\n\t\n\tgetData(transform){\n\t\tif(transform){\n\t\t\treturn this.chain(\"row-data-retrieve\", [this, transform], null, this.data);\n\t\t}\n\t\t\n\t\treturn this.data;\n\t}\n\t\n\tgetCell(column){\n\t\tvar match = false;\n\t\t\n\t\tcolumn = this.table.columnManager.findColumn(column);\n\t\t\n\t\tif(!this.initialized && this.cells.length === 0){\n\t\t\tthis.generateCells();\n\t\t}\n\t\t\n\t\tmatch = this.cells.find(function(cell){\n\t\t\treturn cell.column === column;\n\t\t});\n\t\t\n\t\treturn match;\n\t}\n\t\n\tgetCellIndex(findCell){\n\t\treturn this.cells.findIndex(function(cell){\n\t\t\treturn cell === findCell;\n\t\t});\n\t}\n\t\n\tfindCell(subject){\n\t\treturn this.cells.find((cell) => {\n\t\t\treturn cell.element === subject;\n\t\t});\n\t}\n\t\n\tgetCells(){\n\t\tif(!this.initialized && this.cells.length === 0){\n\t\t\tthis.generateCells();\n\t\t}\n\t\t\n\t\treturn this.cells;\n\t}\n\t\n\tnextRow(){\n\t\tvar row = this.table.rowManager.nextDisplayRow(this, true);\n\t\treturn row || false;\n\t}\n\t\n\tprevRow(){\n\t\tvar row = this.table.rowManager.prevDisplayRow(this, true);\n\t\treturn row || false;\n\t}\n\t\n\tmoveToRow(to, before){\n\t\tvar toRow = this.table.rowManager.findRow(to);\n\t\t\n\t\tif(toRow){\n\t\t\tthis.table.rowManager.moveRowActual(this, toRow, !before);\n\t\t\tthis.table.rowManager.refreshActiveData(\"display\", false, true);\n\t\t}else {\n\t\t\tconsole.warn(\"Move Error - No matching row found:\", to);\n\t\t}\n\t}\n\t\n\t///////////////////// Actions /////////////////////\n\tdelete(){\n\t\tthis.dispatch(\"row-delete\", this);\n\t\t\n\t\tthis.deleteActual();\n\t\t\n\t\treturn Promise.resolve();\n\t}\n\t\n\tdeleteActual(blockRedraw){\n\t\tthis.detachModules();\n\t\t\n\t\tthis.table.rowManager.deleteRow(this, blockRedraw);\n\t\t\n\t\tthis.deleteCells();\n\t\t\n\t\tthis.initialized = false;\n\t\tthis.heightInitialized = false;\n\t\tthis.element = false;\n\t\t\n\t\tthis.dispatch(\"row-deleted\", this);\n\t}\n\t\n\tdetachModules(){\n\t\tthis.dispatch(\"row-deleting\", this);\n\t}\n\t\n\tdeleteCells(){\n\t\tvar cellCount = this.cells.length;\n\t\t\n\t\tfor(let i = 0; i < cellCount; i++){\n\t\t\tthis.cells[0].delete();\n\t\t}\n\t}\n\t\n\twipe(){\n\t\tthis.detachModules();\n\t\tthis.deleteCells();\n\t\t\n\t\tif(this.element){\n\t\t\twhile(this.element.firstChild) this.element.removeChild(this.element.firstChild);\n\t\t\t\n\t\t\tif(this.element.parentNode){\n\t\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t\t}\n\t\t}\n\t\t\n\t\tthis.element = false;\n\t\tthis.modules = {};\n\t}\n\n\tisDisplayed(){\n\t\treturn this.table.rowManager.getDisplayRows().includes(this);\n\t}\n\n\tgetPosition(){\n\t\treturn this.isDisplayed() ? this.position : false;\n\t}\n\n\tsetPosition(position){\n\t\tif(position != this.position){\n\t\t\tthis.position = position;\n\n\t\t\tthis.positionWatchers.forEach((callback) => {\n\t\t\t\tcallback(this.position);\n\t\t\t});\n\t\t}\n\t}\n\n\twatchPosition(callback){\n\t\tthis.positionWatchers.push(callback);\n\n\t\tcallback(this.position);\n\t}\n\t\n\tgetGroup(){\n\t\treturn this.modules.group || false;\n\t}\n\t\n\t//////////////// Object Generation /////////////////\n\tgetComponent(){\n\t\tif(!this.component){\n\t\t\tthis.component = new RowComponent(this);\n\t\t}\n\t\t\n\t\treturn this.component;\n\t}\n}\n\nvar defaultCalculations = {\n\t\"avg\":function(values, data, calcParams){\n\t\tvar output = 0,\n\t\tprecision = typeof calcParams.precision !== \"undefined\" ? calcParams.precision : 2;\n\n\t\tif(values.length){\n\t\t\toutput = values.reduce(function(sum, value){\n\t\t\t\treturn Number(sum) + Number(value);\n\t\t\t});\n\n\t\t\toutput = output / values.length;\n\n\t\t\toutput = precision !== false ? output.toFixed(precision) : output;\n\t\t}\n\n\t\treturn parseFloat(output).toString();\n\t},\n\t\"max\":function(values, data, calcParams){\n\t\tvar output = null,\n\t\tprecision = typeof calcParams.precision !== \"undefined\" ? calcParams.precision : false;\n\n\t\tvalues.forEach(function(value){\n\n\t\t\tvalue = Number(value);\n\n\t\t\tif(value > output || output === null){\n\t\t\t\toutput = value;\n\t\t\t}\n\t\t});\n\n\t\treturn output !== null ? (precision !== false ? output.toFixed(precision) : output) : \"\";\n\t},\n\t\"min\":function(values, data, calcParams){\n\t\tvar output = null,\n\t\tprecision = typeof calcParams.precision !== \"undefined\" ? calcParams.precision : false;\n\n\t\tvalues.forEach(function(value){\n\n\t\t\tvalue = Number(value);\n\n\t\t\tif(value < output || output === null){\n\t\t\t\toutput = value;\n\t\t\t}\n\t\t});\n\n\t\treturn output !== null ? (precision !== false ? output.toFixed(precision) : output) : \"\";\n\t},\n\t\"sum\":function(values, data, calcParams){\n\t\tvar output = 0,\n\t\tprecision = typeof calcParams.precision !== \"undefined\" ? calcParams.precision : false;\n\n\t\tif(values.length){\n\t\t\tvalues.forEach(function(value){\n\t\t\t\tvalue = Number(value);\n\n\t\t\t\toutput += !isNaN(value) ? Number(value) : 0;\n\t\t\t});\n\t\t}\n\n\t\treturn precision !== false ? output.toFixed(precision) : output;\n\t},\n\t\"concat\":function(values, data, calcParams){\n\t\tvar output = 0;\n\n\t\tif(values.length){\n\t\t\toutput = values.reduce(function(sum, value){\n\t\t\t\treturn String(sum) + String(value);\n\t\t\t});\n\t\t}\n\n\t\treturn output;\n\t},\n\t\"count\":function(values, data, calcParams){\n\t\tvar output = 0;\n\n\t\tif(values.length){\n\t\t\tvalues.forEach(function(value){\n\t\t\t\tif(value){\n\t\t\t\t\toutput ++;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn output;\n\t},\n\t\"unique\":function(values, data, calcParams){\n\t\tvar unique = values.filter((value, index) => {\n\t\t\treturn (values || value === 0) && values.indexOf(value) === index;\n\t\t});\n\n\t\treturn unique.length;\n\t},\n};\n\nclass ColumnCalcs extends Module{\n\n\tstatic moduleName = \"columnCalcs\";\n\n\t//load defaults\n\tstatic calculations = defaultCalculations;\n\t\n\tconstructor(table){\n\t\tsuper(table);\n\t\t\n\t\tthis.topCalcs = [];\n\t\tthis.botCalcs = [];\n\t\tthis.genColumn = false;\n\t\tthis.topElement = this.createElement();\n\t\tthis.botElement = this.createElement();\n\t\tthis.topRow = false;\n\t\tthis.botRow = false;\n\t\tthis.topInitialized = false;\n\t\tthis.botInitialized = false;\n\t\t\n\t\tthis.blocked = false;\n\t\tthis.recalcAfterBlock = false;\n\t\t\n\t\tthis.registerTableOption(\"columnCalcs\", true);\n\t\t\n\t\tthis.registerColumnOption(\"topCalc\");\n\t\tthis.registerColumnOption(\"topCalcParams\");\n\t\tthis.registerColumnOption(\"topCalcFormatter\");\n\t\tthis.registerColumnOption(\"topCalcFormatterParams\");\n\t\tthis.registerColumnOption(\"bottomCalc\");\n\t\tthis.registerColumnOption(\"bottomCalcParams\");\n\t\tthis.registerColumnOption(\"bottomCalcFormatter\");\n\t\tthis.registerColumnOption(\"bottomCalcFormatterParams\");\n\t}\n\t\n\tcreateElement (){\n\t\tvar el = document.createElement(\"div\");\n\t\tel.classList.add(\"tabulator-calcs-holder\");\n\t\treturn el;\n\t}\n\t\n\tinitialize(){\n\t\tthis.genColumn = new Column({field:\"value\"}, this);\n\t\t\n\t\tthis.subscribe(\"cell-value-changed\", this.cellValueChanged.bind(this));\n\t\tthis.subscribe(\"column-init\", this.initializeColumnCheck.bind(this));\n\t\tthis.subscribe(\"row-deleted\", this.rowsUpdated.bind(this));\n\t\tthis.subscribe(\"scroll-horizontal\", this.scrollHorizontal.bind(this));\n\t\tthis.subscribe(\"row-added\", this.rowsUpdated.bind(this));\n\t\tthis.subscribe(\"column-moved\", this.recalcActiveRows.bind(this));\n\t\tthis.subscribe(\"column-add\", this.recalcActiveRows.bind(this));\n\t\tthis.subscribe(\"data-refreshed\", this.recalcActiveRowsRefresh.bind(this));\n\t\tthis.subscribe(\"table-redraw\", this.tableRedraw.bind(this));\n\t\tthis.subscribe(\"rows-visible\", this.visibleRows.bind(this));\n\t\tthis.subscribe(\"scrollbar-vertical\", this.adjustForScrollbar.bind(this));\n\t\t\n\t\tthis.subscribe(\"redraw-blocked\", this.blockRedraw.bind(this));\n\t\tthis.subscribe(\"redraw-restored\", this.restoreRedraw.bind(this));\n\n\t\tthis.subscribe(\"table-redrawing\", this.resizeHolderWidth.bind(this));\n\t\tthis.subscribe(\"column-resized\", this.resizeHolderWidth.bind(this));\n\t\tthis.subscribe(\"column-show\", this.resizeHolderWidth.bind(this));\n\t\tthis.subscribe(\"column-hide\", this.resizeHolderWidth.bind(this));\n\t\t\n\t\tthis.registerTableFunction(\"getCalcResults\", this.getResults.bind(this));\n\t\tthis.registerTableFunction(\"recalc\", this.userRecalc.bind(this));\n\n\n\t\tthis.resizeHolderWidth();\n\t}\n\n\tresizeHolderWidth(){\n\t\tthis.topElement.style.minWidth = this.table.columnManager.headersElement.offsetWidth + \"px\";\n\t}\n\n\t\n\ttableRedraw(force){\n\t\tthis.recalc(this.table.rowManager.activeRows);\n\t\t\n\t\tif(force){\n\t\t\tthis.redraw();\n\t\t}\n\t}\n\t\n\tblockRedraw(){\n\t\tthis.blocked = true;\n\t\tthis.recalcAfterBlock = false;\n\t}\n\t\n\t\n\trestoreRedraw(){\n\t\tthis.blocked = false;\n\t\t\n\t\tif(this.recalcAfterBlock){\n\t\t\tthis.recalcAfterBlock = false;\n\t\t\tthis.recalcActiveRowsRefresh();\n\t\t}\n\t}\n\t\n\t///////////////////////////////////\n\t///////// Table Functions /////////\n\t///////////////////////////////////\n\tuserRecalc(){\n\t\tthis.recalc(this.table.rowManager.activeRows);\n\t}\n\t\n\t///////////////////////////////////\n\t///////// Internal Logic //////////\n\t///////////////////////////////////\n\t\n\tblockCheck(){\n\t\tif(this.blocked){\n\t\t\tthis.recalcAfterBlock = true;\n\t\t}\n\t\t\n\t\treturn this.blocked;\n\t}\n\t\n\tvisibleRows(viewable, rows){\n\t\tif(this.topRow){\n\t\t\trows.unshift(this.topRow);\n\t\t}\n\t\t\n\t\tif(this.botRow){\n\t\t\trows.push(this.botRow);\n\t\t}\n\t\t\n\t\treturn rows;\n\t}\n\t\n\trowsUpdated(row){\n\t\tif(this.table.options.groupBy){\n\t\t\tthis.recalcRowGroup(row);\n\t\t}else {\n\t\t\tthis.recalcActiveRows();\n\t\t}\n\t}\n\t\n\trecalcActiveRowsRefresh(){\n\t\tif(this.table.options.groupBy && this.table.options.dataTreeStartExpanded && this.table.options.dataTree){\n\t\t\tthis.recalcAll();\n\t\t}else {\n\t\t\tthis.recalcActiveRows();\n\t\t}\n\t}\n\t\n\trecalcActiveRows(){\n\t\tthis.recalc(this.table.rowManager.activeRows);\n\t}\n\t\n\tcellValueChanged(cell){\n\t\tif(cell.column.definition.topCalc || cell.column.definition.bottomCalc){\n\t\t\tif(this.table.options.groupBy){\n\t\t\t\tif(this.table.options.columnCalcs == \"table\" || this.table.options.columnCalcs == \"both\"){\n\t\t\t\t\tthis.recalcActiveRows();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(this.table.options.columnCalcs != \"table\"){\n\t\t\t\t\tthis.recalcRowGroup(cell.row);\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tthis.recalcActiveRows();\n\t\t\t}\n\t\t}\n\t}\n\t\n\tinitializeColumnCheck(column){\n\t\tif(column.definition.topCalc || column.definition.bottomCalc){\n\t\t\tthis.initializeColumn(column);\n\t\t}\n\t}\n\t\n\t//initialize column calcs\n\tinitializeColumn(column){\n\t\tvar def = column.definition;\n\t\t\n\t\tvar config = {\n\t\t\ttopCalcParams:def.topCalcParams || {},\n\t\t\tbotCalcParams:def.bottomCalcParams || {},\n\t\t};\n\t\t\n\t\tif(def.topCalc){\n\t\t\t\n\t\t\tswitch(typeof def.topCalc){\n\t\t\t\tcase \"string\":\n\t\t\t\t\tif(ColumnCalcs.calculations[def.topCalc]){\n\t\t\t\t\t\tconfig.topCalc = ColumnCalcs.calculations[def.topCalc];\n\t\t\t\t\t}else {\n\t\t\t\t\t\tconsole.warn(\"Column Calc Error - No such calculation found, ignoring: \", def.topCalc);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"function\":\n\t\t\t\t\tconfig.topCalc = def.topCalc;\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tif(config.topCalc){\n\t\t\t\tcolumn.modules.columnCalcs = config;\n\t\t\t\tthis.topCalcs.push(column);\n\t\t\t\t\n\t\t\t\tif(this.table.options.columnCalcs != \"group\"){\n\t\t\t\t\tthis.initializeTopRow();\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t\n\t\tif(def.bottomCalc){\n\t\t\tswitch(typeof def.bottomCalc){\n\t\t\t\tcase \"string\":\n\t\t\t\t\tif(ColumnCalcs.calculations[def.bottomCalc]){\n\t\t\t\t\t\tconfig.botCalc = ColumnCalcs.calculations[def.bottomCalc];\n\t\t\t\t\t}else {\n\t\t\t\t\t\tconsole.warn(\"Column Calc Error - No such calculation found, ignoring: \", def.bottomCalc);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"function\":\n\t\t\t\t\tconfig.botCalc = def.bottomCalc;\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tif(config.botCalc){\n\t\t\t\tcolumn.modules.columnCalcs = config;\n\t\t\t\tthis.botCalcs.push(column);\n\t\t\t\t\n\t\t\t\tif(this.table.options.columnCalcs != \"group\"){\n\t\t\t\t\tthis.initializeBottomRow();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\t//dummy functions to handle being mock column manager\n\tregisterColumnField(){}\n\t\n\tremoveCalcs(){\n\t\tvar changed = false;\n\t\t\n\t\tif(this.topInitialized){\n\t\t\tthis.topInitialized = false;\n\t\t\tthis.topElement.parentNode.removeChild(this.topElement);\n\t\t\tchanged = true;\n\t\t}\n\t\t\n\t\tif(this.botInitialized){\n\t\t\tthis.botInitialized = false;\n\t\t\tthis.footerRemove(this.botElement);\n\t\t\tchanged = true;\n\t\t}\n\t\t\n\t\tif(changed){\n\t\t\tthis.table.rowManager.adjustTableSize();\n\t\t}\n\t}\n\t\n\treinitializeCalcs(){\n\t\tif(this.topCalcs.length){\n\t\t\tthis.initializeTopRow();\n\t\t}\n\n\t\tif(this.botCalcs.length){\n\t\t\tthis.initializeBottomRow();\n\t\t}\n\t}\n\t\n\tinitializeTopRow(){\n\t\tvar\tfragment = document.createDocumentFragment();\n\t\t\n\t\tif(!this.topInitialized){\n\n\t\t\tfragment.appendChild(document.createElement(\"br\"));\n\t\t\tfragment.appendChild(this.topElement);\n\n\t\t\tthis.table.columnManager.getContentsElement().insertBefore(fragment, this.table.columnManager.headersElement.nextSibling);\n\t\t\tthis.topInitialized = true;\n\t\t}\n\t}\n\t\n\tinitializeBottomRow(){\n\t\tif(!this.botInitialized){\n\t\t\tthis.footerPrepend(this.botElement);\n\t\t\tthis.botInitialized = true;\n\t\t}\n\t}\n\t\n\tscrollHorizontal(left){\n\t\tif(this.botInitialized && this.botRow){\n\t\t\tthis.botElement.scrollLeft = left;\n\t\t}\n\t}\n\t\n\trecalc(rows){\n\t\tvar data, row;\n\t\t\n\t\tif(!this.blockCheck()){\n\t\t\tif(this.topInitialized || this.botInitialized){\n\t\t\t\tdata = this.rowsToData(rows);\n\t\t\t\t\n\t\t\t\tif(this.topInitialized){\n\t\t\t\t\tif(this.topRow){\n\t\t\t\t\t\tthis.topRow.deleteCells();\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\trow = this.generateRow(\"top\", data);\n\t\t\t\t\tthis.topRow = row;\n\t\t\t\t\twhile(this.topElement.firstChild) this.topElement.removeChild(this.topElement.firstChild);\n\t\t\t\t\tthis.topElement.appendChild(row.getElement());\n\t\t\t\t\trow.initialize(true);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(this.botInitialized){\n\t\t\t\t\tif(this.botRow){\n\t\t\t\t\t\tthis.botRow.deleteCells();\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\trow = this.generateRow(\"bottom\", data);\n\t\t\t\t\tthis.botRow = row;\n\t\t\t\t\twhile(this.botElement.firstChild) this.botElement.removeChild(this.botElement.firstChild);\n\t\t\t\t\tthis.botElement.appendChild(row.getElement());\n\t\t\t\t\trow.initialize(true);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.table.rowManager.adjustTableSize();\n\t\t\t\t\n\t\t\t\t//set resizable handles\n\t\t\t\tif(this.table.modExists(\"frozenColumns\")){\n\t\t\t\t\tthis.table.modules.frozenColumns.layout();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\trecalcRowGroup(row){\n\t\tthis.recalcGroup(this.table.modules.groupRows.getRowGroup(row));\n\t}\n\t\n\trecalcAll(){\n\t\tif(this.topCalcs.length || this.botCalcs.length){\n\t\t\tif(this.table.options.columnCalcs !== \"group\"){\n\t\t\t\tthis.recalcActiveRows();\n\t\t\t}\n\t\t\t\n\t\t\tif(this.table.options.groupBy && this.table.options.columnCalcs !== \"table\"){\n\t\t\t\t\n\t\t\t\tvar groups = this.table.modules.groupRows.getChildGroups();\n\t\t\t\t\n\t\t\t\tgroups.forEach((group) => {\n\t\t\t\t\tthis.recalcGroup(group);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\t\n\trecalcGroup(group){\n\t\tvar data, rowData;\n\t\t\n\t\tif(!this.blockCheck()){\n\t\t\tif(group){\n\t\t\t\tif(group.calcs){\n\t\t\t\t\tif(group.calcs.bottom){\n\t\t\t\t\t\tdata = this.rowsToData(group.rows);\n\t\t\t\t\t\trowData = this.generateRowData(\"bottom\", data);\n\t\t\t\t\t\t\n\t\t\t\t\t\tgroup.calcs.bottom.updateData(rowData);\n\t\t\t\t\t\tgroup.calcs.bottom.reinitialize();\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif(group.calcs.top){\n\t\t\t\t\t\tdata = this.rowsToData(group.rows);\n\t\t\t\t\t\trowData = this.generateRowData(\"top\", data);\n\t\t\t\t\t\t\n\t\t\t\t\t\tgroup.calcs.top.updateData(rowData);\n\t\t\t\t\t\tgroup.calcs.top.reinitialize();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t//generate top stats row\n\tgenerateTopRow(rows){\n\t\treturn this.generateRow(\"top\", this.rowsToData(rows));\n\t}\n\t//generate bottom stats row\n\tgenerateBottomRow(rows){\n\t\treturn this.generateRow(\"bottom\", this.rowsToData(rows));\n\t}\n\t\n\trowsToData(rows){\n\t\tvar data = [],\n\t\thasDataTreeColumnCalcs = this.table.options.dataTree && this.table.options.dataTreeChildColumnCalcs,\n\t\tdataTree = this.table.modules.dataTree;\n\n\t\trows.forEach((row) => {\n\t\t\tdata.push(row.getData());\n\n\t\t\tif(hasDataTreeColumnCalcs && row.modules.dataTree?.open){\n\t\t\t\tthis.rowsToData(dataTree.getFilteredTreeChildren(row)).forEach(dataRow =>{\n\t\t\t\t\tdata.push(row);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\treturn data;\n\t}\n\t\n\t//generate stats row\n\tgenerateRow(pos, data){\n\t\tvar rowData = this.generateRowData(pos, data),\n\t\trow;\n\t\t\n\t\tif(this.table.modExists(\"mutator\")){\n\t\t\tthis.table.modules.mutator.disable();\n\t\t}\n\t\t\n\t\trow = new Row(rowData, this, \"calc\");\n\t\t\n\t\tif(this.table.modExists(\"mutator\")){\n\t\t\tthis.table.modules.mutator.enable();\n\t\t}\n\t\t\n\t\trow.getElement().classList.add(\"tabulator-calcs\", \"tabulator-calcs-\" + pos);\n\t\t\n\t\trow.component = false;\n\t\t\n\t\trow.getComponent = () => {\n\t\t\tif(!row.component){\n\t\t\t\trow.component = new CalcComponent(row);\n\t\t\t}\n\t\t\t\n\t\t\treturn row.component;\n\t\t};\n\t\t\n\t\trow.generateCells = () => {\n\t\t\t\n\t\t\tvar cells = [];\n\t\t\t\n\t\t\tthis.table.columnManager.columnsByIndex.forEach((column) => {\n\t\t\t\t\n\t\t\t\t//set field name of mock column\n\t\t\t\tthis.genColumn.setField(column.getField());\n\t\t\t\tthis.genColumn.hozAlign = column.hozAlign;\n\t\t\t\t\n\t\t\t\tif(column.definition[pos + \"CalcFormatter\"] && this.table.modExists(\"format\")){\n\t\t\t\t\tthis.genColumn.modules.format = {\n\t\t\t\t\t\tformatter: this.table.modules.format.lookupFormatter(column.definition[pos + \"CalcFormatter\"]),\n\t\t\t\t\t\tparams: column.definition[pos + \"CalcFormatterParams\"] || {},\n\t\t\t\t\t};\n\t\t\t\t}else {\n\t\t\t\t\tthis.genColumn.modules.format = {\n\t\t\t\t\t\tformatter: this.table.modules.format.lookupFormatter(\"plaintext\"),\n\t\t\t\t\t\tparams:{}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t//ensure css class definition is replicated to calculation cell\n\t\t\t\tthis.genColumn.definition.cssClass = column.definition.cssClass;\n\t\t\t\t\n\t\t\t\t//generate cell and assign to correct column\n\t\t\t\tvar cell = new Cell(this.genColumn, row);\n\t\t\t\tcell.getElement();\n\t\t\t\tcell.column = column;\n\t\t\t\tcell.setWidth();\n\t\t\t\t\n\t\t\t\tcolumn.cells.push(cell);\n\t\t\t\tcells.push(cell);\n\t\t\t\t\n\t\t\t\tif(!column.visible){\n\t\t\t\t\tcell.hide();\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\trow.cells = cells;\n\t\t};\n\t\t\n\t\treturn row;\n\t}\n\t\n\t//generate stats row\n\tgenerateRowData(pos, data){\n\t\tvar rowData = {},\n\t\tcalcs = pos == \"top\" ? this.topCalcs : this.botCalcs,\n\t\ttype = pos == \"top\" ? \"topCalc\" : \"botCalc\",\n\t\tparams, paramKey;\n\t\t\n\t\tcalcs.forEach(function(column){\n\t\t\tvar values = [];\n\t\t\t\n\t\t\tif(column.modules.columnCalcs && column.modules.columnCalcs[type]){\n\t\t\t\tdata.forEach(function(item){\n\t\t\t\t\tvalues.push(column.getFieldValue(item));\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tparamKey = type + \"Params\";\n\t\t\t\tparams = typeof column.modules.columnCalcs[paramKey] === \"function\" ? column.modules.columnCalcs[paramKey](values, data) : column.modules.columnCalcs[paramKey];\n\t\t\t\t\n\t\t\t\tcolumn.setFieldValue(rowData, column.modules.columnCalcs[type](values, data, params));\n\t\t\t}\n\t\t});\n\t\t\n\t\treturn rowData;\n\t}\n\t\n\thasTopCalcs(){\n\t\treturn\t!!(this.topCalcs.length);\n\t}\n\t\n\thasBottomCalcs(){\n\t\treturn\t!!(this.botCalcs.length);\n\t}\n\t\n\t//handle table redraw\n\tredraw(){\n\t\tif(this.topRow){\n\t\t\tthis.topRow.normalizeHeight(true);\n\t\t}\n\t\tif(this.botRow){\n\t\t\tthis.botRow.normalizeHeight(true);\n\t\t}\n\t}\n\t\n\t//return the calculated\n\tgetResults(){\n\t\tvar results = {},\n\t\tgroups;\n\t\t\n\t\tif(this.table.options.groupBy && this.table.modExists(\"groupRows\")){\n\t\t\tgroups = this.table.modules.groupRows.getGroups(true);\n\t\t\t\n\t\t\tgroups.forEach((group) => {\n\t\t\t\tresults[group.getKey()] = this.getGroupResults(group);\n\t\t\t});\n\t\t}else {\n\t\t\tresults = {\n\t\t\t\ttop: this.topRow ? this.topRow.getData() : {},\n\t\t\t\tbottom: this.botRow ? this.botRow.getData() : {},\n\t\t\t};\n\t\t}\n\t\t\n\t\treturn results;\n\t}\n\t\n\t//get results from a group\n\tgetGroupResults(group){\n\t\tvar groupObj = group._getSelf(),\n\t\tsubGroups = group.getSubGroups(),\n\t\tsubGroupResults = {},\n\t\tresults = {};\n\t\t\n\t\tsubGroups.forEach((subgroup) => {\n\t\t\tsubGroupResults[subgroup.getKey()] = this.getGroupResults(subgroup);\n\t\t});\n\t\t\n\t\tresults = {\n\t\t\ttop: groupObj.calcs.top ? groupObj.calcs.top.getData() : {},\n\t\t\tbottom: groupObj.calcs.bottom ? groupObj.calcs.bottom.getData() : {},\n\t\t\tgroups: subGroupResults,\n\t\t};\n\t\t\n\t\treturn results;\n\t}\n\t\n\tadjustForScrollbar(width){\n\t\tif(this.botRow){\n\t\t\tif(this.table.rtl){\n\t\t\t\tthis.botElement.style.paddingLeft = width + \"px\";\n\t\t\t}else {\n\t\t\t\tthis.botElement.style.paddingRight = width + \"px\";\n\t\t\t}\n\t\t}\n\t}\n}\n\nclass DataTree extends Module{\n\n\tstatic moduleName = \"dataTree\";\n\n\tconstructor(table){\n\t\tsuper(table);\n\n\t\tthis.indent = 10;\n\t\tthis.field = \"\";\n\t\tthis.collapseEl = null;\n\t\tthis.expandEl = null;\n\t\tthis.branchEl = null;\n\t\tthis.elementField = false;\n\n\t\tthis.startOpen = function(){};\n\n\t\tthis.registerTableOption(\"dataTree\", false); //enable data tree\n\t\tthis.registerTableOption(\"dataTreeFilter\", true); //filter child rows\n\t\tthis.registerTableOption(\"dataTreeSort\", true); //sort child rows\n\t\tthis.registerTableOption(\"dataTreeElementColumn\", false);\n\t\tthis.registerTableOption(\"dataTreeBranchElement\", true);//show data tree branch element\n\t\tthis.registerTableOption(\"dataTreeChildIndent\", 9); //data tree child indent in px\n\t\tthis.registerTableOption(\"dataTreeChildField\", \"_children\");//data tre column field to look for child rows\n\t\tthis.registerTableOption(\"dataTreeCollapseElement\", false);//data tree row collapse element\n\t\tthis.registerTableOption(\"dataTreeExpandElement\", false);//data tree row expand element\n\t\tthis.registerTableOption(\"dataTreeStartExpanded\", false);\n\t\tthis.registerTableOption(\"dataTreeChildColumnCalcs\", false);//include visible data tree rows in column calculations\n\t\tthis.registerTableOption(\"dataTreeSelectPropagate\", false);//selecting a parent row selects its children\n\n\t\t//register component functions\n\t\tthis.registerComponentFunction(\"row\", \"treeCollapse\", this.collapseRow.bind(this));\n\t\tthis.registerComponentFunction(\"row\", \"treeExpand\", this.expandRow.bind(this));\n\t\tthis.registerComponentFunction(\"row\", \"treeToggle\", this.toggleRow.bind(this));\n\t\tthis.registerComponentFunction(\"row\", \"getTreeParent\", this.getTreeParent.bind(this));\n\t\tthis.registerComponentFunction(\"row\", \"getTreeChildren\", this.getRowChildren.bind(this));\n\t\tthis.registerComponentFunction(\"row\", \"addTreeChild\", this.addTreeChildRow.bind(this));\n\t\tthis.registerComponentFunction(\"row\", \"isTreeExpanded\", this.isRowExpanded.bind(this));\n\t}\n\n\tinitialize(){\n\t\tif(this.table.options.dataTree){\n\t\t\tvar dummyEl = null,\n\t\t\toptions = this.table.options;\n\n\t\t\tthis.field = options.dataTreeChildField;\n\t\t\tthis.indent = options.dataTreeChildIndent;\n\n\t\t\tif(this.options(\"movableRows\")){\n\t\t\t\tconsole.warn(\"The movableRows option is not available with dataTree enabled, moving of child rows could result in unpredictable behavior\");\n\t\t\t}\n\n\t\t\tif(options.dataTreeBranchElement){\n\n\t\t\t\tif(options.dataTreeBranchElement === true){\n\t\t\t\t\tthis.branchEl = document.createElement(\"div\");\n\t\t\t\t\tthis.branchEl.classList.add(\"tabulator-data-tree-branch\");\n\t\t\t\t}else {\n\t\t\t\t\tif(typeof options.dataTreeBranchElement === \"string\"){\n\t\t\t\t\t\tdummyEl = document.createElement(\"div\");\n\t\t\t\t\t\tdummyEl.innerHTML = options.dataTreeBranchElement;\n\t\t\t\t\t\tthis.branchEl = dummyEl.firstChild;\n\t\t\t\t\t}else {\n\t\t\t\t\t\tthis.branchEl = options.dataTreeBranchElement;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tthis.branchEl = document.createElement(\"div\");\n\t\t\t\tthis.branchEl.classList.add(\"tabulator-data-tree-branch-empty\");\n\t\t\t}\n\n\t\t\tif(options.dataTreeCollapseElement){\n\t\t\t\tif(typeof options.dataTreeCollapseElement === \"string\"){\n\t\t\t\t\tdummyEl = document.createElement(\"div\");\n\t\t\t\t\tdummyEl.innerHTML = options.dataTreeCollapseElement;\n\t\t\t\t\tthis.collapseEl = dummyEl.firstChild;\n\t\t\t\t}else {\n\t\t\t\t\tthis.collapseEl = options.dataTreeCollapseElement;\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tthis.collapseEl = document.createElement(\"div\");\n\t\t\t\tthis.collapseEl.classList.add(\"tabulator-data-tree-control\");\n\t\t\t\tthis.collapseEl.tabIndex = 0;\n\t\t\t\tthis.collapseEl.innerHTML = \"<div class='tabulator-data-tree-control-collapse'></div>\";\n\t\t\t}\n\n\t\t\tif(options.dataTreeExpandElement){\n\t\t\t\tif(typeof options.dataTreeExpandElement === \"string\"){\n\t\t\t\t\tdummyEl = document.createElement(\"div\");\n\t\t\t\t\tdummyEl.innerHTML = options.dataTreeExpandElement;\n\t\t\t\t\tthis.expandEl = dummyEl.firstChild;\n\t\t\t\t}else {\n\t\t\t\t\tthis.expandEl = options.dataTreeExpandElement;\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tthis.expandEl = document.createElement(\"div\");\n\t\t\t\tthis.expandEl.classList.add(\"tabulator-data-tree-control\");\n\t\t\t\tthis.expandEl.tabIndex = 0;\n\t\t\t\tthis.expandEl.innerHTML = \"<div class='tabulator-data-tree-control-expand'></div>\";\n\t\t\t}\n\n\n\t\t\tswitch(typeof options.dataTreeStartExpanded){\n\t\t\t\tcase \"boolean\":\n\t\t\t\t\tthis.startOpen = function(row, index){\n\t\t\t\t\t\treturn options.dataTreeStartExpanded;\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"function\":\n\t\t\t\t\tthis.startOpen = options.dataTreeStartExpanded;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthis.startOpen = function(row, index){\n\t\t\t\t\t\treturn options.dataTreeStartExpanded[index];\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis.subscribe(\"row-init\", this.initializeRow.bind(this));\n\t\t\tthis.subscribe(\"row-layout-after\", this.layoutRow.bind(this));\n\t\t\tthis.subscribe(\"row-deleting\", this.rowDeleting.bind(this));\n\t\t\tthis.subscribe(\"row-deleted\", this.rowDelete.bind(this),0);\n\t\t\tthis.subscribe(\"row-data-changed\", this.rowDataChanged.bind(this), 10);\n\t\t\tthis.subscribe(\"cell-value-updated\", this.cellValueChanged.bind(this));\n\t\t\tthis.subscribe(\"edit-cancelled\", this.cellValueChanged.bind(this));\n\t\t\tthis.subscribe(\"column-moving-rows\", this.columnMoving.bind(this));\n\t\t\tthis.subscribe(\"table-built\", this.initializeElementField.bind(this));\n\t\t\tthis.subscribe(\"table-redrawing\", this.tableRedrawing.bind(this));\n\n\t\t\tthis.registerDisplayHandler(this.getRows.bind(this), 30);\n\t\t}\n\t}\n\n\ttableRedrawing(force){\n\t\tvar rows;\n\n\t\tif(force){\n\t\t\trows = this.table.rowManager.getRows();\n\t\t\t\n\t\t\trows.forEach((row) => {\n\t\t\t\tthis.reinitializeRowChildren(row);\n\t\t\t});\n\t\t}\n\t}\n\n\tinitializeElementField(){\n\t\tvar firstCol = this.table.columnManager.getFirstVisibleColumn();\n\n\t\tthis.elementField = this.table.options.dataTreeElementColumn || (firstCol ? firstCol.field : false);\n\t}\n\t\n\tgetRowChildren(row){\n\t\treturn this.getTreeChildren(row, true);\n\t}\n\n\tcolumnMoving(){\n\t\tvar rows = [];\n\n\t\tthis.table.rowManager.rows.forEach((row) => {\n\t\t\trows = rows.concat(this.getTreeChildren(row, false, true));\n\t\t});\n\n\t\treturn rows;\n\t}\n\n\trowDataChanged(row, visible, updatedData){\n\t\tif(this.redrawNeeded(updatedData)){\n\t\t\tthis.initializeRow(row);\n\n\t\t\tif(visible){\n\t\t\t\tthis.layoutRow(row);\n\t\t\t\tthis.refreshData(true);\n\t\t\t}\n\t\t}\n\t}\n\n\tcellValueChanged(cell){\n\t\tvar field = cell.column.getField();\n\n\t\tif(field === this.elementField){\n\t\t\tthis.layoutRow(cell.row);\n\t\t}\n\t}\n\n\tinitializeRow(row){\n\t\tvar childArray = row.getData()[this.field];\n\t\tvar isArray = Array.isArray(childArray);\n\n\t\tvar children = isArray || (!isArray && typeof childArray === \"object\" && childArray !== null);\n\n\t\tif(!children && row.modules.dataTree && row.modules.dataTree.branchEl){\n\t\t\trow.modules.dataTree.branchEl.parentNode.removeChild(row.modules.dataTree.branchEl);\n\t\t}\n\n\t\tif(!children && row.modules.dataTree && row.modules.dataTree.controlEl){\n\t\t\trow.modules.dataTree.controlEl.parentNode.removeChild(row.modules.dataTree.controlEl);\n\t\t}\n\n\t\trow.modules.dataTree = {\n\t\t\tindex: row.modules.dataTree ? row.modules.dataTree.index : 0,\n\t\t\topen: children ? (row.modules.dataTree ? row.modules.dataTree.open : this.startOpen(row.getComponent(), 0)) : false,\n\t\t\tcontrolEl: row.modules.dataTree && children ? row.modules.dataTree.controlEl : false,\n\t\t\tbranchEl: row.modules.dataTree && children ? row.modules.dataTree.branchEl : false,\n\t\t\tparent: row.modules.dataTree ? row.modules.dataTree.parent : false,\n\t\t\tchildren:children,\n\t\t};\n\t}\n\n\treinitializeRowChildren(row){\n\t\tvar children = this.getTreeChildren(row, false, true);\n\n\t\tchildren.forEach(function(child){\n\t\t\tchild.reinitialize(true);\n\t\t});\n\t}\n\n\tlayoutRow(row){\n\t\tvar cell = this.elementField ? row.getCell(this.elementField) : row.getCells()[0],\n\t\tel = cell.getElement(),\n\t\tconfig = row.modules.dataTree;\n\n\t\tif(config.branchEl){\n\t\t\tif(config.branchEl.parentNode){\n\t\t\t\tconfig.branchEl.parentNode.removeChild(config.branchEl);\n\t\t\t}\n\t\t\tconfig.branchEl = false;\n\t\t}\n\n\t\tif(config.controlEl){\n\t\t\tif(config.controlEl.parentNode){\n\t\t\t\tconfig.controlEl.parentNode.removeChild(config.controlEl);\n\t\t\t}\n\t\t\tconfig.controlEl = false;\n\t\t}\n\n\t\tthis.generateControlElement(row, el);\n\n\t\trow.getElement().classList.add(\"tabulator-tree-level-\" + config.index);\n\n\t\tif(config.index){\n\t\t\tif(this.branchEl){\n\t\t\t\tconfig.branchEl = this.branchEl.cloneNode(true);\n\t\t\t\tel.insertBefore(config.branchEl, el.firstChild);\n\n\t\t\t\tif(this.table.rtl){\n\t\t\t\t\tconfig.branchEl.style.marginRight = (((config.branchEl.offsetWidth + config.branchEl.style.marginLeft) * (config.index - 1)) + (config.index * this.indent)) + \"px\";\n\t\t\t\t}else {\n\t\t\t\t\tconfig.branchEl.style.marginLeft = (((config.branchEl.offsetWidth + config.branchEl.style.marginRight) * (config.index - 1)) + (config.index * this.indent)) + \"px\";\n\t\t\t\t}\n\t\t\t}else {\n\n\t\t\t\tif(this.table.rtl){\n\t\t\t\t\tel.style.paddingRight = parseInt(window.getComputedStyle(el, null).getPropertyValue('padding-right')) + (config.index * this.indent) + \"px\";\n\t\t\t\t}else {\n\t\t\t\t\tel.style.paddingLeft = parseInt(window.getComputedStyle(el, null).getPropertyValue('padding-left')) + (config.index * this.indent) + \"px\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tgenerateControlElement(row, el){\n\t\tvar config = row.modules.dataTree,\n\t\toldControl = config.controlEl;\n\n\t\tel = el || row.getCells()[0].getElement();\n\n\t\tif(config.children !== false){\n\n\t\t\tif(config.open){\n\t\t\t\tconfig.controlEl = this.collapseEl.cloneNode(true);\n\t\t\t\tconfig.controlEl.addEventListener(\"click\", (e) => {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tthis.collapseRow(row);\n\t\t\t\t});\n\t\t\t}else {\n\t\t\t\tconfig.controlEl = this.expandEl.cloneNode(true);\n\t\t\t\tconfig.controlEl.addEventListener(\"click\", (e) => {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tthis.expandRow(row);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconfig.controlEl.addEventListener(\"mousedown\", (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t});\n\n\t\t\tif(oldControl && oldControl.parentNode === el){\n\t\t\t\toldControl.parentNode.replaceChild(config.controlEl,oldControl);\n\t\t\t}else {\n\t\t\t\tel.insertBefore(config.controlEl, el.firstChild);\n\t\t\t}\n\t\t}\n\t}\n\n\tgetRows(rows){\n\t\tvar output = [];\n\n\t\trows.forEach((row, i) => {\n\t\t\tvar config, children;\n\n\t\t\toutput.push(row);\n\n\t\t\tif(row instanceof Row){\n\n\t\t\t\trow.create();\n\n\t\t\t\tconfig = row.modules.dataTree;\n\n\t\t\t\tif(!config.index && config.children !== false){\n\t\t\t\t\tchildren = this.getChildren(row, false, true);\n\n\t\t\t\t\tchildren.forEach((child) => {\n\t\t\t\t\t\tchild.create();\n\t\t\t\t\t\toutput.push(child);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn output;\n\t}\n\n\tgetChildren(row, allChildren, sortOnly){\n\t\tvar config = row.modules.dataTree,\n\t\tchildren = [],\n\t\toutput = [];\n\n\t\tif(config.children !== false && (config.open || allChildren)){\n\t\t\tif(!Array.isArray(config.children)){\n\t\t\t\tconfig.children = this.generateChildren(row);\n\t\t\t}\n\n\t\t\tif(this.table.modExists(\"filter\") && this.table.options.dataTreeFilter){\n\t\t\t\tchildren = this.table.modules.filter.filter(config.children);\n\t\t\t}else {\n\t\t\t\tchildren = config.children;\n\t\t\t}\n\n\t\t\tif(this.table.modExists(\"sort\") && this.table.options.dataTreeSort){\n\t\t\t\tthis.table.modules.sort.sort(children, sortOnly);\n\t\t\t}\n\n\t\t\tchildren.forEach((child) => {\n\t\t\t\toutput.push(child);\n\n\t\t\t\tvar subChildren = this.getChildren(child, false, true);\n\n\t\t\t\tsubChildren.forEach((sub) => {\n\t\t\t\t\toutput.push(sub);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\treturn output;\n\t}\n\n\tgenerateChildren(row){\n\t\tvar children = [];\n\n\t\tvar childArray = row.getData()[this.field];\n\n\t\tif(!Array.isArray(childArray)){\n\t\t\tchildArray = [childArray];\n\t\t}\n\n\t\tchildArray.forEach((childData) => {\n\t\t\tvar childRow = new Row(childData || {}, this.table.rowManager);\n\n\t\t\tchildRow.create();\n\n\t\t\tchildRow.modules.dataTree.index = row.modules.dataTree.index + 1;\n\t\t\tchildRow.modules.dataTree.parent = row;\n\n\t\t\tif(childRow.modules.dataTree.children){\n\t\t\t\tchildRow.modules.dataTree.open = this.startOpen(childRow.getComponent(), childRow.modules.dataTree.index);\n\t\t\t}\n\t\t\tchildren.push(childRow);\n\t\t});\n\n\t\treturn children;\n\t}\n\n\texpandRow(row, silent){\n\t\tvar config = row.modules.dataTree;\n\n\t\tif(config.children !== false){\n\t\t\tconfig.open = true;\n\n\t\t\trow.reinitialize();\n\n\t\t\tthis.refreshData(true);\n\n\t\t\tthis.dispatchExternal(\"dataTreeRowExpanded\", row.getComponent(), row.modules.dataTree.index);\n\t\t}\n\t}\n\n\tcollapseRow(row){\n\t\tvar config = row.modules.dataTree;\n\n\t\tif(config.children !== false){\n\t\t\tconfig.open = false;\n\n\t\t\trow.reinitialize();\n\n\t\t\tthis.refreshData(true);\n\n\t\t\tthis.dispatchExternal(\"dataTreeRowCollapsed\", row.getComponent(), row.modules.dataTree.index);\n\t\t}\n\t}\n\n\ttoggleRow(row){\n\t\tvar config = row.modules.dataTree;\n\n\t\tif(config.children !== false){\n\t\t\tif(config.open){\n\t\t\t\tthis.collapseRow(row);\n\t\t\t}else {\n\t\t\t\tthis.expandRow(row);\n\t\t\t}\n\t\t}\n\t}\n\n\tisRowExpanded(row){\n\t\treturn row.modules.dataTree.open;\n\t}\n\n\tgetTreeParent(row){\n\t\treturn row.modules.dataTree.parent ? row.modules.dataTree.parent.getComponent() : false;\n\t}\n\n\tgetTreeParentRoot(row){\n\t\treturn row.modules.dataTree && row.modules.dataTree.parent ? this.getTreeParentRoot(row.modules.dataTree.parent) : row;\n\t}\n\n\tgetFilteredTreeChildren(row){\n\t\tvar config = row.modules.dataTree,\n\t\toutput = [], children;\n\n\t\tif(config.children){\n\n\t\t\tif(!Array.isArray(config.children)){\n\t\t\t\tconfig.children = this.generateChildren(row);\n\t\t\t}\n\n\t\t\tif(this.table.modExists(\"filter\") && this.table.options.dataTreeFilter){\n\t\t\t\tchildren = this.table.modules.filter.filter(config.children);\n\t\t\t}else {\n\t\t\t\tchildren = config.children;\n\t\t\t}\n\n\t\t\tchildren.forEach((childRow) => {\n\t\t\t\tif(childRow instanceof Row){\n\t\t\t\t\toutput.push(childRow);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn output;\n\t}\n\n\trowDeleting(row){\n\t\tvar config = row.modules.dataTree;\n\n\t\tif (config && config.children && Array.isArray(config.children)){\n\t\t\tconfig.children.forEach((childRow) => {\n\t\t\t\tif(childRow instanceof Row){\n\t\t\t\t\tchildRow.wipe();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\trowDelete(row){\n\t\tvar parent = row.modules.dataTree.parent,\n\t\tchildIndex;\n\n\t\tif(parent){\n\t\t\tchildIndex = this.findChildIndex(row, parent);\n\n\t\t\tif(childIndex !== false){\n\t\t\t\tparent.data[this.field].splice(childIndex, 1);\n\t\t\t}\n\n\t\t\tif(!parent.data[this.field].length){\n\t\t\t\tdelete parent.data[this.field];\n\t\t\t}\n\n\t\t\tthis.initializeRow(parent);\n\t\t\tthis.layoutRow(parent);\n\t\t}\n\n\t\tthis.refreshData(true);\n\t}\n\n\taddTreeChildRow(row, data, top, index){\n\t\tvar childIndex = false;\n\n\t\tif(typeof data === \"string\"){\n\t\t\tdata = JSON.parse(data);\n\t\t}\n\n\t\tif(!Array.isArray(row.data[this.field])){\n\t\t\trow.data[this.field] = [];\n\n\t\t\trow.modules.dataTree.open = this.startOpen(row.getComponent(), row.modules.dataTree.index);\n\t\t}\n\n\t\tif(typeof index !== \"undefined\"){\n\t\t\tchildIndex = this.findChildIndex(index, row);\n\n\t\t\tif(childIndex !== false){\n\t\t\t\trow.data[this.field].splice((top ? childIndex : childIndex + 1), 0, data);\n\t\t\t}\n\t\t}\n\n\t\tif(childIndex === false){\n\t\t\tif(top){\n\t\t\t\trow.data[this.field].unshift(data);\n\t\t\t}else {\n\t\t\t\trow.data[this.field].push(data);\n\t\t\t}\n\t\t}\n\n\t\tthis.initializeRow(row);\n\t\tthis.layoutRow(row);\n\n\t\tthis.refreshData(true);\n\t}\n\n\tfindChildIndex(subject, parent){\n\t\tvar match = false;\n\n\t\tif(typeof subject == \"object\"){\n\n\t\t\tif(subject instanceof Row){\n\t\t\t\t//subject is row element\n\t\t\t\tmatch = subject.data;\n\t\t\t}else if(subject instanceof RowComponent){\n\t\t\t\t//subject is public row component\n\t\t\t\tmatch = subject._getSelf().data;\n\t\t\t}else if(typeof HTMLElement !== \"undefined\" && subject instanceof HTMLElement){\n\t\t\t\tif(parent.modules.dataTree){\n\t\t\t\t\tmatch = parent.modules.dataTree.children.find((childRow) => {\n\t\t\t\t\t\treturn childRow instanceof Row ? childRow.element === subject : false;\n\t\t\t\t\t});\n\n\t\t\t\t\tif(match){\n\t\t\t\t\t\tmatch = match.data;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}else if(subject === null){\n\t\t\t\tmatch = false;\n\t\t\t}\n\n\t\t}else if(typeof subject == \"undefined\"){\n\t\t\tmatch = false;\n\t\t}else {\n\t\t\t//subject should be treated as the index of the row\n\t\t\tmatch = parent.data[this.field].find((row) => {\n\t\t\t\treturn row.data[this.table.options.index] == subject;\n\t\t\t});\n\t\t}\n\n\t\tif(match){\n\n\t\t\tif(Array.isArray(parent.data[this.field])){\n\t\t\t\tmatch = parent.data[this.field].indexOf(match);\n\t\t\t}\n\n\t\t\tif(match == -1){\n\t\t\t\tmatch = false;\n\t\t\t}\n\t\t}\n\n\t\t//catch all for any other type of input\n\n\t\treturn match;\n\t}\n\n\tgetTreeChildren(row, component, recurse){\n\t\tvar config = row.modules.dataTree,\n\t\toutput = [];\n\n\t\tif(config && config.children){\n\n\t\t\tif(!Array.isArray(config.children)){\n\t\t\t\tconfig.children = this.generateChildren(row);\n\t\t\t}\n\n\t\t\tconfig.children.forEach((childRow) => {\n\t\t\t\tif(childRow instanceof Row){\n\t\t\t\t\toutput.push(component ? childRow.getComponent() : childRow);\n\n\t\t\t\t\tif(recurse){\n\t\t\t\t\t\tthis.getTreeChildren(childRow, component, recurse).forEach(child => {\n\t\t\t\t\t\t\toutput.push(child);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn output;\n\t}\n\n\tgetChildField(){\n\t\treturn this.field;\n\t}\n\n\tredrawNeeded(data){\n\t\treturn (this.field ? typeof data[this.field] !== \"undefined\" : false) || (this.elementField ? typeof data[this.elementField] !== \"undefined\" : false);\n\t}\n}\n\nfunction csv$1(list, options = {}, setFileContents){\n\tvar delimiter = options.delimiter ? options.delimiter : \",\",\n\tfileContents = [],\n\theaders = [];\n\n\tlist.forEach((row) => {\n\t\tvar item = [];\n\n\t\tswitch(row.type){\n\t\t\tcase \"group\":\n\t\t\t\tconsole.warn(\"Download Warning - CSV downloader cannot process row groups\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"calc\":\n\t\t\t\tconsole.warn(\"Download Warning - CSV downloader cannot process column calculations\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"header\":\n\t\t\t\trow.columns.forEach((col, i) => {\n\t\t\t\t\tif(col && col.depth === 1){\n\t\t\t\t\t\theaders[i] = typeof col.value == \"undefined\" || col.value === null ? \"\" : ('\"' + String(col.value).split('\"').join('\"\"') + '\"');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tcase \"row\":\n\t\t\t\trow.columns.forEach((col) => {\n\n\t\t\t\t\tif(col){\n\n\t\t\t\t\t\tswitch(typeof col.value){\n\t\t\t\t\t\t\tcase \"object\":\n\t\t\t\t\t\t\t\tcol.value = col.value !== null ? JSON.stringify(col.value) : \"\";\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase \"undefined\":\n\t\t\t\t\t\t\t\tcol.value = \"\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\titem.push('\"' + String(col.value).split('\"').join('\"\"') + '\"');\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tfileContents.push(item.join(delimiter));\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\tif(headers.length){\n\t\tfileContents.unshift(headers.join(delimiter));\n\t}\n\n\tfileContents = fileContents.join(\"\\n\");\n\n\tif(options.bom){\n\t\tfileContents = \"\\ufeff\" + fileContents;\n\t}\n\n\tsetFileContents(fileContents, \"text/csv\");\n}\n\nfunction json$2(list, options, setFileContents){\n\tvar fileContents = [];\n\n\tlist.forEach((row) => {\n\t\tvar item = {};\n\n\t\tswitch(row.type){\n\t\t\tcase \"header\":\n\t\t\t\tbreak;\n\n\t\t\tcase \"group\":\n\t\t\t\tconsole.warn(\"Download Warning - JSON downloader cannot process row groups\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"calc\":\n\t\t\t\tconsole.warn(\"Download Warning - JSON downloader cannot process column calculations\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"row\":\n\t\t\t\trow.columns.forEach((col) => {\n\t\t\t\t\tif(col){\n\t\t\t\t\t\titem[col.component.getTitleDownload() || col.component.getField()] = col.value;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tfileContents.push(item);\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\tfileContents = JSON.stringify(fileContents, null, '\\t');\n\n\tsetFileContents(fileContents, \"application/json\");\n}\n\nfunction pdf(list, options = {}, setFileContents){\n\tvar header = [],\n\tbody = [],\n\tautoTableParams = {},\n\trowGroupStyles = options.rowGroupStyles || {\n\t\tfontStyle: \"bold\",\n\t\tfontSize: 12,\n\t\tcellPadding: 6,\n\t\tfillColor: 220,\n\t},\n\trowCalcStyles = options.rowCalcStyles || {\n\t\tfontStyle: \"bold\",\n\t\tfontSize: 10,\n\t\tcellPadding: 4,\n\t\tfillColor: 232,\n\t},\n\tjsPDFParams = options.jsPDF || {},\n\ttitle = options.title ? options.title : \"\",\n\tjspdfLib, doc;\n\n\tif(!jsPDFParams.orientation){\n\t\tjsPDFParams.orientation = options.orientation || \"landscape\";\n\t}\n\n\tif(!jsPDFParams.unit){\n\t\tjsPDFParams.unit = \"pt\";\n\t}\n\n\t//parse row list\n\tlist.forEach((row) => {\n\t\tswitch(row.type){\n\t\t\tcase \"header\":\n\t\t\t\theader.push(parseRow(row));\n\t\t\t\tbreak;\n\n\t\t\tcase \"group\":\n\t\t\t\tbody.push(parseRow(row, rowGroupStyles));\n\t\t\t\tbreak;\n\n\t\t\tcase \"calc\":\n\t\t\t\tbody.push(parseRow(row, rowCalcStyles));\n\t\t\t\tbreak;\n\n\t\t\tcase \"row\":\n\t\t\t\tbody.push(parseRow(row));\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\tfunction parseRow(row, styles){\n\t\tvar rowData = [];\n\n\t\trow.columns.forEach((col) =>{\n\t\t\tvar cell;\n\n\t\t\tif(col){\n\t\t\t\tswitch(typeof col.value){\n\t\t\t\t\tcase \"object\":\n\t\t\t\t\t\tcol.value = col.value !== null ? JSON.stringify(col.value) : \"\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"undefined\":\n\t\t\t\t\t\tcol.value = \"\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcell = {\n\t\t\t\t\tcontent:col.value,\n\t\t\t\t\tcolSpan:col.width,\n\t\t\t\t\trowSpan:col.height,\n\t\t\t\t};\n\n\t\t\t\tif(styles){\n\t\t\t\t\tcell.styles = styles;\n\t\t\t\t}\n\n\t\t\t\trowData.push(cell);\n\t\t\t}\n\t\t});\n\n\t\treturn rowData;\n\t}\n\n\n\t//configure PDF\n\tjspdfLib = this.dependencyRegistry.lookup(\"jspdf\", \"jsPDF\");\n\tdoc = new jspdfLib(jsPDFParams); //set document to landscape, better for most tables\n\n\tif(options.autoTable){\n\t\tif(typeof options.autoTable === \"function\"){\n\t\t\tautoTableParams = options.autoTable(doc) || {};\n\t\t}else {\n\t\t\tautoTableParams = options.autoTable;\n\t\t}\n\t}\n\n\tif(title){\n\t\tautoTableParams.didDrawPage = function(data) {\n\t\t\tdoc.text(title, 40, 30);\n\t\t};\n\t}\n\n\tautoTableParams.head = header;\n\tautoTableParams.body = body;\n\n\tdoc.autoTable(autoTableParams);\n\n\tif(options.documentProcessing){\n\t\toptions.documentProcessing(doc);\n\t}\n\n\tsetFileContents(doc.output(\"arraybuffer\"), \"application/pdf\");\n}\n\nfunction xlsx$1(list, options, setFileContents){\n\tvar self = this,\n\tsheetName = options.sheetName || \"Sheet1\",\n\tXLSXLib = this.dependencyRegistry.lookup(\"XLSX\"),\n\tworkbook = XLSXLib.utils.book_new(),\n\ttableFeatures = new CoreFeature(this),\n\tcompression = 'compress' in options ? options.compress : true,\n\twriteOptions = options.writeOptions || {bookType:'xlsx', bookSST:true, compression},\n\toutput;\n\n\twriteOptions.type = 'binary';\n\n\tworkbook.SheetNames = [];\n\tworkbook.Sheets = {};\n\n\tfunction generateSheet(){\n\t\tvar rows = [],\n\t\tmerges = [],\n\t\tworksheet = {},\n\t\trange = {s: {c:0, r:0}, e: {c:(list[0] ? list[0].columns.reduce((a, b) => a + (b && b.width ? b.width : 1), 0) : 0), r:list.length }};\n\n\t\t//parse row list\n\t\tlist.forEach((row, i) => {\n\t\t\tvar rowData = [];\n\n\t\t\trow.columns.forEach(function(col, j){\n\n\t\t\t\tif(col){\n\t\t\t\t\trowData.push(!(col.value instanceof Date) && typeof col.value === \"object\" ? JSON.stringify(col.value) : col.value);\n\n\t\t\t\t\tif(col.width > 1 || col.height > -1){\n\t\t\t\t\t\tif(col.height > 1 || col.width > 1){\n\t\t\t\t\t\t\tmerges.push({s:{r:i,c:j},e:{r:i + col.height - 1,c:j + col.width - 1}});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}else {\n\t\t\t\t\trowData.push(\"\");\n\t\t\t\t}\n\t\t\t});\n\n\t\t\trows.push(rowData);\n\t\t});\n\n\t\t//convert rows to worksheet\n\t\tXLSXLib.utils.sheet_add_aoa(worksheet, rows);\n\n\t\tworksheet['!ref'] = XLSXLib.utils.encode_range(range);\n\n\t\tif(merges.length){\n\t\t\tworksheet[\"!merges\"] = merges;\n\t\t}\n\n\t\treturn worksheet;\n\t}\n\n\tif(options.sheetOnly){\n\t\tsetFileContents(generateSheet());\n\t\treturn;\n\t}\n\n\tif(options.sheets){\n\t\tfor(var sheet in options.sheets){\n\n\t\t\tif(options.sheets[sheet] === true){\n\t\t\t\tworkbook.SheetNames.push(sheet);\n\t\t\t\tworkbook.Sheets[sheet] = generateSheet();\n\t\t\t}else {\n\n\t\t\t\tworkbook.SheetNames.push(sheet);\n\n\t\t\t\ttableFeatures.commsSend(options.sheets[sheet], \"download\", \"intercept\",{\n\t\t\t\t\ttype:\"xlsx\",\n\t\t\t\t\toptions:{sheetOnly:true},\n\t\t\t\t\tactive:self.active,\n\t\t\t\t\tintercept:function(data){\n\t\t\t\t\t\tworkbook.Sheets[sheet] = data;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}else {\n\t\tworkbook.SheetNames.push(sheetName);\n\t\tworkbook.Sheets[sheetName] = generateSheet();\n\t}\n\n\tif(options.documentProcessing){\n\t\tworkbook = options.documentProcessing(workbook);\n\t}\n\n\t//convert workbook to binary array\n\tfunction s2ab(s) {\n\t\tvar buf = new ArrayBuffer(s.length);\n\t\tvar view = new Uint8Array(buf);\n\t\tfor (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;\n\t\treturn buf;\n\t}\n\n\toutput = XLSXLib.write(workbook, writeOptions);\n\n\tsetFileContents(s2ab(output), \"application/octet-stream\");\n}\n\nfunction html$1(list, options, setFileContents){\n\tif(this.modExists(\"export\", true)){\n\t\tsetFileContents(this.modules.export.generateHTMLTable(list), \"text/html\");\n\t}\n}\n\nfunction jsonLines (list, options, setFileContents) {\n\tconst fileContents = [];\n\n\tlist.forEach((row) => {\n\t\tconst item = {};\n\n\t\tswitch (row.type) {\n\t\t\tcase \"header\":\n\t\t\t\tbreak;\n\n\t\t\tcase \"group\":\n\t\t\t\tconsole.warn(\"Download Warning - JSON downloader cannot process row groups\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"calc\":\n\t\t\t\tconsole.warn(\"Download Warning - JSON downloader cannot process column calculations\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"row\":\n\t\t\t\trow.columns.forEach((col) => {\n\t\t\t\t\tif (col) {\n\t\t\t\t\t\titem[col.component.getTitleDownload() || col.component.getField()] = col.value;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tfileContents.push(JSON.stringify(item));\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\tsetFileContents(fileContents.join(\"\\n\"), \"application/x-ndjson\");\n}\n\nvar defaultDownloaders = {\n\tcsv:csv$1,\n\tjson:json$2,\n\tjsonLines:jsonLines,\n\tpdf:pdf,\n\txlsx:xlsx$1,\n\thtml:html$1,\n};\n\nclass Download extends Module{\n\n\tstatic moduleName = \"download\";\n\n\t//load defaults\n\tstatic downloaders = defaultDownloaders;\n\n\tconstructor(table){\n\t\tsuper(table);\n\n\t\tthis.registerTableOption(\"downloadEncoder\", function(data, mimeType){\n\t\t\treturn new Blob([data],{type:mimeType});\n\t\t}); //function to manipulate download data\n\t\tthis.registerTableOption(\"downloadConfig\", {}); //download config\n\t\tthis.registerTableOption(\"downloadRowRange\", \"active\"); //restrict download to active rows only\n\n\t\tthis.registerColumnOption(\"download\");\n\t\tthis.registerColumnOption(\"titleDownload\");\n\t}\n\n\tinitialize(){\n\t\tthis.deprecatedOptionsCheck();\n\n\t\tthis.registerTableFunction(\"download\", this.download.bind(this));\n\t\tthis.registerTableFunction(\"downloadToTab\", this.downloadToTab.bind(this));\n\t}\n\n\tdeprecatedOptionsCheck(){\n\n\t}\t\n\n\t///////////////////////////////////\n\t///////// Table Functions /////////\n\t///////////////////////////////////\n\n\tdownloadToTab(type, filename, options, active){\n\t\tthis.download(type, filename, options, active, true);\n\t}\n\n\t///////////////////////////////////\n\t///////// Internal Logic //////////\n\t///////////////////////////////////\n\n\t//trigger file download\n\tdownload(type, filename, options, range, interceptCallback){\n\t\tvar downloadFunc = false;\n\n\t\tfunction buildLink(data, mime){\n\t\t\tif(interceptCallback){\n\t\t\t\tif(interceptCallback === true){\n\t\t\t\t\tthis.triggerDownload(data, mime, type, filename, true);\n\t\t\t\t}else {\n\t\t\t\t\tinterceptCallback(data);\n\t\t\t\t}\n\n\t\t\t}else {\n\t\t\t\tthis.triggerDownload(data, mime, type, filename);\n\t\t\t}\n\t\t}\n\n\t\tif(typeof type == \"function\"){\n\t\t\tdownloadFunc = type;\n\t\t}else {\n\t\t\tif(Download.downloaders[type]){\n\t\t\t\tdownloadFunc = Download.downloaders[type];\n\t\t\t}else {\n\t\t\t\tconsole.warn(\"Download Error - No such download type found: \", type);\n\t\t\t}\n\t\t}\n\n\t\tif(downloadFunc){\n\t\t\tvar list = this.generateExportList(range);\n\n\t\t\tdownloadFunc.call(this.table, list , options || {}, buildLink.bind(this));\n\t\t}\n\t}\n\n\tgenerateExportList(range){\n\t\tvar list = this.table.modules.export.generateExportList(this.table.options.downloadConfig, false, range || this.table.options.downloadRowRange, \"download\");\n\n\t\t//assign group header formatter\n\t\tvar groupHeader = this.table.options.groupHeaderDownload;\n\n\t\tif(groupHeader && !Array.isArray(groupHeader)){\n\t\t\tgroupHeader = [groupHeader];\n\t\t}\n\n\t\tlist.forEach((row) => {\n\t\t\tvar group;\n\n\t\t\tif(row.type === \"group\"){\n\t\t\t\tgroup = row.columns[0];\n\n\t\t\t\tif(groupHeader && groupHeader[row.indent]){\n\t\t\t\t\tgroup.value = groupHeader[row.indent](group.value, row.component._group.getRowCount(), row.component._group.getData(), row.component);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn list;\n\t}\n\n\ttriggerDownload(data, mime, type, filename, newTab){\n\t\tvar element = document.createElement('a'),\n\t\tblob = this.table.options.downloadEncoder(data, mime);\n\n\t\tif(blob){\n\t\t\tif(newTab){\n\t\t\t\twindow.open(window.URL.createObjectURL(blob));\n\t\t\t}else {\n\t\t\t\tfilename = filename || \"Tabulator.\" + (typeof type === \"function\" ? \"txt\" : type);\n\t\t\t\t\n\t\t\t\tif(navigator.msSaveOrOpenBlob){\n\t\t\t\t\tnavigator.msSaveOrOpenBlob(blob, filename);\n\t\t\t\t}else {\n\t\t\t\t\telement.setAttribute('href', window.URL.createObjectURL(blob));\n\n\t\t\t\t\t//set file title\n\t\t\t\t\telement.setAttribute('download', filename);\n\n\t\t\t\t\t//trigger download\n\t\t\t\t\telement.style.display = 'none';\n\t\t\t\t\tdocument.body.appendChild(element);\n\t\t\t\t\telement.click();\n\n\t\t\t\t\t//remove temporary link element\n\t\t\t\t\tdocument.body.removeChild(element);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.dispatchExternal(\"downloadComplete\");\n\t\t}\n\t}\n\n\tcommsReceived(table, action, data){\n\t\tswitch(action){\n\t\t\tcase \"intercept\":\n\t\t\t\tthis.download(data.type, \"\", data.options, data.active, data.intercept);\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\nfunction maskInput(el, options){\n\tvar mask = options.mask,\n\tmaskLetter = typeof options.maskLetterChar !== \"undefined\" ? options.maskLetterChar : \"A\",\n\tmaskNumber = typeof options.maskNumberChar !== \"undefined\" ? options.maskNumberChar : \"9\",\n\tmaskWildcard = typeof options.maskWildcardChar !== \"undefined\" ? options.maskWildcardChar : \"*\";\n\n\tfunction fillSymbols(index){\n\t\tvar symbol = mask[index];\n\t\tif(typeof symbol !== \"undefined\" && symbol !== maskWildcard && symbol !== maskLetter && symbol !== maskNumber){\n\t\t\tel.value = el.value + \"\" + symbol;\n\t\t\tfillSymbols(index+1);\n\t\t}\n\t}\n\n\tel.addEventListener(\"keydown\", (e) => {\n\t\tvar index = el.value.length,\n\t\tchar = e.key;\n\n\t\tif(e.keyCode > 46 && !e.ctrlKey && !e.metaKey){\n\t\t\tif(index >= mask.length){\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t\treturn false;\n\t\t\t}else {\n\t\t\t\tswitch(mask[index]){\n\t\t\t\t\tcase maskLetter:\n\t\t\t\t\t\tif(char.toUpperCase() == char.toLowerCase()){\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase maskNumber:\n\t\t\t\t\t\tif(isNaN(char)){\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase maskWildcard:\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif(char !== mask[index]){\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn;\n\t});\n\n\tel.addEventListener(\"keyup\", (e) => {\n\t\tif(e.keyCode > 46){\n\t\t\tif(options.maskAutoFill){\n\t\t\t\tfillSymbols(el.value.length);\n\t\t\t}\n\t\t}\n\t});\n\n\n\tif(!el.placeholder){\n\t\tel.placeholder = mask;\n\t}\n\n\tif(options.maskAutoFill){\n\t\tfillSymbols(el.value.length);\n\t}\n}\n\n//input element\nfunction input(cell, onRendered, success, cancel, editorParams){\n\t//create and style input\n\tvar cellValue = cell.getValue(),\n\tinput = document.createElement(\"input\");\n\n\tinput.setAttribute(\"type\", editorParams.search ? \"search\" : \"text\");\n\n\tinput.style.padding = \"4px\";\n\tinput.style.width = \"100%\";\n\tinput.style.boxSizing = \"border-box\";\n\n\tif(editorParams.elementAttributes && typeof editorParams.elementAttributes == \"object\"){\n\t\tfor (let key in editorParams.elementAttributes){\n\t\t\tif(key.charAt(0) == \"+\"){\n\t\t\t\tkey = key.slice(1);\n\t\t\t\tinput.setAttribute(key, input.getAttribute(key) + editorParams.elementAttributes[\"+\" + key]);\n\t\t\t}else {\n\t\t\t\tinput.setAttribute(key, editorParams.elementAttributes[key]);\n\t\t\t}\n\t\t}\n\t}\n\n\tinput.value = typeof cellValue !== \"undefined\" ? cellValue : \"\";\n\n\tonRendered(function(){\n\t\tif(cell.getType() === \"cell\"){\n\t\t\tinput.focus({preventScroll: true});\n\t\t\tinput.style.height = \"100%\";\n\n\t\t\tif(editorParams.selectContents){\n\t\t\t\tinput.select();\n\t\t\t}\n\t\t}\n\t});\n\n\tfunction onChange(e){\n\t\tif(((cellValue === null || typeof cellValue === \"undefined\") && input.value !== \"\") || input.value !== cellValue){\n\t\t\tif(success(input.value)){\n\t\t\t\tcellValue = input.value; //persist value if successfully validated incase editor is used as header filter\n\t\t\t}\n\t\t}else {\n\t\t\tcancel();\n\t\t}\n\t}\n\n\t//submit new value on blur or change\n\tinput.addEventListener(\"change\", onChange);\n\tinput.addEventListener(\"blur\", onChange);\n\n\t//submit new value on enter\n\tinput.addEventListener(\"keydown\", function(e){\n\t\tswitch(e.keyCode){\n\t\t\t// case 9:\n\t\t\tcase 13:\n\t\t\t\tonChange();\n\t\t\t\tbreak;\n\n\t\t\tcase 27:\n\t\t\t\tcancel();\n\t\t\t\tbreak;\n\n\t\t\tcase 35:\n\t\t\tcase 36:\n\t\t\t\te.stopPropagation();\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\tif(editorParams.mask){\n\t\tmaskInput(input, editorParams);\n\t}\n\n\treturn input;\n}\n\n//resizable text area element\nfunction textarea$1(cell, onRendered, success, cancel, editorParams){\n\tvar cellValue = cell.getValue(),\n\tvertNav = editorParams.verticalNavigation || \"hybrid\",\n\tvalue = String(cellValue !== null && typeof cellValue !== \"undefined\" ? cellValue : \"\"),\n\tinput = document.createElement(\"textarea\"),\n\tscrollHeight = 0;\n\n\t//create and style input\n\tinput.style.display = \"block\";\n\tinput.style.padding = \"2px\";\n\tinput.style.height = \"100%\";\n\tinput.style.width = \"100%\";\n\tinput.style.boxSizing = \"border-box\";\n\tinput.style.whiteSpace = \"pre-wrap\";\n\tinput.style.resize = \"none\";\n\n\tif(editorParams.elementAttributes && typeof editorParams.elementAttributes == \"object\"){\n\t\tfor (let key in editorParams.elementAttributes){\n\t\t\tif(key.charAt(0) == \"+\"){\n\t\t\t\tkey = key.slice(1);\n\t\t\t\tinput.setAttribute(key, input.getAttribute(key) + editorParams.elementAttributes[\"+\" + key]);\n\t\t\t}else {\n\t\t\t\tinput.setAttribute(key, editorParams.elementAttributes[key]);\n\t\t\t}\n\t\t}\n\t}\n\n\tinput.value = value;\n\n\tonRendered(function(){\n\t\tif(cell.getType() === \"cell\"){\n\t\t\tinput.focus({preventScroll: true});\n\t\t\tinput.style.height = \"100%\";\n\n\t\t\tinput.scrollHeight;\n\t\t\tinput.style.height = input.scrollHeight + \"px\";\n\t\t\tcell.getRow().normalizeHeight();\n\n\t\t\tif(editorParams.selectContents){\n\t\t\t\tinput.select();\n\t\t\t}\n\t\t}\n\t});\n\n\tfunction onChange(e){\n\n\t\tif(((cellValue === null || typeof cellValue === \"undefined\") && input.value !== \"\") || input.value !== cellValue){\n\n\t\t\tif(success(input.value)){\n\t\t\t\tcellValue = input.value; //persist value if successfully validated incase editor is used as header filter\n\t\t\t}\n\n\t\t\tsetTimeout(function(){\n\t\t\t\tcell.getRow().normalizeHeight();\n\t\t\t},300);\n\t\t}else {\n\t\t\tcancel();\n\t\t}\n\t}\n\n\t//submit new value on blur or change\n\tinput.addEventListener(\"change\", onChange);\n\tinput.addEventListener(\"blur\", onChange);\n\n\tinput.addEventListener(\"keyup\", function(){\n\n\t\tinput.style.height = \"\";\n\n\t\tvar heightNow = input.scrollHeight;\n\n\t\tinput.style.height = heightNow + \"px\";\n\n\t\tif(heightNow != scrollHeight){\n\t\t\tscrollHeight = heightNow;\n\t\t\tcell.getRow().normalizeHeight();\n\t\t}\n\t});\n\n\tinput.addEventListener(\"keydown\", function(e){\n\n\t\tswitch(e.keyCode){\n\n\t\t\tcase 13:\n\t\t\t\tif(e.shiftKey && editorParams.shiftEnterSubmit){\n\t\t\t\t\tonChange();\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 27:\n\t\t\t\tcancel();\n\t\t\t\tbreak;\n\n\t\t\tcase 38: //up arrow\n\t\t\t\tif(vertNav == \"editor\" || (vertNav == \"hybrid\" && input.selectionStart)){\n\t\t\t\t\te.stopImmediatePropagation();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 40: //down arrow\n\t\t\t\tif(vertNav == \"editor\" || (vertNav == \"hybrid\" && input.selectionStart !== input.value.length)){\n\t\t\t\t\te.stopImmediatePropagation();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 35:\n\t\t\tcase 36:\n\t\t\t\te.stopPropagation();\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\tif(editorParams.mask){\n\t\tmaskInput(input, editorParams);\n\t}\n\n\treturn input;\n}\n\n//input element with type of number\nfunction number$1(cell, onRendered, success, cancel, editorParams){\n\tvar cellValue = cell.getValue(),\n\tvertNav = editorParams.verticalNavigation || \"editor\",\n\tinput = document.createElement(\"input\");\n\n\tinput.setAttribute(\"type\", \"number\");\n\n\tif(typeof editorParams.max != \"undefined\"){\n\t\tinput.setAttribute(\"max\", editorParams.max);\n\t}\n\n\tif(typeof editorParams.min != \"undefined\"){\n\t\tinput.setAttribute(\"min\", editorParams.min);\n\t}\n\n\tif(typeof editorParams.step != \"undefined\"){\n\t\tinput.setAttribute(\"step\", editorParams.step);\n\t}\n\n\t//create and style input\n\tinput.style.padding = \"4px\";\n\tinput.style.width = \"100%\";\n\tinput.style.boxSizing = \"border-box\";\n\n\tif(editorParams.elementAttributes && typeof editorParams.elementAttributes == \"object\"){\n\t\tfor (let key in editorParams.elementAttributes){\n\t\t\tif(key.charAt(0) == \"+\"){\n\t\t\t\tkey = key.slice(1);\n\t\t\t\tinput.setAttribute(key, input.getAttribute(key) + editorParams.elementAttributes[\"+\" + key]);\n\t\t\t}else {\n\t\t\t\tinput.setAttribute(key, editorParams.elementAttributes[key]);\n\t\t\t}\n\t\t}\n\t}\n\n\tinput.value = cellValue;\n\n\tvar blurFunc = function(e){\n\t\tonChange();\n\t};\n\n\tonRendered(function () {\n\t\tif(cell.getType() === \"cell\"){\n\t\t\t//submit new value on blur\n\t\t\tinput.removeEventListener(\"blur\", blurFunc);\n\n\t\t\tinput.focus({preventScroll: true});\n\t\t\tinput.style.height = \"100%\";\n\n\t\t\t//submit new value on blur\n\t\t\tinput.addEventListener(\"blur\", blurFunc);\n\n\t\t\tif(editorParams.selectContents){\n\t\t\t\tinput.select();\n\t\t\t}\n\t\t}\n\t});\n\n\tfunction onChange(){\n\t\tvar value = input.value;\n\n\t\tif(!isNaN(value) && value !==\"\"){\n\t\t\tvalue = Number(value);\n\t\t}\n\n\t\tif(value !== cellValue){\n\t\t\tif(success(value)){\n\t\t\t\tcellValue = value; //persist value if successfully validated incase editor is used as header filter\n\t\t\t}\n\t\t}else {\n\t\t\tcancel();\n\t\t}\n\t}\n\n\t//submit new value on enter\n\tinput.addEventListener(\"keydown\", function(e){\n\t\tswitch(e.keyCode){\n\t\t\tcase 13:\n\t\t\t// case 9:\n\t\t\t\tonChange();\n\t\t\t\tbreak;\n\n\t\t\tcase 27:\n\t\t\t\tcancel();\n\t\t\t\tbreak;\n\n\t\t\tcase 38: //up arrow\n\t\t\tcase 40: //down arrow\n\t\t\t\tif(vertNav == \"editor\"){\n\t\t\t\t\te.stopImmediatePropagation();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 35:\n\t\t\tcase 36:\n\t\t\t\te.stopPropagation();\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\tif(editorParams.mask){\n\t\tmaskInput(input, editorParams);\n\t}\n\n\treturn input;\n}\n\n//input element with type of number\nfunction range(cell, onRendered, success, cancel, editorParams){\n\tvar cellValue = cell.getValue(),\n\tinput = document.createElement(\"input\");\n\t\n\tinput.setAttribute(\"type\", \"range\");\n\t\n\tif (typeof editorParams.max != \"undefined\") {\n\t\tinput.setAttribute(\"max\", editorParams.max);\n\t}\n\t\n\tif (typeof editorParams.min != \"undefined\") {\n\t\tinput.setAttribute(\"min\", editorParams.min);\n\t}\n\t\n\tif (typeof editorParams.step != \"undefined\") {\n\t\tinput.setAttribute(\"step\", editorParams.step);\n\t}\n\t\n\t//create and style input\n\tinput.style.padding = \"4px\";\n\tinput.style.width = \"100%\";\n\tinput.style.boxSizing = \"border-box\";\n\t\n\tif(editorParams.elementAttributes && typeof editorParams.elementAttributes == \"object\"){\n\t\tfor (let key in editorParams.elementAttributes){\n\t\t\tif(key.charAt(0) == \"+\"){\n\t\t\t\tkey = key.slice(1);\n\t\t\t\tinput.setAttribute(key, input.getAttribute(key) + editorParams.elementAttributes[\"+\" + key]);\n\t\t\t}else {\n\t\t\t\tinput.setAttribute(key, editorParams.elementAttributes[key]);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tinput.value = cellValue;\n\t\n\tonRendered(function () {\n\t\tif(cell.getType() === \"cell\"){\n\t\t\tinput.focus({preventScroll: true});\n\t\t\tinput.style.height = \"100%\";\n\t\t}\n\t});\n\t\n\tfunction onChange(){\n\t\tvar value = input.value;\n\t\t\n\t\tif(!isNaN(value) && value !==\"\"){\n\t\t\tvalue = Number(value);\n\t\t}\n\t\t\n\t\tif(value != cellValue){\n\t\t\tif(success(value)){\n\t\t\t\tcellValue = value; //persist value if successfully validated incase editor is used as header filter\n\t\t\t}\n\t\t}else {\n\t\t\tcancel();\n\t\t}\n\t}\n\t\n\t//submit new value on blur\n\tinput.addEventListener(\"blur\", function(e){\n\t\tonChange();\n\t});\n\t\n\t//submit new value on enter\n\tinput.addEventListener(\"keydown\", function(e){\n\t\tswitch(e.keyCode){\n\t\t\tcase 13:\n\t\t\t// case 9:\n\t\t\t\tonChange();\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 27:\n\t\t\t\tcancel();\n\t\t\t\tbreak;\n\t\t}\n\t});\n\t\n\treturn input;\n}\n\n//input element\nfunction date$1(cell, onRendered, success, cancel, editorParams){\n\tvar inputFormat = editorParams.format,\n\tvertNav = editorParams.verticalNavigation || \"editor\",\n\tDT = inputFormat ? (window.DateTime || luxon.DateTime) : null;\n\t\n\t//create and style input\n\tvar cellValue = cell.getValue(),\n\tinput = document.createElement(\"input\");\n\t\n\tfunction convertDate(value){\n\t\tvar newDatetime;\n\t\t\n\t\tif(DT.isDateTime(value)){\n\t\t\tnewDatetime = value;\n\t\t}else if(inputFormat === \"iso\"){\n\t\t\tnewDatetime = DT.fromISO(String(value));\n\t\t}else {\n\t\t\tnewDatetime = DT.fromFormat(String(value), inputFormat);\n\t\t}\n\t\t\n\t\treturn newDatetime.toFormat(\"yyyy-MM-dd\");\n\t}\n\t\n\tinput.type = \"date\";\n\tinput.style.padding = \"4px\";\n\tinput.style.width = \"100%\";\n\tinput.style.boxSizing = \"border-box\";\n\n\tif(editorParams.max){\n\t\tinput.setAttribute(\"max\", inputFormat ? convertDate(editorParams.max) : editorParams.max);\n\t}\n\n\tif(editorParams.min){\n\t\tinput.setAttribute(\"min\", inputFormat ? convertDate(editorParams.min) : editorParams.min);\n\t}\n\t\n\tif(editorParams.elementAttributes && typeof editorParams.elementAttributes == \"object\"){\n\t\tfor (let key in editorParams.elementAttributes){\n\t\t\tif(key.charAt(0) == \"+\"){\n\t\t\t\tkey = key.slice(1);\n\t\t\t\tinput.setAttribute(key, input.getAttribute(key) + editorParams.elementAttributes[\"+\" + key]);\n\t\t\t}else {\n\t\t\t\tinput.setAttribute(key, editorParams.elementAttributes[key]);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tcellValue = typeof cellValue !== \"undefined\" ? cellValue : \"\";\n\t\n\tif(inputFormat){\n\t\tif(DT){\t\t\n\t\t\tcellValue = convertDate(cellValue);\t\t\t\n\t\t}else {\n\t\t\tconsole.error(\"Editor Error - 'date' editor 'format' param is dependant on luxon.js\");\n\t\t}\n\t}\n\t\n\tinput.value = cellValue;\n\t\n\tonRendered(function(){\n\t\tif(cell.getType() === \"cell\"){\n\t\t\tinput.focus({preventScroll: true});\n\t\t\tinput.style.height = \"100%\";\n\t\t\t\n\t\t\tif(editorParams.selectContents){\n\t\t\t\tinput.select();\n\t\t\t}\n\t\t}\n\t});\n\t\n\tfunction onChange(){\n\t\tvar value = input.value,\n\t\tluxDate;\n\t\t\n\t\tif(((cellValue === null || typeof cellValue === \"undefined\") && value !== \"\") || value !== cellValue){\n\t\t\t\n\t\t\tif(value && inputFormat){\n\t\t\t\tluxDate = DT.fromFormat(String(value), \"yyyy-MM-dd\");\n\n\t\t\t\tswitch(inputFormat){\n\t\t\t\t\tcase true:\n\t\t\t\t\t\tvalue = luxDate;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"iso\":\n\t\t\t\t\t\tvalue = luxDate.toISO();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvalue = luxDate.toFormat(inputFormat);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif(success(value)){\n\t\t\t\tcellValue = input.value; //persist value if successfully validated incase editor is used as header filter\n\t\t\t}\n\t\t}else {\n\t\t\tcancel();\n\t\t}\n\t}\n\t\n\t//submit new value on blur\n\tinput.addEventListener(\"blur\", function(e) {\n\t\tif (e.relatedTarget || e.rangeParent || e.explicitOriginalTarget !== input) {\n\t\t\tonChange(); // only on a \"true\" blur; not when focusing browser's date/time picker\n\t\t}\n\t});\n\t\n\t//submit new value on enter\n\tinput.addEventListener(\"keydown\", function(e){\n\t\tswitch(e.keyCode){\n\t\t\t// case 9:\n\t\t\tcase 13:\n\t\t\t\tonChange();\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 27:\n\t\t\t\tcancel();\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 35:\n\t\t\tcase 36:\n\t\t\t\te.stopPropagation();\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 38: //up arrow\n\t\t\tcase 40: //down arrow\n\t\t\t\tif(vertNav == \"editor\"){\n\t\t\t\t\te.stopImmediatePropagation();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t});\n\t\n\treturn input;\n}\n\n//input element\nfunction time$1(cell, onRendered, success, cancel, editorParams){\n\tvar inputFormat = editorParams.format,\n\tvertNav = editorParams.verticalNavigation || \"editor\",\n\tDT = inputFormat ? (window.DateTime || luxon.DateTime) : null, \n\tnewDatetime;\n\t\n\t//create and style input\n\tvar cellValue = cell.getValue(),\n\tinput = document.createElement(\"input\");\n\t\n\tinput.type = \"time\";\n\tinput.style.padding = \"4px\";\n\tinput.style.width = \"100%\";\n\tinput.style.boxSizing = \"border-box\";\n\t\n\tif(editorParams.elementAttributes && typeof editorParams.elementAttributes == \"object\"){\n\t\tfor (let key in editorParams.elementAttributes){\n\t\t\tif(key.charAt(0) == \"+\"){\n\t\t\t\tkey = key.slice(1);\n\t\t\t\tinput.setAttribute(key, input.getAttribute(key) + editorParams.elementAttributes[\"+\" + key]);\n\t\t\t}else {\n\t\t\t\tinput.setAttribute(key, editorParams.elementAttributes[key]);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tcellValue = typeof cellValue !== \"undefined\" ? cellValue : \"\";\n\t\n\tif(inputFormat){\n\t\tif(DT){\n\t\t\tif(DT.isDateTime(cellValue)){\n\t\t\t\tnewDatetime = cellValue;\n\t\t\t}else if(inputFormat === \"iso\"){\n\t\t\t\tnewDatetime = DT.fromISO(String(cellValue));\n\t\t\t}else {\n\t\t\t\tnewDatetime = DT.fromFormat(String(cellValue), inputFormat);\n\t\t\t}\n\t\t\t\n\t\t\tcellValue = newDatetime.toFormat(\"HH:mm\");\n\t\t\t\n\t\t}else {\n\t\t\tconsole.error(\"Editor Error - 'date' editor 'format' param is dependant on luxon.js\");\n\t\t}\n\t}\n\t\n\tinput.value = cellValue;\n\t\n\tonRendered(function(){\n\t\tif(cell.getType() == \"cell\"){\n\t\t\tinput.focus({preventScroll: true});\n\t\t\tinput.style.height = \"100%\";\n\t\t\t\n\t\t\tif(editorParams.selectContents){\n\t\t\t\tinput.select();\n\t\t\t}\n\t\t}\n\t});\n\t\n\tfunction onChange(){\n\t\tvar value = input.value,\n\t\tluxTime;\n\t\t\n\t\tif(((cellValue === null || typeof cellValue === \"undefined\") && value !== \"\") || value !== cellValue){\n\t\t\t\n\t\t\tif(value && inputFormat){\n\t\t\t\tluxTime = DT.fromFormat(String(value), \"hh:mm\");\n\n\t\t\t\tswitch(inputFormat){\n\t\t\t\t\tcase true:\n\t\t\t\t\t\tvalue = luxTime;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"iso\":\n\t\t\t\t\t\tvalue = luxTime.toISO();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvalue = luxTime.toFormat(inputFormat);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif(success(value)){\n\t\t\t\tcellValue = input.value; //persist value if successfully validated incase editor is used as header filter\n\t\t\t}\n\t\t}else {\n\t\t\tcancel();\n\t\t}\n\t}\n\t\n\t//submit new value on blur\n\tinput.addEventListener(\"blur\", function(e) {\n\t\tif (e.relatedTarget || e.rangeParent || e.explicitOriginalTarget !== input) {\n\t\t\tonChange(); // only on a \"true\" blur; not when focusing browser's date/time picker\n\t\t}\n\t});\n\t\n\t//submit new value on enter\n\tinput.addEventListener(\"keydown\", function(e){\n\t\tswitch(e.keyCode){\n\t\t\t// case 9:\n\t\t\tcase 13:\n\t\t\t\tonChange();\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 27:\n\t\t\t\tcancel();\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 35:\n\t\t\tcase 36:\n\t\t\t\te.stopPropagation();\n\t\t\t\tbreak;\n\n\t\t\tcase 38: //up arrow\n\t\t\tcase 40: //down arrow\n\t\t\t\tif(vertNav == \"editor\"){\n\t\t\t\t\te.stopImmediatePropagation();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t});\n\t\n\treturn input;\n}\n\n//input element\nfunction datetime$2(cell, onRendered, success, cancel, editorParams){\n\tvar inputFormat = editorParams.format,\n\tvertNav = editorParams.verticalNavigation || \"editor\",\n\tDT = inputFormat ? (this.table.dependencyRegistry.lookup([\"luxon\", \"DateTime\"], \"DateTime\")) : null, \n\tnewDatetime;\n\t\n\t//create and style input\n\tvar cellValue = cell.getValue(),\n\tinput = document.createElement(\"input\");\n\t\n\tinput.type = \"datetime-local\";\n\tinput.style.padding = \"4px\";\n\tinput.style.width = \"100%\";\n\tinput.style.boxSizing = \"border-box\";\n\t\n\tif(editorParams.elementAttributes && typeof editorParams.elementAttributes == \"object\"){\n\t\tfor (let key in editorParams.elementAttributes){\n\t\t\tif(key.charAt(0) == \"+\"){\n\t\t\t\tkey = key.slice(1);\n\t\t\t\tinput.setAttribute(key, input.getAttribute(key) + editorParams.elementAttributes[\"+\" + key]);\n\t\t\t}else {\n\t\t\t\tinput.setAttribute(key, editorParams.elementAttributes[key]);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tcellValue = typeof cellValue !== \"undefined\" ? cellValue : \"\";\n\t\n\tif(inputFormat){\n\t\tif(DT){\n\t\t\tif(DT.isDateTime(cellValue)){\n\t\t\t\tnewDatetime = cellValue;\n\t\t\t}else if(inputFormat === \"iso\"){\n\t\t\t\tnewDatetime = DT.fromISO(String(cellValue));\n\t\t\t}else {\n\t\t\t\tnewDatetime = DT.fromFormat(String(cellValue), inputFormat);\n\t\t\t}\n\t\t\t\n\t\t\tcellValue = newDatetime.toFormat(\"yyyy-MM-dd\") + \"T\" + newDatetime.toFormat(\"HH:mm\");\n\t\t}else {\n\t\t\tconsole.error(\"Editor Error - 'date' editor 'format' param is dependant on luxon.js\");\n\t\t}\n\t}\n\t\n\tinput.value = cellValue;\n\t\n\tonRendered(function(){\n\t\tif(cell.getType() === \"cell\"){\n\t\t\tinput.focus({preventScroll: true});\n\t\t\tinput.style.height = \"100%\";\n\t\t\t\n\t\t\tif(editorParams.selectContents){\n\t\t\t\tinput.select();\n\t\t\t}\n\t\t}\n\t});\n\t\n\tfunction onChange(){\n\t\tvar value = input.value,\n\t\tluxDateTime;\n\t\t\n\t\tif(((cellValue === null || typeof cellValue === \"undefined\") && value !== \"\") || value !== cellValue){\n\n\t\t\tif(value && inputFormat){\n\t\t\t\tluxDateTime = DT.fromISO(String(value));\n\n\t\t\t\tswitch(inputFormat){\n\t\t\t\t\tcase true:\n\t\t\t\t\t\tvalue = luxDateTime;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"iso\":\n\t\t\t\t\t\tvalue = luxDateTime.toISO();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvalue = luxDateTime.toFormat(inputFormat);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif(success(value)){\n\t\t\t\tcellValue = input.value; //persist value if successfully validated incase editor is used as header filter\n\t\t\t}\n\t\t}else {\n\t\t\tcancel();\n\t\t}\n\t}\n\t\n\t//submit new value on blur\n\tinput.addEventListener(\"blur\", function(e) {\n\t\tif (e.relatedTarget || e.rangeParent || e.explicitOriginalTarget !== input) {\n\t\t\tonChange(); // only on a \"true\" blur; not when focusing browser's date/time picker\n\t\t}\n\t});\n\t\n\t//submit new value on enter\n\tinput.addEventListener(\"keydown\", function(e){\n\t\tswitch(e.keyCode){\n\t\t\t// case 9:\n\t\t\tcase 13:\n\t\t\t\tonChange();\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 27:\n\t\t\t\tcancel();\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 35:\n\t\t\tcase 36:\n\t\t\t\te.stopPropagation();\n\t\t\t\tbreak;\n\n\t\t\tcase 38: //up arrow\n\t\t\tcase 40: //down arrow\n\t\t\t\tif(vertNav == \"editor\"){\n\t\t\t\t\te.stopImmediatePropagation();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t});\n\t\n\treturn input;\n}\n\nlet Edit$1 = class Edit{\n\tconstructor(editor, cell, onRendered, success, cancel, editorParams){\n\t\tthis.edit = editor;\n\t\tthis.table = editor.table;\n\t\tthis.cell = cell;\n\t\tthis.params = this._initializeParams(editorParams);\n\t\t\n\t\tthis.data = [];\n\t\tthis.displayItems = [];\n\t\tthis.currentItems = [];\n\t\tthis.focusedItem = null;\n\t\t\n\t\tthis.input = this._createInputElement();\n\t\tthis.listEl = this._createListElement();\n\t\t\n\t\tthis.initialValues = null; \n\t\t\n\t\tthis.isFilter = cell.getType() === \"header\";\n\t\t\n\t\tthis.filterTimeout = null;\n\t\tthis.filtered = false;\n\t\tthis.typing = false;\n\t\t\n\t\tthis.values = []; \n\t\tthis.popup = null; \n\t\t\n\t\tthis.listIteration = 0;\n\t\t\n\t\tthis.lastAction=\"\";\n\t\tthis.filterTerm=\"\";\n\t\t\n\t\tthis.blurable = true;\n\t\t\n\t\tthis.actions = {\n\t\t\tsuccess:success,\n\t\t\tcancel:cancel\n\t\t};\n\t\t\n\t\tthis._deprecatedOptionsCheck();\n\t\tthis._initializeValue();\n\t\t\n\t\tonRendered(this._onRendered.bind(this));\n\t}\n\t\n\t_deprecatedOptionsCheck(){\n\t\t// if(this.params.listItemFormatter){\n\t\t// \tthis.cell.getTable().deprecationAdvisor.msg(\"The listItemFormatter editor param has been deprecated, please see the latest editor documentation for updated options\");\n\t\t// }\n\t\t\n\t\t// if(this.params.sortValuesList){\n\t\t// \tthis.cell.getTable().deprecationAdvisor.msg(\"The sortValuesList editor param has been deprecated, please see the latest editor documentation for updated options\");\n\t\t// }\n\t\t\n\t\t// if(this.params.searchFunc){\n\t\t// \tthis.cell.getTable().deprecationAdvisor.msg(\"The searchFunc editor param has been deprecated, please see the latest editor documentation for updated options\");\n\t\t// }\n\t\t\n\t\t// if(this.params.searchingPlaceholder){\n\t\t// \tthis.cell.getTable().deprecationAdvisor.msg(\"The searchingPlaceholder editor param has been deprecated, please see the latest editor documentation for updated options\");\n\t\t// }\n\t}\n\t\n\t_initializeValue(){\n\t\tvar initialValue = this.cell.getValue();\n\t\t\n\t\tif(typeof initialValue === \"undefined\" && typeof this.params.defaultValue !== \"undefined\"){\n\t\t\tinitialValue = this.params.defaultValue;\n\t\t}\n\t\t\n\t\tthis.initialValues = this.params.multiselect ? initialValue : [initialValue];\n\t\t\n\t\tif(this.isFilter){\n\t\t\tthis.input.value = this.initialValues ? this.initialValues.join(\",\") : \"\";\n\t\t\tthis.headerFilterInitialListGen(); \n\t\t}\n\t}\n\t\n\t_onRendered(){\n\t\tvar cellEl = this.cell.getElement();\n\t\t\n\t\tfunction clickStop(e){\n\t\t\te.stopPropagation();\n\t\t}\t\n\t\t\n\t\tif(!this.isFilter){\n\t\t\tthis.input.style.height = \"100%\";\n\t\t\tthis.input.focus({preventScroll: true});\n\t\t}\n\t\t\n\t\t\n\t\tcellEl.addEventListener(\"click\", clickStop);\n\t\t\n\t\tsetTimeout(() => {\n\t\t\tcellEl.removeEventListener(\"click\", clickStop);\n\t\t}, 1000);\n\t\t\n\t\tthis.input.addEventListener(\"mousedown\", this._preventPopupBlur.bind(this));\n\t}\n\t\n\t_createListElement(){\n\t\tvar listEl = document.createElement(\"div\");\n\t\tlistEl.classList.add(\"tabulator-edit-list\");\n\t\t\n\t\tlistEl.addEventListener(\"mousedown\", this._preventBlur.bind(this));\n\t\tlistEl.addEventListener(\"keydown\", this._inputKeyDown.bind(this));\n\t\t\n\t\treturn listEl;\n\t}\n\t\n\t_setListWidth(){\n\t\tvar element = this.isFilter ? this.input : this.cell.getElement();\n\t\t\n\t\tthis.listEl.style.minWidth = element.offsetWidth + \"px\";\n\t\t\n\t\tif(this.params.maxWidth){\n\t\t\tif(this.params.maxWidth === true){\n\t\t\t\tthis.listEl.style.maxWidth = element.offsetWidth + \"px\";\n\t\t\t}else if(typeof this.params.maxWidth === \"number\"){\n\t\t\t\tthis.listEl.style.maxWidth = this.params.maxWidth + \"px\";\n\t\t\t}else {\n\t\t\t\tthis.listEl.style.maxWidth = this.params.maxWidth;\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\t_createInputElement(){\n\t\tvar attribs = this.params.elementAttributes;\n\t\tvar input = document.createElement(\"input\");\n\t\t\n\t\tinput.setAttribute(\"type\", this.params.clearable ? \"search\" : \"text\");\n\t\t\n\t\tinput.style.padding = \"4px\";\n\t\tinput.style.width = \"100%\";\n\t\tinput.style.boxSizing = \"border-box\";\n\t\t\n\t\tif(!this.params.autocomplete){\n\t\t\tinput.style.cursor = \"default\";\n\t\t\tinput.style.caretColor = \"transparent\";\n\t\t\t// input.readOnly = (this.edit.currentCell != false);\n\t\t}\n\t\t\n\t\tif(attribs && typeof attribs == \"object\"){\n\t\t\tfor (let key in attribs){\n\t\t\t\tif(key.charAt(0) == \"+\"){\n\t\t\t\t\tkey = key.slice(1);\n\t\t\t\t\tinput.setAttribute(key, input.getAttribute(key) + attribs[\"+\" + key]);\n\t\t\t\t}else {\n\t\t\t\t\tinput.setAttribute(key, attribs[key]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif(this.params.mask){\n\t\t\tmaskInput(input, this.params);\n\t\t}\n\t\t\n\t\tthis._bindInputEvents(input);\n\t\t\n\t\treturn input;\n\t}\n\t\n\t_initializeParams(params){\n\t\tvar valueKeys = [\"values\", \"valuesURL\", \"valuesLookup\"],\n\t\tvalueCheck;\n\t\t\n\t\tparams = Object.assign({}, params);\n\t\t\n\t\tparams.verticalNavigation = params.verticalNavigation || \"editor\";\n\t\tparams.placeholderLoading = typeof params.placeholderLoading === \"undefined\" ? \"Searching ...\" : params.placeholderLoading;\n\t\tparams.placeholderEmpty = typeof params.placeholderEmpty === \"undefined\" ? \"No Results Found\" : params.placeholderEmpty;\n\t\tparams.filterDelay = typeof params.filterDelay === \"undefined\" ? 300 : params.filterDelay;\n\t\t\n\t\tparams.emptyValue = Object.keys(params).includes(\"emptyValue\") ? params.emptyValue : \"\";\n\t\t\n\t\tvalueCheck = Object.keys(params).filter(key => valueKeys.includes(key)).length;\n\t\t\n\t\tif(!valueCheck){\n\t\t\tconsole.warn(\"list editor config error - either the values, valuesURL, or valuesLookup option must be set\");\n\t\t}else if(valueCheck > 1){\n\t\t\tconsole.warn(\"list editor config error - only one of the values, valuesURL, or valuesLookup options can be set on the same editor\");\n\t\t}\n\t\t\n\t\tif(params.autocomplete){\n\t\t\tif(params.multiselect){\n\t\t\t\tparams.multiselect = false;\n\t\t\t\tconsole.warn(\"list editor config error - multiselect option is not available when autocomplete is enabled\");\n\t\t\t}\n\t\t}else {\n\t\t\tif(params.freetext){\n\t\t\t\tparams.freetext = false;\n\t\t\t\tconsole.warn(\"list editor config error - freetext option is only available when autocomplete is enabled\");\n\t\t\t}\n\t\t\t\n\t\t\tif(params.filterFunc){\n\t\t\t\tparams.filterFunc = false;\n\t\t\t\tconsole.warn(\"list editor config error - filterFunc option is only available when autocomplete is enabled\");\n\t\t\t}\n\t\t\t\n\t\t\tif(params.filterRemote){\n\t\t\t\tparams.filterRemote = false;\n\t\t\t\tconsole.warn(\"list editor config error - filterRemote option is only available when autocomplete is enabled\");\n\t\t\t}\n\t\t\t\n\t\t\tif(params.mask){\n\t\t\t\tparams.mask = false;\n\t\t\t\tconsole.warn(\"list editor config error - mask option is only available when autocomplete is enabled\");\n\t\t\t}\n\t\t\t\n\t\t\tif(params.allowEmpty){\n\t\t\t\tparams.allowEmpty = false;\n\t\t\t\tconsole.warn(\"list editor config error - allowEmpty option is only available when autocomplete is enabled\");\n\t\t\t}\n\t\t\t\n\t\t\tif(params.listOnEmpty){\n\t\t\t\tparams.listOnEmpty = false;\n\t\t\t\tconsole.warn(\"list editor config error - listOnEmpty option is only available when autocomplete is enabled\");\n\t\t\t}\n\t\t}\n\t\t\n\t\tif(params.filterRemote && !(typeof params.valuesLookup === \"function\" || params.valuesURL)){\n\t\t\tparams.filterRemote = false;\n\t\t\tconsole.warn(\"list editor config error - filterRemote option should only be used when values list is populated from a remote source\");\n\t\t}\n\t\treturn params;\n\t}\n\t//////////////////////////////////////\n\t////////// Event Handling ////////////\n\t//////////////////////////////////////\n\t\n\t_bindInputEvents(input){\n\t\tinput.addEventListener(\"focus\", this._inputFocus.bind(this));\n\t\tinput.addEventListener(\"click\", this._inputClick.bind(this));\n\t\tinput.addEventListener(\"blur\", this._inputBlur.bind(this));\n\t\tinput.addEventListener(\"keydown\", this._inputKeyDown.bind(this));\n\t\tinput.addEventListener(\"search\", this._inputSearch.bind(this));\n\t\t\n\t\tif(this.params.autocomplete){\n\t\t\tinput.addEventListener(\"keyup\", this._inputKeyUp.bind(this));\n\t\t}\n\t}\n\t\n\t\n\t_inputFocus(e){\n\t\tthis.rebuildOptionsList();\n\t}\n\t\n\t_filter(){\n\t\tif(this.params.filterRemote){\n\t\t\tclearTimeout(this.filterTimeout);\n\t\t\t\n\t\t\tthis.filterTimeout = setTimeout(() => {\n\t\t\t\tthis.rebuildOptionsList();\n\t\t\t}, this.params.filterDelay);\n\t\t}else {\n\t\t\tthis._filterList();\n\t\t}\n\t}\n\t\n\t_inputClick(e){\n\t\te.stopPropagation();\n\t}\n\t\n\t_inputBlur(e){\n\t\tif(this.blurable){\n\t\t\tif(this.popup){\n\t\t\t\tthis.popup.hide();\n\t\t\t}else {\n\t\t\t\tthis._resolveValue(true);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t_inputSearch(){\n\t\tthis._clearChoices();\n\t}\n\t\n\t_inputKeyDown(e){\n\t\tswitch(e.keyCode){\n\t\t\t\n\t\t\tcase 38: //up arrow\n\t\t\t\tthis._keyUp(e);\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 40: //down arrow\n\t\t\t\tthis._keyDown(e);\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 37: //left arrow\n\t\t\tcase 39: //right arrow\n\t\t\t\tthis._keySide(e);\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 13: //enter\n\t\t\t\tthis._keyEnter();\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 27: //escape\n\t\t\t\tthis._keyEsc();\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 36: //home\n\t\t\tcase 35: //end\n\t\t\t\tthis._keyHomeEnd(e);\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 9: //tab\n\t\t\t\tthis._keyTab(e);\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tdefault:\n\t\t\t\tthis._keySelectLetter(e);\n\t\t}\n\t}\n\t\n\t_inputKeyUp(e){\n\t\tswitch(e.keyCode){\n\t\t\tcase 38: //up arrow\n\t\t\tcase 37: //left arrow\n\t\t\tcase 39: //up arrow\n\t\t\tcase 40: //right arrow\n\t\t\tcase 13: //enter\n\t\t\tcase 27: //escape\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tdefault:\n\t\t\t\tthis._keyAutoCompLetter(e);\n\t\t}\n\t}\n\t\n\t_preventPopupBlur(){\n\t\tif(this.popup){\n\t\t\tthis.popup.blockHide();\n\t\t}\n\t\t\n\t\tsetTimeout(() =>{\n\t\t\tif(this.popup){\n\t\t\t\tthis.popup.restoreHide();\n\t\t\t}\n\t\t}, 10);\n\t}\n\t\n\t_preventBlur(){\n\t\tthis.blurable = false;\n\t\t\n\t\tsetTimeout(() =>{\n\t\t\tthis.blurable = true;\n\t\t}, 10);\n\t}\n\t\n\t//////////////////////////////////////\n\t//////// Keyboard Navigation /////////\n\t//////////////////////////////////////\n\t\n\t_keyTab(e){\n\t\tif(this.params.autocomplete && this.lastAction === \"typing\"){\n\t\t\tthis._resolveValue(true);\n\t\t}else {\n\t\t\tif(this.focusedItem){\n\t\t\t\tthis._chooseItem(this.focusedItem, true);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t_keyUp(e){\n\t\tvar index = this.displayItems.indexOf(this.focusedItem);\n\t\t\n\t\tif(this.params.verticalNavigation == \"editor\" || (this.params.verticalNavigation == \"hybrid\" && index)){\n\t\t\te.stopImmediatePropagation();\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\t\n\t\t\tif(index > 0){\n\t\t\t\tthis._focusItem(this.displayItems[index - 1]);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t_keyDown(e){\n\t\tvar index = this.displayItems.indexOf(this.focusedItem);\n\t\t\n\t\tif(this.params.verticalNavigation == \"editor\" || (this.params.verticalNavigation == \"hybrid\" && index < this.displayItems.length - 1)){\n\t\t\te.stopImmediatePropagation();\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\t\n\t\t\tif(index < this.displayItems.length - 1){\n\t\t\t\tif(index == -1){\n\t\t\t\t\tthis._focusItem(this.displayItems[0]);\n\t\t\t\t}else {\n\t\t\t\t\tthis._focusItem(this.displayItems[index + 1]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t_keySide(e){\n\t\tif(!this.params.autocomplete){\n\t\t\te.stopImmediatePropagation();\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t}\n\t}\n\t\n\t_keyEnter(e){\n\t\tif(this.params.autocomplete && this.lastAction === \"typing\"){\n\t\t\tthis._resolveValue(true);\n\t\t}else {\n\t\t\tif(this.focusedItem){\n\t\t\t\tthis._chooseItem(this.focusedItem);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t_keyEsc(e){\n\t\tthis._cancel();\n\t}\n\t\n\t_keyHomeEnd(e){\n\t\tif(this.params.autocomplete){\n\t\t\t//prevent table navigation while using input element\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\t}\n\t\n\t_keySelectLetter(e){\n\t\tif(!this.params.autocomplete){\n\t\t\t// if(this.edit.currentCell === false){\n\t\t\te.preventDefault();\n\t\t\t// }\n\t\t\t\n\t\t\tif(e.keyCode >= 38 && e.keyCode <= 90){\n\t\t\t\tthis._scrollToValue(e.keyCode);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t_keyAutoCompLetter(e){\n\t\tthis._filter();\n\t\tthis.lastAction = \"typing\";\n\t\tthis.typing = true;\n\t}\n\t\n\t\n\t_scrollToValue(char){\n\t\tclearTimeout(this.filterTimeout);\n\t\t\n\t\tvar character = String.fromCharCode(char).toLowerCase();\n\t\tthis.filterTerm += character.toLowerCase();\n\t\t\n\t\tvar match = this.displayItems.find((item) => {\n\t\t\treturn typeof item.label !== \"undefined\" && item.label.toLowerCase().startsWith(this.filterTerm);\n\t\t});\n\t\t\n\t\tif(match){\n\t\t\tthis._focusItem(match);\n\t\t}\n\t\t\n\t\tthis.filterTimeout = setTimeout(() => {\n\t\t\tthis.filterTerm = \"\";\n\t\t}, 800);\n\t}\n\t\n\t_focusItem(item){\n\t\tthis.lastAction = \"focus\";\n\t\t\n\t\tif(this.focusedItem && this.focusedItem.element){\n\t\t\tthis.focusedItem.element.classList.remove(\"focused\");\n\t\t}\n\t\t\n\t\tthis.focusedItem = item;\n\t\t\n\t\tif(item && item.element){\n\t\t\titem.element.classList.add(\"focused\");\n\t\t\titem.element.scrollIntoView({behavior: 'smooth', block: 'nearest', inline: 'start'});\n\t\t}\n\t}\n\t\n\t\n\t//////////////////////////////////////\n\t/////// Data List Generation /////////\n\t//////////////////////////////////////\n\theaderFilterInitialListGen(){\n\t\tthis._generateOptions(true);\n\t}\n\t\n\trebuildOptionsList(){\n\t\tthis._generateOptions()\n\t\t\t.then(this._sortOptions.bind(this))\n\t\t\t.then(this._buildList.bind(this))\n\t\t\t.then(this._showList.bind(this))\n\t\t\t.catch((e) => {\n\t\t\t\tif(!Number.isInteger(e)){\n\t\t\t\t\tconsole.error(\"List generation error\", e);\n\t\t\t\t}\n\t\t\t});\n\t}\n\t\n\t_filterList(){\n\t\tthis._buildList(this._filterOptions());\n\t\tthis._showList();\n\t}\n\t\n\t_generateOptions(silent){\n\t\tvar values = [];\n\t\tvar iteration = ++ this.listIteration;\n\t\t\n\t\tthis.filtered = false;\n\t\t\n\t\tif(this.params.values){\n\t\t\tvalues = this.params.values;\n\t\t}else if (this.params.valuesURL){\n\t\t\tvalues = this._ajaxRequest(this.params.valuesURL, this.input.value);\n\t\t}else {\n\t\t\tif(typeof this.params.valuesLookup === \"function\"){\n\t\t\t\tvalues = this.params.valuesLookup(this.cell, this.input.value);\n\t\t\t}else if(this.params.valuesLookup){\n\t\t\t\tvalues = this._uniqueColumnValues(this.params.valuesLookupField);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif(values instanceof Promise){\n\t\t\tif(!silent){\n\t\t\t\tthis._addPlaceholder(this.params.placeholderLoading);\n\t\t\t}\n\t\t\t\n\t\t\treturn values.then()\n\t\t\t\t.then((responseValues) => {\n\t\t\t\t\tif(this.listIteration === iteration){\n\t\t\t\t\t\treturn this._parseList(responseValues);\n\t\t\t\t\t}else {\n\t\t\t\t\t\treturn Promise.reject(iteration);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}else {\n\t\t\treturn Promise.resolve(this._parseList(values));\n\t\t}\n\t}\n\t\n\t_addPlaceholder(contents){\n\t\tvar placeholder = document.createElement(\"div\");\n\t\t\n\t\tif(typeof contents === \"function\"){\n\t\t\tcontents = contents(this.cell.getComponent(), this.listEl);\n\t\t}\n\t\t\n\t\tif(contents){\n\t\t\tthis._clearList();\n\t\t\t\n\t\t\tif(contents instanceof HTMLElement){\n\t\t\t\tplaceholder = contents;\n\t\t\t}else {\n\t\t\t\tplaceholder.classList.add(\"tabulator-edit-list-placeholder\");\n\t\t\t\tplaceholder.innerHTML = contents;\n\t\t\t}\n\t\t\t\n\t\t\tthis.listEl.appendChild(placeholder);\n\t\t\t\n\t\t\tthis._showList();\n\t\t}\n\t}\n\t\n\t_ajaxRequest(url, term){\n\t\tvar params = this.params.filterRemote ? {term:term} : {};\n\t\turl = urlBuilder(url, {}, params);\n\t\t\n\t\treturn fetch(url)\n\t\t\t.then((response)=>{\n\t\t\t\tif(response.ok) {\n\t\t\t\t\treturn response.json()\n\t\t\t\t\t\t.catch((error)=>{\n\t\t\t\t\t\t\tconsole.warn(\"List Ajax Load Error - Invalid JSON returned\", error);\n\t\t\t\t\t\t\treturn Promise.reject(error);\n\t\t\t\t\t\t});\n\t\t\t\t}else {\n\t\t\t\t\tconsole.error(\"List Ajax Load Error - Connection Error: \" + response.status, response.statusText);\n\t\t\t\t\treturn Promise.reject(response);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((error)=>{\n\t\t\t\tconsole.error(\"List Ajax Load Error - Connection Error: \", error);\n\t\t\t\treturn Promise.reject(error);\n\t\t\t});\n\t}\n\t\n\t_uniqueColumnValues(field){\n\t\tvar output = {},\n\t\tdata = this.table.getData(this.params.valuesLookup),\n\t\tcolumn;\n\t\t\n\t\tif(field){\n\t\t\tcolumn = this.table.columnManager.getColumnByField(field);\n\t\t}else {\n\t\t\tcolumn = this.cell.getColumn()._getSelf();\n\t\t}\n\t\t\n\t\tif(column){\n\t\t\tdata.forEach((row) => {\n\t\t\t\tvar val = column.getFieldValue(row);\n\t\t\t\t\n\t\t\t\tif(!this._emptyValueCheck(val)){\n\t\t\t\t\tif(this.params.multiselect && Array.isArray(val)){\n\t\t\t\t\t\tval.forEach((item) => {\n\t\t\t\t\t\t\tif(!this._emptyValueCheck(item)){\n\t\t\t\t\t\t\t\toutput[item] = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}else {\n\t\t\t\t\t\toutput[val] = true;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t}else {\n\t\t\tconsole.warn(\"unable to find matching column to create select lookup list:\", field);\n\t\t\toutput = [];\n\t\t}\n\t\t\n\t\treturn Object.keys(output);\n\t}\n\n\t_emptyValueCheck(value){\n\t\treturn value === null || typeof value === \"undefined\" || value === \"\";\n\t}\n\t\n\t_parseList(inputValues){\n\t\tvar data = [];\n\t\t\n\t\tif(!Array.isArray(inputValues)){\n\t\t\tinputValues = Object.entries(inputValues).map(([key, value]) => {\n\t\t\t\treturn {\n\t\t\t\t\tlabel:value,\n\t\t\t\t\tvalue:key,\n\t\t\t\t};\n\t\t\t});\n\t\t}\n\t\t\n\t\tinputValues.forEach((value) => {\n\t\t\tif(typeof value !== \"object\"){\n\t\t\t\tvalue = {\n\t\t\t\t\tlabel:value,\n\t\t\t\t\tvalue:value,\n\t\t\t\t};\n\t\t\t}\n\t\t\t\n\t\t\tthis._parseListItem(value, data, 0);\n\t\t});\n\t\t\n\t\tif(!this.currentItems.length && this.params.freetext){\n\t\t\tthis.input.value = this.initialValues;\n\t\t\tthis.typing = true;\n\t\t\tthis.lastAction = \"typing\";\n\t\t}\n\t\t\n\t\tthis.data = data;\n\t\t\n\t\treturn data; \n\t}\n\t\n\t_parseListItem(option, data, level){\n\t\tvar item = {};\n\t\t\n\t\tif(option.options){\n\t\t\titem = this._parseListGroup(option, level + 1);\n\t\t}else {\n\t\t\titem = {\n\t\t\t\tlabel:option.label,\n\t\t\t\tvalue:option.value,\n\t\t\t\titemParams:option.itemParams,\n\t\t\t\telementAttributes: option.elementAttributes,\n\t\t\t\telement:false,\n\t\t\t\tselected:false,\n\t\t\t\tvisible:true,\n\t\t\t\tlevel:level,\n\t\t\t\toriginal:option,\n\t\t\t};\n\t\t\t\n\t\t\tif(this.initialValues && this.initialValues.indexOf(option.value) > -1){\n\t\t\t\tthis._chooseItem(item, true);\n\t\t\t}\n\t\t}\n\t\t\n\t\tdata.push(item);\n\t}\n\t\n\t_parseListGroup(option, level){\n\t\tvar item = {\n\t\t\tlabel:option.label,\n\t\t\tgroup:true,\n\t\t\titemParams:option.itemParams,\n\t\t\telementAttributes:option.elementAttributes,\n\t\t\telement:false,\n\t\t\tvisible:true,\n\t\t\tlevel:level,\n\t\t\toptions:[],\n\t\t\toriginal:option,\n\t\t};\n\t\t\n\t\toption.options.forEach((child) => {\n\t\t\tthis._parseListItem(child, item.options, level);\n\t\t});\n\t\t\n\t\treturn item;\n\t}\n\t\n\t_sortOptions(options){\n\t\tvar sorter;\n\t\t\n\t\tif(this.params.sort){\n\t\t\tsorter = typeof this.params.sort === \"function\" ? this.params.sort : this._defaultSortFunction.bind(this);\n\t\t\t\n\t\t\tthis._sortGroup(sorter, options);\n\t\t}\n\t\t\n\t\treturn options;\n\t}\n\t\n\t_sortGroup(sorter, options){\n\t\toptions.sort((a,b) => {\n\t\t\treturn sorter(a.label, b.label, a.value, b.value, a.original, b.original);\n\t\t});\n\t\t\n\t\toptions.forEach((option) => {\n\t\t\tif(option.group){\n\t\t\t\tthis._sortGroup(sorter, option.options);\n\t\t\t}\n\t\t});\n\t}\n\t\n\t_defaultSortFunction(as, bs){\n\t\tvar a, b, a1, b1, i= 0, L, rx = /(\\d+)|(\\D+)/g, rd = /\\d/;\n\t\tvar emptyAlign = 0;\n\t\t\n\t\tif(this.params.sort === \"desc\"){\n\t\t\t[as, bs] = [bs, as];\n\t\t}\n\t\t\n\t\t//handle empty values\n\t\tif(!as && as!== 0){\n\t\t\temptyAlign = !bs && bs!== 0 ? 0 : -1;\n\t\t}else if(!bs && bs!== 0){\n\t\t\temptyAlign = 1;\n\t\t}else {\n\t\t\tif(isFinite(as) && isFinite(bs)) return as - bs;\n\t\t\ta = String(as).toLowerCase();\n\t\t\tb = String(bs).toLowerCase();\n\t\t\tif(a === b) return 0;\n\t\t\tif(!(rd.test(a) && rd.test(b))) return a > b ? 1 : -1;\n\t\t\ta = a.match(rx);\n\t\t\tb = b.match(rx);\n\t\t\tL = a.length > b.length ? b.length : a.length;\n\t\t\twhile(i < L){\n\t\t\t\ta1= a[i];\n\t\t\t\tb1= b[i++];\n\t\t\t\tif(a1 !== b1){\n\t\t\t\t\tif(isFinite(a1) && isFinite(b1)){\n\t\t\t\t\t\tif(a1.charAt(0) === \"0\") a1 = \".\" + a1;\n\t\t\t\t\t\tif(b1.charAt(0) === \"0\") b1 = \".\" + b1;\n\t\t\t\t\t\treturn a1 - b1;\n\t\t\t\t\t}\n\t\t\t\t\telse return a1 > b1 ? 1 : -1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn a.length > b.length;\n\t\t}\n\t\t\n\t\treturn emptyAlign;\n\t}\n\t\n\t_filterOptions(){\n\t\tvar filterFunc = this.params.filterFunc || this._defaultFilterFunc,\n\t\tterm = this.input.value;\n\t\t\n\t\tif(term){\n\t\t\tthis.filtered = true;\n\t\t\t\n\t\t\tthis.data.forEach((item) => {\n\t\t\t\tthis._filterItem(filterFunc, term, item);\n\t\t\t});\n\t\t}else {\n\t\t\tthis.filtered = false;\n\t\t}\n\t\t\n\t\treturn this.data;\n\t}\n\t\n\t_filterItem(func, term, item){\n\t\tvar matches = false;\n\t\t\n\t\tif(!item.group){\n\t\t\titem.visible = func(term, item.label, item.value, item.original);\n\t\t}else {\n\t\t\titem.options.forEach((option) => {\n\t\t\t\tif(this._filterItem(func, term, option)){\n\t\t\t\t\tmatches = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\titem.visible = matches;\n\t\t}\n\t\t\n\t\treturn item.visible;\n\t}\n\t\n\t_defaultFilterFunc(term, label, value, item){\n\t\tterm = String(term).toLowerCase();\n\t\t\n\t\tif(label !== null && typeof label !== \"undefined\"){\n\t\t\tif(String(label).toLowerCase().indexOf(term) > -1 || String(value).toLowerCase().indexOf(term) > -1){\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\t//////////////////////////////////////\n\t/////////// Display List /////////////\n\t//////////////////////////////////////\n\t\n\t_clearList(){\n\t\twhile(this.listEl.firstChild) this.listEl.removeChild(this.listEl.firstChild);\n\t\t\n\t\tthis.displayItems = [];\n\t}\n\t\n\t_buildList(data){\n\t\tthis._clearList();\n\t\t\n\t\tdata.forEach((option) => {\n\t\t\tthis._buildItem(option);\n\t\t});\n\t\t\n\t\tif(!this.displayItems.length){\n\t\t\tthis._addPlaceholder(this.params.placeholderEmpty);\n\t\t} \n\t}\n\t\n\t_buildItem(item){\n\t\tvar el = item.element,\n\t\tcontents;\n\t\t\n\t\tif(!this.filtered || item.visible){\n\t\t\t\n\t\t\tif(!el){\n\t\t\t\tel = document.createElement(\"div\");\n\t\t\t\tel.tabIndex = 0;\n\t\t\t\t\n\t\t\t\tcontents = this.params.itemFormatter ? this.params.itemFormatter(item.label, item.value, item.original, el) : item.label;\n\t\t\t\t\n\t\t\t\tif(contents instanceof HTMLElement){\n\t\t\t\t\tel.appendChild(contents);\n\t\t\t\t}else {\n\t\t\t\t\tel.innerHTML = contents;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(item.group){\n\t\t\t\t\tel.classList.add(\"tabulator-edit-list-group\");\n\t\t\t\t}else {\n\t\t\t\t\tel.classList.add(\"tabulator-edit-list-item\");\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tel.classList.add(\"tabulator-edit-list-group-level-\" + item.level);\n\t\t\t\t\n\t\t\t\tif(item.elementAttributes && typeof item.elementAttributes == \"object\"){\n\t\t\t\t\tfor (let key in item.elementAttributes){\n\t\t\t\t\t\tif(key.charAt(0) == \"+\"){\n\t\t\t\t\t\t\tkey = key.slice(1);\n\t\t\t\t\t\t\tel.setAttribute(key, this.input.getAttribute(key) + item.elementAttributes[\"+\" + key]);\n\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\tel.setAttribute(key, item.elementAttributes[key]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(item.group){\n\t\t\t\t\tel.addEventListener(\"click\", this._groupClick.bind(this, item));\n\t\t\t\t}else {\n\t\t\t\t\tel.addEventListener(\"click\", this._itemClick.bind(this, item));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tel.addEventListener(\"mousedown\", this._preventBlur.bind(this));\n\t\t\t\t\n\t\t\t\titem.element = el;\n\t\t\t}\n\t\t\t\n\t\t\tthis._styleItem(item);\n\t\t\t\n\t\t\tthis.listEl.appendChild(el);\n\t\t\t\n\t\t\tif(item.group){\n\t\t\t\titem.options.forEach((option) => {\n\t\t\t\t\tthis._buildItem(option);\n\t\t\t\t});\n\t\t\t}else {\n\t\t\t\tthis.displayItems.push(item);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t_showList(){\n\t\tvar startVis = this.popup && this.popup.isVisible();\n\t\t\n\t\tif(this.input.parentNode){\n\t\t\tif(this.params.autocomplete && this.input.value === \"\" && !this.params.listOnEmpty){\n\t\t\t\tif(this.popup){\n\t\t\t\t\tthis.popup.hide(true);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tthis._setListWidth();\n\t\t\t\n\t\t\tif(!this.popup){\n\t\t\t\tthis.popup = this.edit.popup(this.listEl);\n\t\t\t}\n\t\t\t\n\t\t\tthis.popup.show(this.cell.getElement(), \"bottom\");\n\t\t\t\n\t\t\tif(!startVis){\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.popup.hideOnBlur(this._resolveValue.bind(this, true));\n\t\t\t\t}, 10);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t_styleItem(item){\n\t\tif(item && item.element){\n\t\t\tif(item.selected){\n\t\t\t\titem.element.classList.add(\"active\");\n\t\t\t}else {\n\t\t\t\titem.element.classList.remove(\"active\");\n\t\t\t}\n\t\t}\n\t}\n\t\n\t//////////////////////////////////////\n\t///////// User Interaction ///////////\n\t//////////////////////////////////////\n\t\n\t_itemClick(item, e){\n\t\te.stopPropagation();\n\t\t\n\t\tthis._chooseItem(item);\n\t}\n\t\n\t_groupClick(item, e){\n\t\te.stopPropagation();\n\t}\n\t\n\t\n\t//////////////////////////////////////\n\t////// Current Item Management ///////\n\t//////////////////////////////////////\n\t\n\t_cancel(){\n\t\tthis.popup.hide(true);\n\t\tthis.actions.cancel();\n\t}\n\t\n\t_clearChoices(){\n\t\tthis.typing = true;\n\t\t\n\t\tthis.currentItems.forEach((item) => {\n\t\t\titem.selected = false;\n\t\t\tthis._styleItem(item);\n\t\t});\n\t\t\n\t\tthis.currentItems = [];\n\t\t\n\t\tthis.focusedItem = null;\n\t}\n\t\n\t_chooseItem(item, silent){\n\t\tvar index;\n\t\t\n\t\tthis.typing = false;\n\t\t\n\t\tif(this.params.multiselect){\n\t\t\tindex = this.currentItems.indexOf(item);\n\t\t\t\n\t\t\tif(index > -1){\n\t\t\t\tthis.currentItems.splice(index, 1);\n\t\t\t\titem.selected = false;\n\t\t\t}else {\n\t\t\t\tthis.currentItems.push(item);\n\t\t\t\titem.selected = true;\n\t\t\t}\n\t\t\t\n\t\t\tthis.input.value = this.currentItems.map(item => item.label).join(\",\");\n\t\t\t\n\t\t\tthis._styleItem(item);\n\t\t\t\n\t\t}else {\n\t\t\tthis.currentItems = [item];\n\t\t\titem.selected = true;\n\t\t\t\n\t\t\tthis.input.value = item.label;\n\t\t\t\n\t\t\tthis._styleItem(item);\n\t\t\t\n\t\t\tif(!silent){\n\t\t\t\tthis._resolveValue();\n\t\t\t}\n\t\t}\n\t\t\n\t\tthis._focusItem(item);\n\t}\n\t\n\t_resolveValue(blur){\n\t\tvar output, initialValue;\n\t\t\n\t\tif(this.popup){\n\t\t\tthis.popup.hide(true);\n\t\t}\n\t\t\n\t\tif(this.params.multiselect){\n\t\t\toutput = this.currentItems.map(item => item.value);\n\t\t}else {\n\t\t\tif(blur && this.params.autocomplete && this.typing){\n\t\t\t\tif(this.params.freetext || (this.params.allowEmpty && this.input.value === \"\")){\n\t\t\t\t\toutput = this.input.value;\n\t\t\t\t}else {\n\t\t\t\t\tthis.actions.cancel();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tif(this.currentItems[0]){\n\t\t\t\t\toutput = this.currentItems[0].value;\n\t\t\t\t}else {\n\t\t\t\t\tinitialValue = Array.isArray(this.initialValues) ? this.initialValues[0] : this.initialValues;\n\t\t\t\t\t\n\t\t\t\t\tif(initialValue === null || typeof initialValue === \"undefined\" || initialValue === \"\"){\n\t\t\t\t\t\toutput = initialValue;\n\t\t\t\t\t}else {\n\t\t\t\t\t\toutput = this.params.emptyValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t\t\n\t\tif(output === \"\"){\n\t\t\toutput = this.params.emptyValue;\n\t\t}\n\t\t\n\t\tthis.actions.success(output);\n\t\t\n\t\tif(this.isFilter){\n\t\t\tthis.initialValues = output && !Array.isArray(output) ? [output] : output;\n\t\t\tthis.currentItems = [];\n\t\t}\n\t}\n\t\n};\n\nfunction list(cell, onRendered, success, cancel, editorParams){\n\tvar list = new Edit$1(this, cell, onRendered, success, cancel, editorParams);\n\n\treturn list.input;\n}\n\n//star rating\nfunction star$1(cell, onRendered, success, cancel, editorParams){\n\tvar self = this,\n\telement = cell.getElement(),\n\tvalue = cell.getValue(),\n\tmaxStars = element.getElementsByTagName(\"svg\").length || 5,\n\tsize = element.getElementsByTagName(\"svg\")[0] ? element.getElementsByTagName(\"svg\")[0].getAttribute(\"width\") : 14,\n\tstars = [],\n\tstarsHolder = document.createElement(\"div\"),\n\tstar = document.createElementNS('http://www.w3.org/2000/svg', \"svg\");\n\n\n\t//change star type\n\tfunction starChange(val){\n\t\tstars.forEach(function(star, i){\n\t\t\tif(i < val){\n\t\t\t\tif(self.table.browser == \"ie\"){\n\t\t\t\t\tstar.setAttribute(\"class\", \"tabulator-star-active\");\n\t\t\t\t}else {\n\t\t\t\t\tstar.classList.replace(\"tabulator-star-inactive\", \"tabulator-star-active\");\n\t\t\t\t}\n\n\t\t\t\tstar.innerHTML = '<polygon fill=\"#488CE9\" stroke=\"#014AAE\" stroke-width=\"37.6152\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"259.216,29.942 330.27,173.919 489.16,197.007 374.185,309.08 401.33,467.31 259.216,392.612 117.104,467.31 144.25,309.08 29.274,197.007 188.165,173.919 \"/>';\n\t\t\t}else {\n\t\t\t\tif(self.table.browser == \"ie\"){\n\t\t\t\t\tstar.setAttribute(\"class\", \"tabulator-star-inactive\");\n\t\t\t\t}else {\n\t\t\t\t\tstar.classList.replace(\"tabulator-star-active\", \"tabulator-star-inactive\");\n\t\t\t\t}\n\n\t\t\t\tstar.innerHTML = '<polygon fill=\"#010155\" stroke=\"#686868\" stroke-width=\"37.6152\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"259.216,29.942 330.27,173.919 489.16,197.007 374.185,309.08 401.33,467.31 259.216,392.612 117.104,467.31 144.25,309.08 29.274,197.007 188.165,173.919 \"/>';\n\t\t\t}\n\t\t});\n\t}\n\n\t//build stars\n\tfunction buildStar(i){\n\n\t\tvar starHolder = document.createElement(\"span\");\n\t\tvar nextStar = star.cloneNode(true);\n\n\t\tstars.push(nextStar);\n\n\t\tstarHolder.addEventListener(\"mouseenter\", function(e){\n\t\t\te.stopPropagation();\n\t\t\te.stopImmediatePropagation();\n\t\t\tstarChange(i);\n\t\t});\n\n\t\tstarHolder.addEventListener(\"mousemove\", function(e){\n\t\t\te.stopPropagation();\n\t\t\te.stopImmediatePropagation();\n\t\t});\n\n\t\tstarHolder.addEventListener(\"click\", function(e){\n\t\t\te.stopPropagation();\n\t\t\te.stopImmediatePropagation();\n\t\t\tsuccess(i);\n\t\t\telement.blur();\n\t\t});\n\n\t\tstarHolder.appendChild(nextStar);\n\t\tstarsHolder.appendChild(starHolder);\n\n\t}\n\n\t//handle keyboard navigation value change\n\tfunction changeValue(val){\n\t\tvalue = val;\n\t\tstarChange(val);\n\t}\n\n\t//style cell\n\telement.style.whiteSpace = \"nowrap\";\n\telement.style.overflow = \"hidden\";\n\telement.style.textOverflow = \"ellipsis\";\n\n\t//style holding element\n\tstarsHolder.style.verticalAlign = \"middle\";\n\tstarsHolder.style.display = \"inline-block\";\n\tstarsHolder.style.padding = \"4px\";\n\n\t//style star\n\tstar.setAttribute(\"width\", size);\n\tstar.setAttribute(\"height\", size);\n\tstar.setAttribute(\"viewBox\", \"0 0 512 512\");\n\tstar.setAttribute(\"xml:space\", \"preserve\");\n\tstar.style.padding = \"0 1px\";\n\n\tif(editorParams.elementAttributes && typeof editorParams.elementAttributes == \"object\"){\n\t\tfor (let key in editorParams.elementAttributes){\n\t\t\tif(key.charAt(0) == \"+\"){\n\t\t\t\tkey = key.slice(1);\n\t\t\t\tstarsHolder.setAttribute(key, starsHolder.getAttribute(key) + editorParams.elementAttributes[\"+\" + key]);\n\t\t\t}else {\n\t\t\t\tstarsHolder.setAttribute(key, editorParams.elementAttributes[key]);\n\t\t\t}\n\t\t}\n\t}\n\n\t//create correct number of stars\n\tfor(var i=1;i<= maxStars;i++){\n\t\tbuildStar(i);\n\t}\n\n\t//ensure value does not exceed number of stars\n\tvalue = Math.min(parseInt(value), maxStars);\n\n\t// set initial styling of stars\n\tstarChange(value);\n\n\tstarsHolder.addEventListener(\"mousemove\", function(e){\n\t\tstarChange(0);\n\t});\n\n\tstarsHolder.addEventListener(\"click\", function(e){\n\t\tsuccess(0);\n\t});\n\n\telement.addEventListener(\"blur\", function(e){\n\t\tcancel();\n\t});\n\n\t//allow key based navigation\n\telement.addEventListener(\"keydown\", function(e){\n\t\tswitch(e.keyCode){\n\t\t\tcase 39: //right arrow\n\t\t\t\tchangeValue(value + 1);\n\t\t\t\tbreak;\n\n\t\t\tcase 37: //left arrow\n\t\t\t\tchangeValue(value - 1);\n\t\t\t\tbreak;\n\n\t\t\tcase 13: //enter\n\t\t\t\tsuccess(value);\n\t\t\t\tbreak;\n\n\t\t\tcase 27: //escape\n\t\t\t\tcancel();\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\treturn starsHolder;\n}\n\n//draggable progress bar\nfunction progress$1(cell, onRendered, success, cancel, editorParams){\n\tvar element = cell.getElement(),\n\tmax = typeof editorParams.max === \"undefined\" ? ((element.getElementsByTagName(\"div\")[0] && element.getElementsByTagName(\"div\")[0].getAttribute(\"max\")) || 100) : editorParams.max,\n\tmin = typeof editorParams.min === \"undefined\" ? ((element.getElementsByTagName(\"div\")[0] && element.getElementsByTagName(\"div\")[0].getAttribute(\"min\")) || 0) : editorParams.min,\n\tpercent = (max - min) / 100,\n\tvalue = cell.getValue() || 0,\n\thandle = document.createElement(\"div\"),\n\tbar = document.createElement(\"div\"),\n\tmouseDrag, mouseDragWidth;\n\n\t//set new value\n\tfunction updateValue(){\n\t\tvar style = window.getComputedStyle(element, null);\n\n\t\tvar calcVal = (percent * Math.round(bar.offsetWidth / ((element.clientWidth - parseInt(style.getPropertyValue(\"padding-left\")) - parseInt(style.getPropertyValue(\"padding-right\")))/100))) + min;\n\t\tsuccess(calcVal);\n\t\telement.setAttribute(\"aria-valuenow\", calcVal);\n\t\telement.setAttribute(\"aria-label\", value);\n\t}\n\n\t//style handle\n\thandle.style.position = \"absolute\";\n\thandle.style.right = \"0\";\n\thandle.style.top = \"0\";\n\thandle.style.bottom = \"0\";\n\thandle.style.width = \"5px\";\n\thandle.classList.add(\"tabulator-progress-handle\");\n\n\t//style bar\n\tbar.style.display = \"inline-block\";\n\tbar.style.position = \"relative\";\n\t// bar.style.top = \"8px\";\n\t// bar.style.bottom = \"8px\";\n\t// bar.style.left = \"4px\";\n\t// bar.style.marginRight = \"4px\";\n\tbar.style.height = \"100%\";\n\tbar.style.backgroundColor = \"#488CE9\";\n\tbar.style.maxWidth = \"100%\";\n\tbar.style.minWidth = \"0%\";\n\n\tif(editorParams.elementAttributes && typeof editorParams.elementAttributes == \"object\"){\n\t\tfor (let key in editorParams.elementAttributes){\n\t\t\tif(key.charAt(0) == \"+\"){\n\t\t\t\tkey = key.slice(1);\n\t\t\t\tbar.setAttribute(key, bar.getAttribute(key) + editorParams.elementAttributes[\"+\" + key]);\n\t\t\t}else {\n\t\t\t\tbar.setAttribute(key, editorParams.elementAttributes[key]);\n\t\t\t}\n\t\t}\n\t}\n\n\t//style cell\n\telement.style.padding = \"4px 4px\";\n\n\t//make sure value is in range\n\tvalue = Math.min(parseFloat(value), max);\n\tvalue = Math.max(parseFloat(value), min);\n\n\t//workout percentage\n\tvalue = Math.round((value - min) / percent);\n\t// bar.style.right = value + \"%\";\n\tbar.style.width = value + \"%\";\n\n\telement.setAttribute(\"aria-valuemin\", min);\n\telement.setAttribute(\"aria-valuemax\", max);\n\n\tbar.appendChild(handle);\n\n\thandle.addEventListener(\"mousedown\", function(e){\n\t\tmouseDrag = e.screenX;\n\t\tmouseDragWidth = bar.offsetWidth;\n\t});\n\n\thandle.addEventListener(\"mouseover\", function(){\n\t\thandle.style.cursor = \"ew-resize\";\n\t});\n\n\telement.addEventListener(\"mousemove\", function(e){\n\t\tif(mouseDrag){\n\t\t\tbar.style.width = (mouseDragWidth + e.screenX - mouseDrag) + \"px\";\n\t\t}\n\t});\n\n\telement.addEventListener(\"mouseup\", function(e){\n\t\tif(mouseDrag){\n\t\t\te.stopPropagation();\n\t\t\te.stopImmediatePropagation();\n\n\t\t\tmouseDrag = false;\n\t\t\tmouseDragWidth = false;\n\n\t\t\tupdateValue();\n\t\t}\n\t});\n\n\t//allow key based navigation\n\telement.addEventListener(\"keydown\", function(e){\n\t\tswitch(e.keyCode){\n\t\t\tcase 39: //right arrow\n\t\t\t\te.preventDefault();\n\t\t\t\tbar.style.width = (bar.clientWidth + element.clientWidth/100) + \"px\";\n\t\t\t\tbreak;\n\n\t\t\tcase 37: //left arrow\n\t\t\t\te.preventDefault();\n\t\t\t\tbar.style.width = (bar.clientWidth - element.clientWidth/100) + \"px\";\n\t\t\t\tbreak;\n\n\t\t\tcase 9: //tab\n\t\t\tcase 13: //enter\n\t\t\t\tupdateValue();\n\t\t\t\tbreak;\n\n\t\t\tcase 27: //escape\n\t\t\t\tcancel();\n\t\t\t\tbreak;\n\n\t\t}\n\t});\n\n\telement.addEventListener(\"blur\", function(){\n\t\tcancel();\n\t});\n\n\treturn bar;\n}\n\n//checkbox\nfunction tickCross$1(cell, onRendered, success, cancel, editorParams){\n\tvar value = cell.getValue(),\n\tinput = document.createElement(\"input\"),\n\ttristate = editorParams.tristate,\n\tindetermValue = typeof editorParams.indeterminateValue === \"undefined\" ? null : editorParams.indeterminateValue,\n\tindetermState = false,\n\ttrueValueSet = Object.keys(editorParams).includes(\"trueValue\"),\n\tfalseValueSet = Object.keys(editorParams).includes(\"falseValue\");\n\t\n\tinput.setAttribute(\"type\", \"checkbox\");\n\tinput.style.marginTop = \"5px\";\n\tinput.style.boxSizing = \"border-box\";\n\t\n\tif(editorParams.elementAttributes && typeof editorParams.elementAttributes == \"object\"){\n\t\tfor (let key in editorParams.elementAttributes){\n\t\t\tif(key.charAt(0) == \"+\"){\n\t\t\t\tkey = key.slice(1);\n\t\t\t\tinput.setAttribute(key, input.getAttribute(key) + editorParams.elementAttributes[\"+\" + key]);\n\t\t\t}else {\n\t\t\t\tinput.setAttribute(key, editorParams.elementAttributes[key]);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tinput.value = value;\n\t\n\tif(tristate && (typeof value === \"undefined\" || value === indetermValue || value === \"\")){\n\t\tindetermState = true;\n\t\tinput.indeterminate = true;\n\t}\n\t\n\tif(this.table.browser != \"firefox\" && this.table.browser != \"safari\"){ //prevent blur issue on mac firefox\n\t\tonRendered(function(){\n\t\t\tif(cell.getType() === \"cell\"){\n\t\t\t\tinput.focus({preventScroll: true});\n\t\t\t}\n\t\t});\n\t}\n\t\n\tinput.checked = trueValueSet ? value === editorParams.trueValue : (value === true || value === \"true\" || value === \"True\" || value === 1);\n\t\n\tfunction setValue(blur){\n\t\tvar checkedValue = input.checked;\n\t\t\n\t\tif(trueValueSet && checkedValue){\n\t\t\tcheckedValue = editorParams.trueValue;\n\t\t}else if(falseValueSet && !checkedValue){\n\t\t\tcheckedValue = editorParams.falseValue;\n\t\t}\n\t\t\n\t\tif(tristate){\n\t\t\tif(!blur){\n\t\t\t\tif(input.checked && !indetermState){\n\t\t\t\t\tinput.checked = false;\n\t\t\t\t\tinput.indeterminate = true;\n\t\t\t\t\tindetermState = true;\n\t\t\t\t\treturn indetermValue;\n\t\t\t\t}else {\n\t\t\t\t\tindetermState = false;\n\t\t\t\t\treturn checkedValue;\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tif(indetermState){\n\t\t\t\t\treturn indetermValue;\n\t\t\t\t}else {\n\t\t\t\t\treturn checkedValue;\n\t\t\t\t}\n\t\t\t}\n\t\t}else {\n\t\t\treturn checkedValue;\n\t\t}\n\t}\n\t\n\t//submit new value on blur\n\tinput.addEventListener(\"change\", function(e){\n\t\tsuccess(setValue());\n\t});\n\n\tinput.addEventListener(\"blur\", function(e){\n\t\tsuccess(setValue(true));\n\t});\n\t\n\t//submit new value on enter\n\tinput.addEventListener(\"keydown\", function(e){\n\t\tif(e.keyCode == 13){\n\t\t\tsuccess(setValue());\n\t\t}\n\t\tif(e.keyCode == 27){\n\t\t\tcancel();\n\t\t}\n\t});\n\t\n\treturn input;\n}\n\nfunction adaptable$1(cell, onRendered, success, cancel, params){\r\n\tvar column = cell._getSelf().column,\r\n\tlookup, editorFunc, editorParams;\r\n \r\n\tfunction defaultLookup(cell){\r\n\t\tvar value = cell.getValue(),\r\n\t\teditor = \"input\";\r\n \r\n\t\tswitch(typeof value){\r\n\t\t\tcase \"number\":\r\n\t\t\t\teditor = \"number\";\r\n\t\t\t\tbreak;\r\n \r\n\t\t\tcase \"boolean\":\r\n\t\t\t\teditor = \"tickCross\";\r\n\t\t\t\tbreak;\r\n \r\n\t\t\tcase \"string\":\r\n\t\t\t\tif(value.includes(\"\\n\")){\r\n\t\t\t\t\teditor = \"textarea\";\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n \r\n\t\treturn editor;\r\n\t}\r\n \r\n\tlookup = params.editorLookup ? params.editorLookup(cell) : defaultLookup(cell);\r\n\r\n\tif(params.paramsLookup){\r\n\t\teditorParams = typeof params.paramsLookup === \"function\" ? params.paramsLookup(lookup, cell) : params.paramsLookup[lookup];\r\n\t}\r\n\r\n\teditorFunc = this.table.modules.edit.lookupEditor(lookup, column);\r\n \r\n\treturn editorFunc.call(this, cell, onRendered, success, cancel, editorParams || {});\r\n}\n\nvar defaultEditors = {\n\tinput:input,\n\ttextarea:textarea$1,\n\tnumber:number$1,\n\trange:range,\n\tdate:date$1,\n\ttime:time$1,\n\tdatetime:datetime$2,\n\tlist:list,\n\tstar:star$1,\n\tprogress:progress$1,\n\ttickCross:tickCross$1,\n\tadaptable:adaptable$1,\n};\n\nclass Edit extends Module{\n\n\tstatic moduleName = \"edit\";\n\n\t//load defaults\n\tstatic editors = defaultEditors;\n\t\n\tconstructor(table){\n\t\tsuper(table);\n\t\t\n\t\tthis.currentCell = false; //hold currently editing cell\n\t\tthis.mouseClick = false; //hold mousedown state to prevent click binding being overridden by editor opening\n\t\tthis.recursionBlock = false; //prevent focus recursion\n\t\tthis.invalidEdit = false;\n\t\tthis.editedCells = [];\n\t\tthis.convertEmptyValues = false;\n\t\t\n\t\tthis.editors = Edit.editors;\n\t\n\t\tthis.registerTableOption(\"editTriggerEvent\", \"focus\");\n\t\tthis.registerTableOption(\"editorEmptyValue\");\n\t\tthis.registerTableOption(\"editorEmptyValueFunc\", this.emptyValueCheck.bind(this));\n\n\t\tthis.registerColumnOption(\"editable\");\n\t\tthis.registerColumnOption(\"editor\");\n\t\tthis.registerColumnOption(\"editorParams\");\n\t\tthis.registerColumnOption(\"editorEmptyValue\");\n\t\tthis.registerColumnOption(\"editorEmptyValueFunc\");\n\t\t\n\t\tthis.registerColumnOption(\"cellEditing\");\n\t\tthis.registerColumnOption(\"cellEdited\");\n\t\tthis.registerColumnOption(\"cellEditCancelled\");\n\t\t\n\t\tthis.registerTableFunction(\"getEditedCells\", this.getEditedCells.bind(this));\n\t\tthis.registerTableFunction(\"clearCellEdited\", this.clearCellEdited.bind(this));\n\t\tthis.registerTableFunction(\"navigatePrev\", this.navigatePrev.bind(this));\n\t\tthis.registerTableFunction(\"navigateNext\", this.navigateNext.bind(this));\n\t\tthis.registerTableFunction(\"navigateLeft\", this.navigateLeft.bind(this));\n\t\tthis.registerTableFunction(\"navigateRight\", this.navigateRight.bind(this));\n\t\tthis.registerTableFunction(\"navigateUp\", this.navigateUp.bind(this));\n\t\tthis.registerTableFunction(\"navigateDown\", this.navigateDown.bind(this));\n\t\t\n\t\tthis.registerComponentFunction(\"cell\", \"isEdited\", this.cellIsEdited.bind(this));\n\t\tthis.registerComponentFunction(\"cell\", \"clearEdited\", this.clearEdited.bind(this));\n\t\tthis.registerComponentFunction(\"cell\", \"edit\", this.editCell.bind(this));\n\t\tthis.registerComponentFunction(\"cell\", \"cancelEdit\", this.cellCancelEdit.bind(this));\n\t\t\n\t\tthis.registerComponentFunction(\"cell\", \"navigatePrev\", this.navigatePrev.bind(this));\n\t\tthis.registerComponentFunction(\"cell\", \"navigateNext\", this.navigateNext.bind(this));\n\t\tthis.registerComponentFunction(\"cell\", \"navigateLeft\", this.navigateLeft.bind(this));\n\t\tthis.registerComponentFunction(\"cell\", \"navigateRight\", this.navigateRight.bind(this));\n\t\tthis.registerComponentFunction(\"cell\", \"navigateUp\", this.navigateUp.bind(this));\n\t\tthis.registerComponentFunction(\"cell\", \"navigateDown\", this.navigateDown.bind(this));\n\t}\n\t\n\tinitialize(){\n\t\tthis.subscribe(\"cell-init\", this.bindEditor.bind(this));\n\t\tthis.subscribe(\"cell-delete\", this.clearEdited.bind(this));\n\t\tthis.subscribe(\"cell-value-changed\", this.updateCellClass.bind(this));\n\t\tthis.subscribe(\"column-layout\", this.initializeColumnCheck.bind(this));\n\t\tthis.subscribe(\"column-delete\", this.columnDeleteCheck.bind(this));\n\t\tthis.subscribe(\"row-deleting\", this.rowDeleteCheck.bind(this));\n\t\tthis.subscribe(\"row-layout\", this.rowEditableCheck.bind(this));\n\t\tthis.subscribe(\"data-refreshing\", this.cancelEdit.bind(this));\n\t\tthis.subscribe(\"clipboard-paste\", this.pasteBlocker.bind(this));\n\t\t\n\t\tthis.subscribe(\"keybinding-nav-prev\", this.navigatePrev.bind(this, undefined));\n\t\tthis.subscribe(\"keybinding-nav-next\", this.keybindingNavigateNext.bind(this));\n\t\t\n\t\t// this.subscribe(\"keybinding-nav-left\", this.navigateLeft.bind(this, undefined));\n\t\t// this.subscribe(\"keybinding-nav-right\", this.navigateRight.bind(this, undefined));\n\t\tthis.subscribe(\"keybinding-nav-up\", this.navigateUp.bind(this, undefined));\n\t\tthis.subscribe(\"keybinding-nav-down\", this.navigateDown.bind(this, undefined));\n\n\t\tif(Object.keys(this.table.options).includes(\"editorEmptyValue\")){\n\t\t\tthis.convertEmptyValues = true;\n\t\t}\n\t}\n\t\n\t\n\t///////////////////////////////////\n\t///////// Paste Negation //////////\n\t///////////////////////////////////\n\t\n\tpasteBlocker(e){\n\t\tif(this.currentCell){\n\t\t\treturn true;\n\t\t}\n\t}\n\t\n\t\n\t///////////////////////////////////\n\t////// Keybinding Functions ///////\n\t///////////////////////////////////\n\t\n\tkeybindingNavigateNext(e){\n\t\tvar cell = this.currentCell,\n\t\tnewRow = this.options(\"tabEndNewRow\");\n\n\t\tif(cell){\n\t\t\tif(!this.navigateNext(cell, e)){\n\t\t\t\tif(newRow){\n\t\t\t\t\tcell.getElement().firstChild.blur();\n\t\t\t\t\t\n\t\t\t\t\tif(!this.invalidEdit){\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(newRow === true){\n\t\t\t\t\t\t\tnewRow = this.table.addRow({});\n\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\tif(typeof newRow == \"function\"){\n\t\t\t\t\t\t\t\tnewRow = this.table.addRow(newRow(cell.row.getComponent()));\n\t\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\t\tnewRow = this.table.addRow(Object.assign({}, newRow));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tnewRow.then(() => {\n\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\tcell.getComponent().navigateNext();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t///////////////////////////////////\n\t///////// Cell Functions //////////\n\t///////////////////////////////////\n\t\n\tcellIsEdited(cell){\n\t\treturn !! cell.modules.edit && cell.modules.edit.edited;\n\t}\n\t\n\tcellCancelEdit(cell){\n\t\tif(cell === this.currentCell){\n\t\t\tthis.table.modules.edit.cancelEdit();\n\t\t}else {\n\t\t\tconsole.warn(\"Cancel Editor Error - This cell is not currently being edited \");\n\t\t}\n\t}\n\t\n\t\n\t///////////////////////////////////\n\t///////// Table Functions /////////\n\t///////////////////////////////////\n\tupdateCellClass(cell){\n\t\tif(this.allowEdit(cell)) {\n\t\t\tcell.getElement().classList.add(\"tabulator-editable\");\n\t\t}\n\t\telse {\n\t\t\tcell.getElement().classList.remove(\"tabulator-editable\");\n\t\t}\n\t}\n\t\n\tclearCellEdited(cells){\n\t\tif(!cells){\n\t\t\tcells = this.table.modules.edit.getEditedCells();\n\t\t}\n\t\t\n\t\tif(!Array.isArray(cells)){\n\t\t\tcells = [cells];\n\t\t}\n\t\t\n\t\tcells.forEach((cell) => {\n\t\t\tthis.table.modules.edit.clearEdited(cell._getSelf());\n\t\t});\n\t}\n\t\n\tnavigatePrev(cell = this.currentCell, e){\n\t\tvar nextCell, prevRow;\n\t\t\n\t\tif(cell){\n\t\t\t\n\t\t\tif(e){\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t\t\n\t\t\tnextCell = this.navigateLeft();\n\t\t\t\n\t\t\tif(nextCell){\n\t\t\t\treturn true;\n\t\t\t}else {\n\t\t\t\tprevRow = this.table.rowManager.prevDisplayRow(cell.row, true);\n\t\t\t\t\n\t\t\t\tif(prevRow){\n\t\t\t\t\tnextCell = this.findPrevEditableCell(prevRow, prevRow.cells.length);\n\t\t\t\t\t\n\t\t\t\t\tif(nextCell){\n\t\t\t\t\t\tnextCell.getComponent().edit();\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\tnavigateNext(cell = this.currentCell, e){\n\t\tvar nextCell, nextRow;\n\t\t\n\t\tif(cell){\n\t\t\t\n\t\t\tif(e){\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t\t\n\t\t\tnextCell = this.navigateRight();\n\t\t\t\n\t\t\tif(nextCell){\n\t\t\t\treturn true;\n\t\t\t}else {\n\t\t\t\tnextRow = this.table.rowManager.nextDisplayRow(cell.row, true);\n\t\t\t\t\n\t\t\t\tif(nextRow){\n\t\t\t\t\tnextCell = this.findNextEditableCell(nextRow, -1);\n\t\t\t\t\t\n\t\t\t\t\tif(nextCell){\n\t\t\t\t\t\tnextCell.getComponent().edit();\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\tnavigateLeft(cell = this.currentCell, e){\n\t\tvar index, nextCell;\n\t\t\n\t\tif(cell){\n\t\t\t\n\t\t\tif(e){\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t\t\n\t\t\tindex = cell.getIndex();\n\t\t\tnextCell = this.findPrevEditableCell(cell.row, index);\n\t\t\t\n\t\t\tif(nextCell){\n\t\t\t\tnextCell.getComponent().edit();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\tnavigateRight(cell = this.currentCell, e){\n\t\tvar index, nextCell;\n\t\t\n\t\tif(cell){\n\t\t\t\n\t\t\tif(e){\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t\t\n\t\t\tindex = cell.getIndex();\n\t\t\tnextCell = this.findNextEditableCell(cell.row, index);\n\t\t\t\n\t\t\tif(nextCell){\n\t\t\t\tnextCell.getComponent().edit();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\tnavigateUp(cell = this.currentCell, e){\n\t\tvar index, nextRow;\n\t\t\n\t\tif(cell){\n\t\t\t\n\t\t\tif(e){\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t\t\n\t\t\tindex = cell.getIndex();\n\t\t\tnextRow = this.table.rowManager.prevDisplayRow(cell.row, true);\n\t\t\t\n\t\t\tif(nextRow){\n\t\t\t\tnextRow.cells[index].getComponent().edit();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\tnavigateDown(cell = this.currentCell, e){\n\t\tvar index, nextRow;\n\t\t\n\t\tif(cell){\n\t\t\t\n\t\t\tif(e){\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t\t\n\t\t\tindex = cell.getIndex();\n\t\t\tnextRow = this.table.rowManager.nextDisplayRow(cell.row, true);\n\t\t\t\n\t\t\tif(nextRow){\n\t\t\t\tnextRow.cells[index].getComponent().edit();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\tfindNextEditableCell(row, index){\n\t\tvar nextCell = false;\n\t\t\n\t\tif(index < row.cells.length-1){\n\t\t\tfor(var i = index+1; i < row.cells.length; i++){\n\t\t\t\tlet cell = row.cells[i];\n\t\t\t\t\n\t\t\t\tif(cell.column.modules.edit && Helpers.elVisible(cell.getElement())){\n\t\t\t\t\tlet allowEdit = this.allowEdit(cell);\n\t\t\t\t\t\n\t\t\t\t\tif(allowEdit){\n\t\t\t\t\t\tnextCell = cell;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn nextCell;\n\t}\n\t\n\tfindPrevEditableCell(row, index){\n\t\tvar prevCell = false;\n\t\t\n\t\tif(index > 0){\n\t\t\tfor(var i = index-1; i >= 0; i--){\n\t\t\t\tlet cell = row.cells[i];\n\t\t\t\t\n\t\t\t\tif(cell.column.modules.edit && Helpers.elVisible(cell.getElement())){\n\t\t\t\t\tlet allowEdit = this.allowEdit(cell);\n\t\t\t\t\t\n\t\t\t\t\tif(allowEdit){\n\t\t\t\t\t\tprevCell = cell;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn prevCell;\n\t}\n\t\n\t///////////////////////////////////\n\t///////// Internal Logic //////////\n\t///////////////////////////////////\n\t\n\tinitializeColumnCheck(column){\n\t\tif(typeof column.definition.editor !== \"undefined\"){\n\t\t\tthis.initializeColumn(column);\n\t\t}\n\t}\n\t\n\tcolumnDeleteCheck(column){\n\t\tif(this.currentCell && this.currentCell.column === column){\n\t\t\tthis.cancelEdit();\n\t\t}\n\t}\n\t\n\trowDeleteCheck(row){\n\t\tif(this.currentCell && this.currentCell.row === row){\n\t\t\tthis.cancelEdit();\n\t\t}\n\t}\n\t\n\trowEditableCheck(row){\n\t\trow.getCells().forEach((cell) => {\n\t\t\tif(cell.column.modules.edit && typeof cell.column.modules.edit.check === \"function\"){\n\t\t\t\tthis.updateCellClass(cell);\n\t\t\t}\n\t\t});\n\t}\n\t\n\t//initialize column editor\n\tinitializeColumn(column){\n\t\tvar convertEmpty = Object.keys(column.definition).includes(\"editorEmptyValue\");\n\n\t\tvar config = {\n\t\t\teditor:false,\n\t\t\tblocked:false,\n\t\t\tcheck:column.definition.editable,\n\t\t\tparams:column.definition.editorParams || {},\n\t\t\tconvertEmptyValues:convertEmpty,\n\t\t\teditorEmptyValue:column.definition.editorEmptyValue,\n\t\t\teditorEmptyValueFunc:column.definition.editorEmptyValueFunc,\n\t\t};\n\t\t\n\t\t//set column editor\n\t\tconfig.editor = this.lookupEditor(column.definition.editor, column);\n\t\t\n\t\tif(config.editor){\n\t\t\tcolumn.modules.edit = config;\n\t\t}\n\t}\n\n\tlookupEditor(editor, column){\n\t\tvar editorFunc;\n\n\t\tswitch(typeof editor){\n\t\t\tcase \"string\":\n\t\t\t\tif(this.editors[editor]){\n\t\t\t\t\teditorFunc = this.editors[editor];\n\t\t\t\t}else {\n\t\t\t\t\tconsole.warn(\"Editor Error - No such editor found: \", editor);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase \"function\":\n\t\t\t\teditorFunc = editor;\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase \"boolean\":\n\t\t\t\tif(editor === true){\n\t\t\t\t\tif(typeof column.definition.formatter !== \"function\"){\n\t\t\t\t\t\tif(this.editors[column.definition.formatter]){\n\t\t\t\t\t\t\teditorFunc = this.editors[column.definition.formatter];\n\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\teditorFunc = this.editors[\"input\"];\n\t\t\t\t\t\t}\n\t\t\t\t\t}else {\n\t\t\t\t\t\tconsole.warn(\"Editor Error - Cannot auto lookup editor for a custom formatter: \", column.definition.formatter);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn editorFunc;\n\t}\n\t\n\tgetCurrentCell(){\n\t\treturn this.currentCell ? this.currentCell.getComponent() : false;\n\t}\n\t\n\tclearEditor(cancel){\n\t\tvar cell = this.currentCell,\n\t\tcellEl;\n\t\t\n\t\tthis.invalidEdit = false;\n\t\t\n\t\tif(cell){\n\t\t\tthis.currentCell = false;\n\t\t\t\n\t\t\tcellEl = cell.getElement();\n\t\t\t\n\t\t\tthis.dispatch(\"edit-editor-clear\", cell, cancel);\n\t\t\t\n\t\t\tcellEl.classList.remove(\"tabulator-editing\");\n\t\t\t\n\t\t\twhile(cellEl.firstChild) cellEl.removeChild(cellEl.firstChild);\n\t\t\t\n\t\t\tcell.row.getElement().classList.remove(\"tabulator-editing\");\n\t\t\t\n\t\t\tcell.table.element.classList.remove(\"tabulator-editing\");\n\t\t}\n\t}\n\t\n\tcancelEdit(){\n\t\tif(this.currentCell){\n\t\t\tvar cell = this.currentCell;\n\t\t\tvar component = this.currentCell.getComponent();\n\t\t\t\n\t\t\tthis.clearEditor(true);\n\t\t\tcell.setValueActual(cell.getValue());\n\t\t\tcell.cellRendered();\n\t\t\t\n\t\t\tif(cell.column.definition.editor == \"textarea\" || cell.column.definition.variableHeight){\n\t\t\t\tcell.row.normalizeHeight(true);\n\t\t\t}\n\t\t\t\n\t\t\tif(cell.column.definition.cellEditCancelled){\n\t\t\t\tcell.column.definition.cellEditCancelled.call(this.table, component);\n\t\t\t}\n\t\t\t\n\t\t\tthis.dispatch(\"edit-cancelled\", cell);\n\t\t\tthis.dispatchExternal(\"cellEditCancelled\", component);\n\t\t}\n\t}\n\t\n\t//return a formatted value for a cell\n\tbindEditor(cell){\n\t\tif(cell.column.modules.edit){\n\t\t\tvar self = this,\n\t\t\telement = cell.getElement(true);\n\t\t\t\n\t\t\tthis.updateCellClass(cell);\n\t\t\telement.setAttribute(\"tabindex\", 0);\n\t\t\t\n\t\t\telement.addEventListener(\"mousedown\", function(e){\n\t\t\t\tif (e.button === 2) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}else {\n\t\t\t\t\tself.mouseClick = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif(this.options(\"editTriggerEvent\") === \"dblclick\"){\n\t\t\t\telement.addEventListener(\"dblclick\", function(e){\n\t\t\t\t\tif(!element.classList.contains(\"tabulator-editing\")){\n\t\t\t\t\t\telement.focus({preventScroll: true});\n\t\t\t\t\t\tself.edit(cell, e, false);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\tif(this.options(\"editTriggerEvent\") === \"focus\" || this.options(\"editTriggerEvent\") === \"click\"){\n\t\t\t\telement.addEventListener(\"click\", function(e){\n\t\t\t\t\tif(!element.classList.contains(\"tabulator-editing\")){\n\t\t\t\t\t\telement.focus({preventScroll: true});\n\t\t\t\t\t\tself.edit(cell, e, false);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\t\n\t\t\tif(this.options(\"editTriggerEvent\") === \"focus\"){\n\t\t\t\telement.addEventListener(\"focus\", function(e){\n\t\t\t\t\tif(!self.recursionBlock){\n\t\t\t\t\t\tself.edit(cell, e, false);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\t\n\tfocusCellNoEvent(cell, block){\n\t\tthis.recursionBlock = true;\n\t\t\n\t\tif(!(block && this.table.browser === \"ie\")){\n\t\t\tcell.getElement().focus({preventScroll: true});\n\t\t}\n\t\t\n\t\tthis.recursionBlock = false;\n\t}\n\t\n\teditCell(cell, forceEdit){\n\t\tthis.focusCellNoEvent(cell);\n\t\tthis.edit(cell, false, forceEdit);\n\t}\n\t\n\tfocusScrollAdjust(cell){\n\t\tif(this.table.rowManager.getRenderMode() == \"virtual\"){\n\t\t\tvar topEdge = this.table.rowManager.element.scrollTop,\n\t\t\tbottomEdge = this.table.rowManager.element.clientHeight + this.table.rowManager.element.scrollTop,\n\t\t\trowEl = cell.row.getElement();\n\t\t\t\n\t\t\tif(rowEl.offsetTop < topEdge){\n\t\t\t\tthis.table.rowManager.element.scrollTop -= (topEdge - rowEl.offsetTop);\n\t\t\t}else {\n\t\t\t\tif(rowEl.offsetTop + rowEl.offsetHeight > bottomEdge){\n\t\t\t\t\tthis.table.rowManager.element.scrollTop += (rowEl.offsetTop + rowEl.offsetHeight - bottomEdge);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tvar leftEdge = this.table.rowManager.element.scrollLeft,\n\t\t\trightEdge = this.table.rowManager.element.clientWidth + this.table.rowManager.element.scrollLeft,\n\t\t\tcellEl = cell.getElement();\n\t\t\t\n\t\t\tif(this.table.modExists(\"frozenColumns\")){\n\t\t\t\tleftEdge += parseInt(this.table.modules.frozenColumns.leftMargin || 0);\n\t\t\t\trightEdge -= parseInt(this.table.modules.frozenColumns.rightMargin || 0);\n\t\t\t}\n\t\t\t\n\t\t\tif(this.table.options.renderHorizontal === \"virtual\"){\n\t\t\t\tleftEdge -= parseInt(this.table.columnManager.renderer.vDomPadLeft);\n\t\t\t\trightEdge -= parseInt(this.table.columnManager.renderer.vDomPadLeft);\n\t\t\t}\n\t\t\t\n\t\t\tif(cellEl.offsetLeft < leftEdge){\n\t\t\t\tthis.table.rowManager.element.scrollLeft -= (leftEdge - cellEl.offsetLeft);\n\t\t\t}else {\n\t\t\t\tif(cellEl.offsetLeft + cellEl.offsetWidth > rightEdge){\n\t\t\t\t\tthis.table.rowManager.element.scrollLeft += (cellEl.offsetLeft + cellEl.offsetWidth - rightEdge);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tallowEdit(cell) {\n\t\tvar check = cell.column.modules.edit ? true : false;\n\t\t\n\t\tif(cell.column.modules.edit){\n\t\t\tswitch(typeof cell.column.modules.edit.check){\n\t\t\t\tcase \"function\":\n\t\t\t\t\tif(cell.row.initialized){\n\t\t\t\t\t\tcheck = cell.column.modules.edit.check(cell.getComponent());\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"string\":\n\t\t\t\t\tcheck = !!cell.row.data[cell.column.modules.edit.check];\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"boolean\":\n\t\t\t\t\tcheck = cell.column.modules.edit.check;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn check;\n\t}\n\t\n\tedit(cell, e, forceEdit){\n\t\tvar self = this,\n\t\tallowEdit = true,\n\t\trendered = function(){},\n\t\telement = cell.getElement(),\n\t\teditFinished = false,\n\t\tcellEditor, component, params;\n\n\t\t//prevent editing if another cell is refusing to leave focus (eg. validation fail)\n\t\t\n\t\tif(this.currentCell){\n\t\t\tif(!this.invalidEdit && this.currentCell !== cell){\n\t\t\t\tthis.cancelEdit();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t//handle successful value change\n\t\tfunction success(value){\n\t\t\tif(self.currentCell === cell && !editFinished){\n\t\t\t\tvar valid = self.chain(\"edit-success\", [cell, value], true, true);\n\n\t\t\t\tif(valid === true || self.table.options.validationMode === \"highlight\"){\n\n\t\t\t\t\teditFinished = true;\n\n\t\t\t\t\tself.clearEditor();\n\t\t\t\t\t\n\t\t\t\t\tif(!cell.modules.edit){\n\t\t\t\t\t\tcell.modules.edit = {};\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tcell.modules.edit.edited = true;\n\t\t\t\t\t\n\t\t\t\t\tif(self.editedCells.indexOf(cell) == -1){\n\t\t\t\t\t\tself.editedCells.push(cell);\n\t\t\t\t\t}\n\n\t\t\t\t\tvalue = self.transformEmptyValues(value, cell);\n\t\t\t\t\t\n\t\t\t\t\tcell.setValue(value, true);\n\n\t\t\t\t\treturn valid === true;\n\t\t\t\t}else {\n\t\t\t\t\teditFinished = true;\n\t\t\t\t\tself.invalidEdit = true;\n\t\t\t\t\tself.focusCellNoEvent(cell, true);\n\t\t\t\t\trendered();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\teditFinished = false;\n\t\t\t\t\t}, 10);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t//handle aborted edit\n\t\tfunction cancel(){\n\t\t\t// editFinished = true;\n\n\t\t\tif(self.currentCell === cell && !editFinished){\n\t\t\t\tself.cancelEdit();\n\t\t\t}\n\t\t}\n\t\t\n\t\tfunction onRendered(callback){\n\t\t\trendered = callback;\n\t\t}\n\t\t\n\t\tif(!cell.column.modules.edit.blocked){\n\t\t\tif(e){\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\t\t\t\n\t\t\tallowEdit = this.allowEdit(cell);\n\t\t\t\n\t\t\tif(allowEdit || forceEdit){\n\t\t\t\tself.cancelEdit();\n\t\t\t\t\n\t\t\t\tself.currentCell = cell;\n\t\t\t\t\n\t\t\t\tthis.focusScrollAdjust(cell);\n\t\t\t\t\n\t\t\t\tcomponent = cell.getComponent();\n\t\t\t\t\n\t\t\t\tif(this.mouseClick){\n\t\t\t\t\tthis.mouseClick = false;\n\t\t\t\t\t\n\t\t\t\t\tif(cell.column.definition.cellClick){\n\t\t\t\t\t\tcell.column.definition.cellClick.call(this.table, e, component);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(cell.column.definition.cellEditing){\n\t\t\t\t\tcell.column.definition.cellEditing.call(this.table, component);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.dispatch(\"cell-editing\", cell);\n\t\t\t\tthis.dispatchExternal(\"cellEditing\", component);\n\t\t\t\t\n\t\t\t\tparams = typeof cell.column.modules.edit.params === \"function\" ? cell.column.modules.edit.params(component) : cell.column.modules.edit.params;\n\t\t\t\t\n\t\t\t\tcellEditor = cell.column.modules.edit.editor.call(self, component, onRendered, success, cancel, params);\n\t\t\t\t\n\t\t\t\t//if editor returned, add to DOM, if false, abort edit\n\t\t\t\tif(this.currentCell && cellEditor !== false){\n\t\t\t\t\tif(cellEditor instanceof Node){\n\t\t\t\t\t\telement.classList.add(\"tabulator-editing\");\n\t\t\t\t\t\tcell.row.getElement().classList.add(\"tabulator-editing\");\n\t\t\t\t\t\tcell.table.element.classList.add(\"tabulator-editing\");\n\t\t\t\t\t\twhile(element.firstChild) element.removeChild(element.firstChild);\n\t\t\t\t\t\telement.appendChild(cellEditor);\n\t\t\t\t\t\t\n\t\t\t\t\t\t//trigger onRendered Callback\n\t\t\t\t\t\trendered();\n\t\t\t\t\t\t\n\t\t\t\t\t\t//prevent editing from triggering rowClick event\n\t\t\t\t\t\tvar children = element.children;\n\t\t\t\t\t\t\n\t\t\t\t\t\tfor (var i = 0; i < children.length; i++) {\n\t\t\t\t\t\t\tchildren[i].addEventListener(\"click\", function(e){\n\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}else {\n\t\t\t\t\t\tconsole.warn(\"Edit Error - Editor should return an instance of Node, the editor returned:\", cellEditor);\n\t\t\t\t\t\tthis.blur(element);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}else {\n\t\t\t\t\tthis.blur(element);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn true;\n\t\t\t}else {\n\t\t\t\tthis.mouseClick = false;\n\t\t\t\tthis.blur(element);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}else {\n\t\t\tthis.mouseClick = false;\n\t\t\tthis.blur(element);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\temptyValueCheck(value){\n\t\treturn value === \"\" || value === null || typeof value === \"undefined\";\n\t}\n\n\ttransformEmptyValues(value, cell){\n\t\tvar mod = cell.column.modules.edit, \n\t\tconvert = mod.convertEmptyValues || this.convertEmptyValues,\n\t\tcheckFunc;\n\t\t\n\t\tif(convert){\n\t\t\tcheckFunc = mod.editorEmptyValueFunc || this.options(\"editorEmptyValueFunc\");\n\n\t\t\tif(checkFunc && checkFunc(value)){\n\t\t\t\tvalue = mod.convertEmptyValues ? mod.editorEmptyValue : this.options(\"editorEmptyValue\");\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn value;\n\t}\n\t\n\tblur(element){\n\t\tif(!this.confirm(\"edit-blur\", [element]) ){\n\t\t\telement.blur();\n\t\t}\n\t}\n\t\n\tgetEditedCells(){\n\t\tvar output = [];\n\t\t\n\t\tthis.editedCells.forEach((cell) => {\n\t\t\toutput.push(cell.getComponent());\n\t\t});\n\t\t\n\t\treturn output;\n\t}\n\t\n\tclearEdited(cell){\n\t\tvar editIndex;\n\t\t\n\t\tif(cell.modules.edit && cell.modules.edit.edited){\n\t\t\tcell.modules.edit.edited = false;\n\t\t\t\n\t\t\tthis.dispatch(\"edit-edited-clear\", cell);\n\t\t}\n\t\t\n\t\teditIndex = this.editedCells.indexOf(cell);\n\t\t\n\t\tif(editIndex > -1){\n\t\t\tthis.editedCells.splice(editIndex, 1);\n\t\t}\n\t}\n}\n\nclass ExportRow{\n\tconstructor(type, columns, component, indent){\n\t\tthis.type = type;\n\t\tthis.columns = columns;\n\t\tthis.component = component || false;\n\t\tthis.indent = indent || 0;\n\t}\n}\n\nclass ExportColumn{\n\tconstructor(value, component, width, height, depth){\n\t\tthis.value = value;\n\t\tthis.component = component || false;\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.depth = depth;\n\t}\n}\n\nvar columnLookups$1 = {\r\n\r\n};\n\nvar rowLookups$1 = {\r\n\tvisible:function(){\r\n\t\treturn this.rowManager.getVisibleRows(false, true);\r\n\t},\r\n\tall:function(){\r\n\t\treturn this.rowManager.rows;\r\n\t},\r\n\tselected:function(){\r\n\t\treturn this.modules.selectRow.selectedRows;\r\n\t},\r\n\tactive:function(){\r\n\t\tif(this.options.pagination){\r\n\t\t\treturn this.rowManager.getDisplayRows(this.rowManager.displayRows.length - 2);\r\n\t\t}else {\r\n\t\t\treturn this.rowManager.getDisplayRows();\r\n\t\t}\r\n\t},\r\n};\n\nclass Export extends Module{\n\n\tstatic moduleName = \"export\";\n\n\tstatic columnLookups = columnLookups$1;\n\tstatic rowLookups = rowLookups$1;\n\t\n\tconstructor(table){\n\t\tsuper(table);\n\t\t\n\t\tthis.config = {};\n\t\tthis.cloneTableStyle = true;\n\t\tthis.colVisProp = \"\";\n\t\tthis.colVisPropAttach = \"\";\n\t\t\n\t\tthis.registerTableOption(\"htmlOutputConfig\", false); //html output config\n\t\t\n\t\tthis.registerColumnOption(\"htmlOutput\");\n\t\tthis.registerColumnOption(\"titleHtmlOutput\");\n\t}\n\t\n\tinitialize(){\n\t\tthis.registerTableFunction(\"getHtml\", this.getHtml.bind(this));\n\t}\n\t\n\t///////////////////////////////////\n\t///////// Internal Logic //////////\n\t///////////////////////////////////\n\t\n\tgenerateExportList(config, style, range, colVisProp){\n\t\tvar headers, body, columns, colLookup;\n\n\t\tthis.cloneTableStyle = style;\n\t\tthis.config = config || {};\n\t\tthis.colVisProp = colVisProp;\n\t\tthis.colVisPropAttach = this.colVisProp.charAt(0).toUpperCase() + this.colVisProp.slice(1);\n\n\t\tcolLookup = Export.columnLookups[range];\n\n\t\tif(colLookup){\n\t\t\tcolumns = colLookup.call(this.table);\n\t\t\tcolumns = columns.filter(col => this.columnVisCheck(col));\n\t\t}\n\n\t\theaders = this.config.columnHeaders !== false ? this.headersToExportRows(this.generateColumnGroupHeaders(columns)) : [];\n\n\t\tif(columns){\n\t\t\tcolumns = columns.map(col => col.getComponent());\n\t\t}\n\t\t\n\t\tbody = this.bodyToExportRows(this.rowLookup(range), columns);\n\n\t\treturn headers.concat(body);\n\t}\n\t\n\tgenerateTable(config, style, range, colVisProp){\n\t\tvar list = this.generateExportList(config, style, range, colVisProp);\n\t\t\n\t\treturn this.generateTableElement(list);\n\t}\n\t\n\trowLookup(range){\n\t\tvar rows = [], \n\t\trowLookup;\n\t\t\n\t\tif(typeof range == \"function\"){\n\t\t\trange.call(this.table).forEach((row) =>{\n\t\t\t\trow = this.table.rowManager.findRow(row);\n\t\t\t\t\n\t\t\t\tif(row){\n\t\t\t\t\trows.push(row);\n\t\t\t\t}\n\t\t\t});\n\t\t}else {\n\t\t\trowLookup = Export.rowLookups[range] || Export.rowLookups[\"active\"];\n\n\t\t\trows = rowLookup.call(this.table);\n\t\t}\n\t\t\n\t\treturn Object.assign([], rows);\n\t}\n\t\n\tgenerateColumnGroupHeaders(columns){\n\t\tvar output = [];\n\t\t\n\t\tif (!columns) {\n\t\t\tcolumns = this.config.columnGroups !== false ? this.table.columnManager.columns : this.table.columnManager.columnsByIndex;\n\t\t}\n\t\t\n\t\tcolumns.forEach((column) => {\n\t\t\tvar colData = this.processColumnGroup(column);\n\t\t\t\n\t\t\tif(colData){\n\t\t\t\toutput.push(colData);\n\t\t\t}\n\t\t});\n\n\n\n\t\treturn output;\n\t}\n\t\n\tprocessColumnGroup(column){\n\t\tvar subGroups = column.columns,\n\t\tmaxDepth = 0,\n\t\ttitle = column.definition[\"title\" + (this.colVisPropAttach)] || column.definition.title;\n\t\t\n\t\tvar groupData = {\n\t\t\ttitle:title,\n\t\t\tcolumn:column,\n\t\t\tdepth:1,\n\t\t};\n\t\t\n\t\tif(subGroups.length){\n\t\t\tgroupData.subGroups = [];\n\t\t\tgroupData.width = 0;\n\t\t\t\n\t\t\tsubGroups.forEach((subGroup) => {\n\t\t\t\tvar subGroupData = this.processColumnGroup(subGroup);\n\t\t\t\t\n\t\t\t\tif(subGroupData){\n\t\t\t\t\tgroupData.width += subGroupData.width;\n\t\t\t\t\tgroupData.subGroups.push(subGroupData);\n\t\t\t\t\t\n\t\t\t\t\tif(subGroupData.depth > maxDepth){\n\t\t\t\t\t\tmaxDepth = subGroupData.depth;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tgroupData.depth += maxDepth;\n\t\t\t\n\t\t\tif(!groupData.width){\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}else {\n\t\t\tif(this.columnVisCheck(column)){\n\t\t\t\tgroupData.width = 1;\n\t\t\t}else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn groupData;\n\t}\n\t\n\tcolumnVisCheck(column){\n\t\tvar visProp = column.definition[this.colVisProp];\n\n\t\tif(this.config.rowHeaders === false && column.isRowHeader){\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tif(typeof visProp === \"function\"){\n\t\t\tvisProp = visProp.call(this.table, column.getComponent());\n\t\t}\n\n\t\tif(visProp === false || visProp === true){\n\t\t\treturn visProp;\n\t\t}\n\n\t\treturn column.visible && column.field;\n\t}\n\t\n\theadersToExportRows(columns){\n\t\tvar headers = [],\n\t\theaderDepth = 0,\n\t\texportRows = [];\n\t\t\n\t\tfunction parseColumnGroup(column, level){\n\t\t\t\n\t\t\tvar depth = headerDepth - level;\n\t\t\t\n\t\t\tif(typeof headers[level] === \"undefined\"){\n\t\t\t\theaders[level] = [];\n\t\t\t}\n\t\t\t\n\t\t\tcolumn.height = column.subGroups ? 1 : (depth - column.depth) + 1;\n\t\t\t\n\t\t\theaders[level].push(column);\n\t\t\t\n\t\t\tif(column.height > 1){\n\t\t\t\tfor(let i = 1; i < column.height; i ++){\n\t\t\t\t\t\n\t\t\t\t\tif(typeof headers[level + i] === \"undefined\"){\n\t\t\t\t\t\theaders[level + i] = [];\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\theaders[level + i].push(false);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif(column.width > 1){\n\t\t\t\tfor(let i = 1; i < column.width; i ++){\n\t\t\t\t\theaders[level].push(false);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif(column.subGroups){\n\t\t\t\tcolumn.subGroups.forEach(function(subGroup){\n\t\t\t\t\tparseColumnGroup(subGroup, level+1);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t\n\t\t//calculate maximum header depth\n\t\tcolumns.forEach(function(column){\n\t\t\tif(column.depth > headerDepth){\n\t\t\t\theaderDepth = column.depth;\n\t\t\t}\n\t\t});\n\t\t\n\t\tcolumns.forEach(function(column){\n\t\t\tparseColumnGroup(column,0);\n\t\t});\n\t\t\n\t\theaders.forEach((header) => {\n\t\t\tvar columns = [];\n\t\t\t\n\t\t\theader.forEach((col) => {\n\t\t\t\tif(col){\n\t\t\t\t\tlet title = typeof col.title === \"undefined\" ? \"\" : col.title;\n\t\t\t\t\tcolumns.push(new ExportColumn(title, col.column.getComponent(), col.width, col.height, col.depth));\n\t\t\t\t}else {\n\t\t\t\t\tcolumns.push(null);\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\texportRows.push(new ExportRow(\"header\", columns));\n\t\t});\n\t\t\n\t\treturn exportRows;\n\t}\n\t\n\tbodyToExportRows(rows, columns = []){\n\t\tvar exportRows = [];\n\t\t\n\t\tif (columns.length === 0) {\n\t\t\tthis.table.columnManager.columnsByIndex.forEach((column) => {\n\t\t\t\tif (this.columnVisCheck(column)) {\n\t\t\t\t\tcolumns.push(column.getComponent());\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t\n\t\tif(this.config.columnCalcs !== false && this.table.modExists(\"columnCalcs\")){\n\t\t\tif(this.table.modules.columnCalcs.topInitialized){\n\t\t\t\trows.unshift(this.table.modules.columnCalcs.topRow);\n\t\t\t}\n\t\t\t\n\t\t\tif(this.table.modules.columnCalcs.botInitialized){\n\t\t\t\trows.push(this.table.modules.columnCalcs.botRow);\n\t\t\t}\n\t\t}\n\n\t\trows = rows.filter((row) => {\n\t\t\tswitch(row.type){\n\t\t\t\tcase \"group\":\n\t\t\t\t\treturn this.config.rowGroups !== false;\n\t\t\t\t\n\t\t\t\tcase \"calc\":\n\t\t\t\t\treturn this.config.columnCalcs !== false;\n\t\t\t\t\n\t\t\t\tcase \"row\":\n\t\t\t\t\treturn !(this.table.options.dataTree && this.config.dataTree === false && row.modules.dataTree.parent);\n\t\t\t}\n\t\t\t\n\t\t\treturn true;\n\t\t});\n\t\t\n\t\trows.forEach((row, i) => {\n\t\t\tvar rowData = row.getData(this.colVisProp);\n\t\t\tvar exportCols = [];\n\t\t\tvar indent = 0;\n\t\t\t\n\t\t\tswitch(row.type){\n\t\t\t\tcase \"group\":\n\t\t\t\t\tindent = row.level;\n\t\t\t\t\texportCols.push(new ExportColumn(row.key, row.getComponent(), columns.length, 1));\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"calc\" :\n\t\t\t\tcase \"row\" :\n\t\t\t\t\tcolumns.forEach((col) => {\n\t\t\t\t\t\texportCols.push(new ExportColumn(col._column.getFieldValue(rowData), col, 1, 1));\n\t\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\tif(this.table.options.dataTree && this.config.dataTree !== false){\n\t\t\t\t\t\tindent = row.modules.dataTree.index;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\texportRows.push(new ExportRow(row.type, exportCols, row.getComponent(), indent));\n\t\t});\n\t\t\n\t\treturn exportRows;\n\t}\n\t\n\tgenerateTableElement(list){\n\t\tvar table = document.createElement(\"table\"),\n\t\theaderEl = document.createElement(\"thead\"),\n\t\tbodyEl = document.createElement(\"tbody\"),\n\t\tstyles = this.lookupTableStyles(),\n\t\trowFormatter = this.table.options[\"rowFormatter\" + (this.colVisPropAttach)],\n\t\tsetup = {};\n\t\t\n\t\tsetup.rowFormatter = rowFormatter !== null ? rowFormatter : this.table.options.rowFormatter;\n\t\t\n\t\tif(this.table.options.dataTree &&this.config.dataTree !== false && this.table.modExists(\"columnCalcs\")){\n\t\t\tsetup.treeElementField = this.table.modules.dataTree.elementField;\n\t\t}\n\t\t\n\t\t//assign group header formatter\n\t\tsetup.groupHeader = this.table.options[\"groupHeader\" + (this.colVisPropAttach)];\n\t\t\n\t\tif(setup.groupHeader && !Array.isArray(setup.groupHeader)){\n\t\t\tsetup.groupHeader = [setup.groupHeader];\n\t\t}\n\t\t\n\t\ttable.classList.add(\"tabulator-print-table\");\n\t\t\n\t\tthis.mapElementStyles(this.table.columnManager.getHeadersElement(), headerEl, [\"border-top\", \"border-left\", \"border-right\", \"border-bottom\", \"background-color\", \"color\", \"font-weight\", \"font-family\", \"font-size\"]);\n\n\t\tif(list.length > 1000){\n\t\t\tconsole.warn(\"It may take a long time to render an HTML table with more than 1000 rows\");\n\t\t}\n\t\t\n\t\tlist.forEach((row, i) => {\n\t\t\tlet rowEl;\n\t\t\t\n\t\t\tswitch(row.type){\n\t\t\t\tcase \"header\":\n\t\t\t\t\theaderEl.appendChild(this.generateHeaderElement(row, setup, styles));\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"group\":\n\t\t\t\t\tbodyEl.appendChild(this.generateGroupElement(row, setup, styles));\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"calc\":\n\t\t\t\t\tbodyEl.appendChild(this.generateCalcElement(row, setup, styles));\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"row\":\n\t\t\t\t\trowEl = this.generateRowElement(row, setup, styles);\n\t\t\t\t\n\t\t\t\t\tthis.mapElementStyles(((i % 2) && styles.evenRow) ? styles.evenRow : styles.oddRow, rowEl, [\"border-top\", \"border-left\", \"border-right\", \"border-bottom\", \"color\", \"font-weight\", \"font-family\", \"font-size\", \"background-color\"]);\n\t\t\t\t\tbodyEl.appendChild(rowEl);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t\t\n\t\tif(headerEl.innerHTML){\n\t\t\ttable.appendChild(headerEl);\n\t\t}\n\t\t\n\t\ttable.appendChild(bodyEl);\n\t\t\n\t\t\n\t\tthis.mapElementStyles(this.table.element, table, [\"border-top\", \"border-left\", \"border-right\", \"border-bottom\"]);\n\t\treturn table;\n\t}\n\t\n\tlookupTableStyles(){\n\t\tvar styles = {};\n\t\t\n\t\t//lookup row styles\n\t\tif(this.cloneTableStyle && window.getComputedStyle){\n\t\t\tstyles.oddRow = this.table.element.querySelector(\".tabulator-row-odd:not(.tabulator-group):not(.tabulator-calcs)\");\n\t\t\tstyles.evenRow = this.table.element.querySelector(\".tabulator-row-even:not(.tabulator-group):not(.tabulator-calcs)\");\n\t\t\tstyles.calcRow = this.table.element.querySelector(\".tabulator-row.tabulator-calcs\");\n\t\t\tstyles.firstRow = this.table.element.querySelector(\".tabulator-row:not(.tabulator-group):not(.tabulator-calcs)\");\n\t\t\tstyles.firstGroup = this.table.element.getElementsByClassName(\"tabulator-group\")[0];\n\t\t\t\n\t\t\tif(styles.firstRow){\n\t\t\t\tstyles.styleCells = styles.firstRow.getElementsByClassName(\"tabulator-cell\");\n\t\t\t\tstyles.styleRowHeader = styles.firstRow.getElementsByClassName(\"tabulator-row-header\")[0];\n\t\t\t\tstyles.firstCell = styles.styleCells[0];\n\t\t\t\tstyles.lastCell = styles.styleCells[styles.styleCells.length - 1];\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn styles;\n\t}\n\t\n\tgenerateHeaderElement(row, setup, styles){\n\t\tvar rowEl = document.createElement(\"tr\");\n\t\t\n\t\trow.columns.forEach((column) => {\n\t\t\tif(column){\n\t\t\t\tvar cellEl = document.createElement(\"th\");\n\t\t\t\tvar classNames = column.component._column.definition.cssClass ? column.component._column.definition.cssClass.split(\" \") : [];\n\t\t\t\t\n\t\t\t\tcellEl.colSpan = column.width;\n\t\t\t\tcellEl.rowSpan = column.height;\n\t\t\t\t\n\t\t\t\tcellEl.innerHTML = column.value;\n\t\t\t\t\n\t\t\t\tif(this.cloneTableStyle){\n\t\t\t\t\tcellEl.style.boxSizing = \"border-box\";\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tclassNames.forEach(function(className) {\n\t\t\t\t\tcellEl.classList.add(className);\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tthis.mapElementStyles(column.component.getElement(), cellEl, [\"text-align\", \"border-left\", \"border-right\", \"background-color\", \"color\", \"font-weight\", \"font-family\", \"font-size\"]);\n\t\t\t\tthis.mapElementStyles(column.component._column.contentElement, cellEl, [\"padding-top\", \"padding-left\", \"padding-right\", \"padding-bottom\"]);\n\t\t\n\t\t\t\tif(column.component._column.visible){\n\t\t\t\t\tthis.mapElementStyles(column.component.getElement(), cellEl, [\"width\"]);\n\t\t\t\t}else {\n\t\t\t\t\tif(column.component._column.definition.width){\n\t\t\t\t\t\tcellEl.style.width = column.component._column.definition.width + \"px\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(column.component._column.parent && column.component._column.parent.isGroup){\n\t\t\t\t\tthis.mapElementStyles(column.component._column.parent.groupElement, cellEl, [\"border-top\"]);\n\t\t\t\t}else {\n\t\t\t\t\tthis.mapElementStyles(column.component.getElement(), cellEl, [\"border-top\"]);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(column.component._column.isGroup){\n\t\t\t\t\tthis.mapElementStyles(column.component.getElement(), cellEl, [\"border-bottom\"]);\n\t\t\t\t}else {\n\t\t\t\t\tthis.mapElementStyles(this.table.columnManager.getElement(), cellEl, [\"border-bottom\"]);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\trowEl.appendChild(cellEl);\n\t\t\t}\n\t\t});\n\t\t\n\t\treturn rowEl;\n\t}\n\t\n\tgenerateGroupElement(row, setup, styles){\n\t\t\n\t\tvar rowEl = document.createElement(\"tr\"),\n\t\tcellEl = document.createElement(\"td\"),\n\t\tgroup = row.columns[0];\n\t\t\n\t\trowEl.classList.add(\"tabulator-print-table-row\");\n\t\t\n\t\tif(setup.groupHeader && setup.groupHeader[row.indent]){\n\t\t\tgroup.value = setup.groupHeader[row.indent](group.value, row.component._group.getRowCount(), row.component._group.getData(), row.component);\n\t\t}else {\n\t\t\tif(setup.groupHeader !== false){\n\t\t\t\tgroup.value = row.component._group.generator(group.value, row.component._group.getRowCount(), row.component._group.getData(), row.component);\n\t\t\t}\n\t\t}\n\t\t\n\t\tcellEl.colSpan = group.width;\n\t\tcellEl.innerHTML = group.value;\n\t\t\n\t\trowEl.classList.add(\"tabulator-print-table-group\");\n\t\trowEl.classList.add(\"tabulator-group-level-\" + row.indent);\n\t\t\n\t\tif(group.component.isVisible()){\n\t\t\trowEl.classList.add(\"tabulator-group-visible\");\n\t\t}\n\t\t\n\t\tthis.mapElementStyles(styles.firstGroup, rowEl, [\"border-top\", \"border-left\", \"border-right\", \"border-bottom\", \"color\", \"font-weight\", \"font-family\", \"font-size\", \"background-color\"]);\n\t\tthis.mapElementStyles(styles.firstGroup, cellEl, [\"padding-top\", \"padding-left\", \"padding-right\", \"padding-bottom\"]);\n\t\t\n\t\trowEl.appendChild(cellEl);\n\t\t\n\t\treturn rowEl;\n\t}\n\t\n\tgenerateCalcElement(row, setup, styles){\n\t\tvar rowEl = this.generateRowElement(row, setup, styles);\n\t\t\n\t\trowEl.classList.add(\"tabulator-print-table-calcs\");\n\t\tthis.mapElementStyles(styles.calcRow, rowEl, [\"border-top\", \"border-left\", \"border-right\", \"border-bottom\", \"color\", \"font-weight\", \"font-family\", \"font-size\", \"background-color\"]);\n\t\t\n\t\treturn rowEl;\n\t}\n\t\n\tgenerateRowElement(row, setup, styles){\n\t\tvar rowEl = document.createElement(\"tr\");\n\t\t\n\t\trowEl.classList.add(\"tabulator-print-table-row\");\n\t\t\n\t\trow.columns.forEach((col, i) => {\n\t\t\tif(col){\n\t\t\t\tvar cellEl = document.createElement(\"td\"),\n\t\t\t\tcolumn = col.component._column,\n\t\t\t\ttable = this.table,\n\t\t\t\tindex = table.columnManager.findColumnIndex(column),\n\t\t\t\tvalue = col.value,\n\t\t\t\tcellStyle, styleProps;\n\t\t\t\t\n\t\t\t\tvar cellWrapper = {\n\t\t\t\t\tmodules:{},\n\t\t\t\t\tgetValue:function(){\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t},\n\t\t\t\t\tgetField:function(){\n\t\t\t\t\t\treturn column.definition.field;\n\t\t\t\t\t},\n\t\t\t\t\tgetElement:function(){\n\t\t\t\t\t\treturn cellEl;\n\t\t\t\t\t},\n\t\t\t\t\tgetType:function(){\n\t\t\t\t\t\treturn \"cell\";\n\t\t\t\t\t},\n\t\t\t\t\tgetColumn:function(){\n\t\t\t\t\t\treturn column.getComponent();\n\t\t\t\t\t},\n\t\t\t\t\tgetData:function(){\n\t\t\t\t\t\treturn row.component.getData();\n\t\t\t\t\t},\n\t\t\t\t\tgetRow:function(){\n\t\t\t\t\t\treturn row.component;\n\t\t\t\t\t},\n\t\t\t\t\tgetTable:function(){\n\t\t\t\t\t\treturn table;\n\t\t\t\t\t},\n\t\t\t\t\tgetComponent:function(){\n\t\t\t\t\t\treturn cellWrapper;\n\t\t\t\t\t},\n\t\t\t\t\tcolumn:column,\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tvar classNames = column.definition.cssClass ? column.definition.cssClass.split(\" \") : [];\n\t\t\t\t\n\t\t\t\tclassNames.forEach(function(className) {\n\t\t\t\t\tcellEl.classList.add(className);\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tif(this.table.modExists(\"format\") && this.config.formatCells !== false){\n\t\t\t\t\tvalue = this.table.modules.format.formatExportValue(cellWrapper, this.colVisProp);\n\t\t\t\t}else {\n\t\t\t\t\tswitch(typeof value){\n\t\t\t\t\t\tcase \"object\":\n\t\t\t\t\t\t\tvalue = value !== null ? JSON.stringify(value) : \"\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\t\tcase \"undefined\":\n\t\t\t\t\t\t\tvalue = \"\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(value instanceof Node){\n\t\t\t\t\tcellEl.appendChild(value);\n\t\t\t\t}else {\n\t\t\t\t\tcellEl.innerHTML = value;\n\t\t\t\t}\n\n\t\t\t\tstyleProps = [\"padding-top\", \"padding-left\", \"padding-right\", \"padding-bottom\", \"border-top\", \"border-left\", \"border-right\", \"border-bottom\", \"color\", \"font-weight\", \"font-family\", \"font-size\", \"text-align\"];\n\n\t\t\t\tif(column.isRowHeader){\n\t\t\t\t\tcellStyle = styles.styleRowHeader;\n\t\t\t\t\tstyleProps.push(\"background-color\");\n\t\t\t\t}else {\n\t\t\t\t\tcellStyle = styles.styleCells && styles.styleCells[index] ? styles.styleCells[index] : styles.firstCell;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(cellStyle){\n\t\t\t\t\tthis.mapElementStyles(cellStyle, cellEl, styleProps);\n\t\t\t\t\t\n\t\t\t\t\tif(column.definition.align){\n\t\t\t\t\t\tcellEl.style.textAlign = column.definition.align;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(this.table.options.dataTree && this.config.dataTree !== false){\n\t\t\t\t\tif((setup.treeElementField && setup.treeElementField == column.field) || (!setup.treeElementField && i == 0)){\n\t\t\t\t\t\tif(row.component._row.modules.dataTree.controlEl){\n\t\t\t\t\t\t\tcellEl.insertBefore(row.component._row.modules.dataTree.controlEl.cloneNode(true), cellEl.firstChild);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(row.component._row.modules.dataTree.branchEl){\n\t\t\t\t\t\t\tcellEl.insertBefore(row.component._row.modules.dataTree.branchEl.cloneNode(true), cellEl.firstChild);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\trowEl.appendChild(cellEl);\n\t\t\t\t\n\t\t\t\tif(cellWrapper.modules.format && cellWrapper.modules.format.renderedCallback){\n\t\t\t\t\tcellWrapper.modules.format.renderedCallback();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t\n\t\tif(setup.rowFormatter && row.type === \"row\" && this.config.formatCells !== false){\n\t\t\tlet formatComponent = Object.assign(row.component);\n\n\t\t\tformatComponent.getElement = function(){return rowEl;};\n\n\t\t\tsetup.rowFormatter(row.component);\n\t\t}\n\t\t\n\t\treturn rowEl;\n\t}\n\t\n\tgenerateHTMLTable(list){\n\t\tvar holder = document.createElement(\"div\");\n\t\t\n\t\tholder.appendChild(this.generateTableElement(list));\n\t\t\n\t\treturn holder.innerHTML;\n\t}\n\t\n\tgetHtml(visible, style, config, colVisProp){\n\t\tvar list = this.generateExportList(config || this.table.options.htmlOutputConfig, style, visible, colVisProp || \"htmlOutput\");\n\t\t\n\t\treturn this.generateHTMLTable(list);\n\t}\n\t\n\tmapElementStyles(from, to, props){\n\t\tif(this.cloneTableStyle && from && to){\n\t\t\t\n\t\t\tvar lookup = {\n\t\t\t\t\"background-color\" : \"backgroundColor\",\n\t\t\t\t\"color\" : \"fontColor\",\n\t\t\t\t\"width\" : \"width\",\n\t\t\t\t\"font-weight\" : \"fontWeight\",\n\t\t\t\t\"font-family\" : \"fontFamily\",\n\t\t\t\t\"font-size\" : \"fontSize\",\n\t\t\t\t\"text-align\" : \"textAlign\",\n\t\t\t\t\"border-top\" : \"borderTop\",\n\t\t\t\t\"border-left\" : \"borderLeft\",\n\t\t\t\t\"border-right\" : \"borderRight\",\n\t\t\t\t\"border-bottom\" : \"borderBottom\",\n\t\t\t\t\"padding-top\" : \"paddingTop\",\n\t\t\t\t\"padding-left\" : \"paddingLeft\",\n\t\t\t\t\"padding-right\" : \"paddingRight\",\n\t\t\t\t\"padding-bottom\" : \"paddingBottom\",\n\t\t\t};\n\t\t\t\n\t\t\tif(window.getComputedStyle){\n\t\t\t\tvar fromStyle = window.getComputedStyle(from);\n\n\t\t\t\tprops.forEach(function(prop){\n\t\t\t\t\tif(!to.style[lookup[prop]]){\n\t\t\t\t\t\tto.style[lookup[prop]] = fromStyle.getPropertyValue(prop);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}\n\nvar defaultFilters = {\n\n\t//equal to\n\t\"=\":function(filterVal, rowVal, rowData, filterParams){\n\t\treturn rowVal == filterVal ? true : false;\n\t},\n\n\t//less than\n\t\"<\":function(filterVal, rowVal, rowData, filterParams){\n\t\treturn rowVal < filterVal ? true : false;\n\t},\n\n\t//less than or equal to\n\t\"<=\":function(filterVal, rowVal, rowData, filterParams){\n\t\treturn rowVal <= filterVal ? true : false;\n\t},\n\n\t//greater than\n\t\">\":function(filterVal, rowVal, rowData, filterParams){\n\t\treturn rowVal > filterVal ? true : false;\n\t},\n\n\t//greater than or equal to\n\t\">=\":function(filterVal, rowVal, rowData, filterParams){\n\t\treturn rowVal >= filterVal ? true : false;\n\t},\n\n\t//not equal to\n\t\"!=\":function(filterVal, rowVal, rowData, filterParams){\n\t\treturn rowVal != filterVal ? true : false;\n\t},\n\n\t\"regex\":function(filterVal, rowVal, rowData, filterParams){\n\n\t\tif(typeof filterVal == \"string\"){\n\t\t\tfilterVal = new RegExp(filterVal);\n\t\t}\n\n\t\treturn filterVal.test(rowVal);\n\t},\n\n\t//contains the string\n\t\"like\":function(filterVal, rowVal, rowData, filterParams){\n\t\tif(filterVal === null || typeof filterVal === \"undefined\"){\n\t\t\treturn rowVal === filterVal ? true : false;\n\t\t}else {\n\t\t\tif(typeof rowVal !== 'undefined' && rowVal !== null){\n\t\t\t\treturn String(rowVal).toLowerCase().indexOf(filterVal.toLowerCase()) > -1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t},\n\n\t//contains the keywords\n\t\"keywords\":function(filterVal, rowVal, rowData, filterParams){\n\t\tvar keywords = filterVal.toLowerCase().split(typeof filterParams.separator === \"undefined\" ? \" \" : filterParams.separator),\n\t\tvalue = String(rowVal === null || typeof rowVal === \"undefined\" ? \"\" : rowVal).toLowerCase(),\n\t\tmatches = [];\n\n\t\tkeywords.forEach((keyword) =>{\n\t\t\tif(value.includes(keyword)){\n\t\t\t\tmatches.push(true);\n\t\t\t}\n\t\t});\n\n\t\treturn filterParams.matchAll ? matches.length === keywords.length : !!matches.length;\n\t},\n\n\t//starts with the string\n\t\"starts\":function(filterVal, rowVal, rowData, filterParams){\n\t\tif(filterVal === null || typeof filterVal === \"undefined\"){\n\t\t\treturn rowVal === filterVal ? true : false;\n\t\t}else {\n\t\t\tif(typeof rowVal !== 'undefined' && rowVal !== null){\n\t\t\t\treturn String(rowVal).toLowerCase().startsWith(filterVal.toLowerCase());\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t},\n\n\t//ends with the string\n\t\"ends\":function(filterVal, rowVal, rowData, filterParams){\n\t\tif(filterVal === null || typeof filterVal === \"undefined\"){\n\t\t\treturn rowVal === filterVal ? true : false;\n\t\t}else {\n\t\t\tif(typeof rowVal !== 'undefined' && rowVal !== null){\n\t\t\t\treturn String(rowVal).toLowerCase().endsWith(filterVal.toLowerCase());\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t},\n\n\t//in array\n\t\"in\":function(filterVal, rowVal, rowData, filterParams){\n\t\tif(Array.isArray(filterVal)){\n\t\t\treturn filterVal.length ? filterVal.indexOf(rowVal) > -1 : true;\n\t\t}else {\n\t\t\tconsole.warn(\"Filter Error - filter value is not an array:\", filterVal);\n\t\t\treturn false;\n\t\t}\n\t},\n};\n\nclass Filter extends Module{\n\n\tstatic moduleName = \"filter\";\n\n\t//load defaults\n\tstatic filters = defaultFilters;\n\n\tconstructor(table){\n\t\tsuper(table);\n\n\t\tthis.filterList = []; //hold filter list\n\t\tthis.headerFilters = {}; //hold column filters\n\t\tthis.headerFilterColumns = []; //hold columns that use header filters\n\n\t\tthis.prevHeaderFilterChangeCheck = \"\";\n\t\tthis.prevHeaderFilterChangeCheck = \"{}\";\n\n\t\tthis.changed = false; //has filtering changed since last render\n\t\tthis.tableInitialized = false;\n\n\t\tthis.registerTableOption(\"filterMode\", \"local\"); //local or remote filtering\n\n\t\tthis.registerTableOption(\"initialFilter\", false); //initial filtering criteria\n\t\tthis.registerTableOption(\"initialHeaderFilter\", false); //initial header filtering criteria\n\t\tthis.registerTableOption(\"headerFilterLiveFilterDelay\", 300); //delay before updating column after user types in header filter\n\t\tthis.registerTableOption(\"placeholderHeaderFilter\", false); //placeholder when header filter is empty\n\n\t\tthis.registerColumnOption(\"headerFilter\");\n\t\tthis.registerColumnOption(\"headerFilterPlaceholder\");\n\t\tthis.registerColumnOption(\"headerFilterParams\");\n\t\tthis.registerColumnOption(\"headerFilterEmptyCheck\");\n\t\tthis.registerColumnOption(\"headerFilterFunc\");\n\t\tthis.registerColumnOption(\"headerFilterFuncParams\");\n\t\tthis.registerColumnOption(\"headerFilterLiveFilter\");\n\n\t\tthis.registerTableFunction(\"searchRows\", this.searchRows.bind(this));\n\t\tthis.registerTableFunction(\"searchData\", this.searchData.bind(this));\n\n\t\tthis.registerTableFunction(\"setFilter\", this.userSetFilter.bind(this));\n\t\tthis.registerTableFunction(\"refreshFilter\", this.userRefreshFilter.bind(this));\n\t\tthis.registerTableFunction(\"addFilter\", this.userAddFilter.bind(this));\n\t\tthis.registerTableFunction(\"getFilters\", this.getFilters.bind(this));\n\t\tthis.registerTableFunction(\"setHeaderFilterFocus\", this.userSetHeaderFilterFocus.bind(this));\n\t\tthis.registerTableFunction(\"getHeaderFilterValue\", this.userGetHeaderFilterValue.bind(this));\n\t\tthis.registerTableFunction(\"setHeaderFilterValue\", this.userSetHeaderFilterValue.bind(this));\n\t\tthis.registerTableFunction(\"getHeaderFilters\", this.getHeaderFilters.bind(this));\n\t\tthis.registerTableFunction(\"removeFilter\", this.userRemoveFilter.bind(this));\n\t\tthis.registerTableFunction(\"clearFilter\", this.userClearFilter.bind(this));\n\t\tthis.registerTableFunction(\"clearHeaderFilter\", this.userClearHeaderFilter.bind(this));\n\n\t\tthis.registerComponentFunction(\"column\", \"headerFilterFocus\", this.setHeaderFilterFocus.bind(this));\n\t\tthis.registerComponentFunction(\"column\", \"reloadHeaderFilter\", this.reloadHeaderFilter.bind(this));\n\t\tthis.registerComponentFunction(\"column\", \"getHeaderFilterValue\", this.getHeaderFilterValue.bind(this));\n\t\tthis.registerComponentFunction(\"column\", \"setHeaderFilterValue\", this.setHeaderFilterValue.bind(this));\n\t}\n\n\tinitialize(){\n\t\tthis.subscribe(\"column-init\", this.initializeColumnHeaderFilter.bind(this));\n\t\tthis.subscribe(\"column-width-fit-before\", this.hideHeaderFilterElements.bind(this));\n\t\tthis.subscribe(\"column-width-fit-after\", this.showHeaderFilterElements.bind(this));\n\t\tthis.subscribe(\"table-built\", this.tableBuilt.bind(this));\n\t\tthis.subscribe(\"placeholder\", this.generatePlaceholder.bind(this));\n\n\t\tif(this.table.options.filterMode === \"remote\"){\n\t\t\tthis.subscribe(\"data-params\", this.remoteFilterParams.bind(this));\n\t\t}\n\n\t\tthis.registerDataHandler(this.filter.bind(this), 10);\n\t}\n\n\ttableBuilt(){\n\t\tif(this.table.options.initialFilter){\n\t\t\tthis.setFilter(this.table.options.initialFilter);\n\t\t}\n\n\t\tif(this.table.options.initialHeaderFilter){\n\t\t\tthis.table.options.initialHeaderFilter.forEach((item) => {\n\n\t\t\t\tvar column = this.table.columnManager.findColumn(item.field);\n\n\t\t\t\tif(column){\n\t\t\t\t\tthis.setHeaderFilterValue(column, item.value);\n\t\t\t\t}else {\n\t\t\t\t\tconsole.warn(\"Column Filter Error - No matching column found:\", item.field);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.tableInitialized = true;\n\t}\n\n\tremoteFilterParams(data, config, silent, params){\n\t\tparams.filter = this.getFilters(true, true);\n\t\treturn params;\n\t}\n\n\tgeneratePlaceholder(text){\n\t\tif(this.table.options.placeholderHeaderFilter && Object.keys(this.headerFilters).length){\n\t\t\treturn this.table.options.placeholderHeaderFilter;\n\t\t}\n\t}\n\n\t///////////////////////////////////\n\t///////// Table Functions /////////\n\t///////////////////////////////////\n\n\t//set standard filters\n\tuserSetFilter(field, type, value, params){\n\t\tthis.setFilter(field, type, value, params);\n\t\tthis.refreshFilter();\n\t}\n\n\t//set standard filters\n\tuserRefreshFilter(){\n\t\tthis.refreshFilter();\n\t}\n\n\t//add filter to array\n\tuserAddFilter(field, type, value, params){\n\t\tthis.addFilter(field, type, value, params);\n\t\tthis.refreshFilter();\n\t}\n\n\tuserSetHeaderFilterFocus(field){\n\t\tvar column = this.table.columnManager.findColumn(field);\n\n\t\tif(column){\n\t\t\tthis.setHeaderFilterFocus(column);\n\t\t}else {\n\t\t\tconsole.warn(\"Column Filter Focus Error - No matching column found:\", field);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tuserGetHeaderFilterValue(field) {\n\t\tvar column = this.table.columnManager.findColumn(field);\n\n\t\tif(column){\n\t\t\treturn this.getHeaderFilterValue(column);\n\t\t}else {\n\t\t\tconsole.warn(\"Column Filter Error - No matching column found:\", field);\n\t\t}\n\t}\n\n\tuserSetHeaderFilterValue(field, value){\n\t\tvar column = this.table.columnManager.findColumn(field);\n\n\t\tif(column){\n\t\t\tthis.setHeaderFilterValue(column, value);\n\t\t}else {\n\t\t\tconsole.warn(\"Column Filter Error - No matching column found:\", field);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t//remove filter from array\n\tuserRemoveFilter(field, type, value){\n\t\tthis.removeFilter(field, type, value);\n\t\tthis.refreshFilter();\n\t}\n\n\t//clear filters\n\tuserClearFilter(all){\n\t\tthis.clearFilter(all);\n\t\tthis.refreshFilter();\n\t}\n\n\t//clear header filters\n\tuserClearHeaderFilter(){\n\t\tthis.clearHeaderFilter();\n\t\tthis.refreshFilter();\n\t}\n\n\n\t//search for specific row components\n\tsearchRows(field, type, value){\n\t\treturn this.search(\"rows\", field, type, value);\n\t}\n\n\t//search for specific data\n\tsearchData(field, type, value){\n\t\treturn this.search(\"data\", field, type, value);\n\t}\n\n\t///////////////////////////////////\n\t///////// Internal Logic //////////\n\t///////////////////////////////////\n\n\tinitializeColumnHeaderFilter(column){\n\t\tvar def = column.definition;\n\n\t\tif(def.headerFilter){\n\t\t\tthis.initializeColumn(column);\n\t\t}\n\t}\n\n\t//initialize column header filter\n\tinitializeColumn(column, value){\n\t\tvar self = this,\n\t\tfield = column.getField();\n\n\t\t//handle successfully value change\n\t\tfunction success(value){\n\t\t\tvar filterType = (column.modules.filter.tagType == \"input\" && column.modules.filter.attrType == \"text\") || column.modules.filter.tagType == \"textarea\" ? \"partial\" : \"match\",\n\t\t\ttype = \"\",\n\t\t\tfilterChangeCheck = \"\",\n\t\t\tfilterFunc;\n\n\t\t\tif(typeof column.modules.filter.prevSuccess === \"undefined\" || column.modules.filter.prevSuccess !== value){\n\n\t\t\t\tcolumn.modules.filter.prevSuccess = value;\n\n\t\t\t\tif(!column.modules.filter.emptyFunc(value)){\n\t\t\t\t\tcolumn.modules.filter.value = value;\n\n\t\t\t\t\tswitch(typeof column.definition.headerFilterFunc){\n\t\t\t\t\t\tcase \"string\":\n\t\t\t\t\t\t\tif(Filter.filters[column.definition.headerFilterFunc]){\n\t\t\t\t\t\t\t\ttype = column.definition.headerFilterFunc;\n\t\t\t\t\t\t\t\tfilterFunc = function(data){\n\t\t\t\t\t\t\t\t\tvar params = column.definition.headerFilterFuncParams || {};\n\t\t\t\t\t\t\t\t\tvar fieldVal = column.getFieldValue(data);\n\n\t\t\t\t\t\t\t\t\tparams = typeof params === \"function\" ? params(value, fieldVal, data) : params;\n\n\t\t\t\t\t\t\t\t\treturn Filter.filters[column.definition.headerFilterFunc](value, fieldVal, data, params);\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\t\tconsole.warn(\"Header Filter Error - Matching filter function not found: \", column.definition.headerFilterFunc);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase \"function\":\n\t\t\t\t\t\t\tfilterFunc = function(data){\n\t\t\t\t\t\t\t\tvar params = column.definition.headerFilterFuncParams || {};\n\t\t\t\t\t\t\t\tvar fieldVal = column.getFieldValue(data);\n\n\t\t\t\t\t\t\t\tparams = typeof params === \"function\" ? params(value, fieldVal, data) : params;\n\n\t\t\t\t\t\t\t\treturn column.definition.headerFilterFunc(value, fieldVal, data, params);\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\ttype = filterFunc;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(!filterFunc){\n\t\t\t\t\t\tswitch(filterType){\n\t\t\t\t\t\t\tcase \"partial\":\n\t\t\t\t\t\t\t\tfilterFunc = function(data){\n\t\t\t\t\t\t\t\t\tvar colVal = column.getFieldValue(data);\n\n\t\t\t\t\t\t\t\t\tif(typeof colVal !== 'undefined' && colVal !== null){\n\t\t\t\t\t\t\t\t\t\treturn String(colVal).toLowerCase().indexOf(String(value).toLowerCase()) > -1;\n\t\t\t\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\ttype = \"like\";\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tfilterFunc = function(data){\n\t\t\t\t\t\t\t\t\treturn column.getFieldValue(data) == value;\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\ttype = \"=\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tself.headerFilters[field] = {value:value, func:filterFunc, type:type};\n\t\t\t\t}else {\n\t\t\t\t\tdelete self.headerFilters[field];\n\t\t\t\t}\n\n\t\t\t\tcolumn.modules.filter.value = value;\n\n\t\t\t\tfilterChangeCheck = JSON.stringify(self.headerFilters);\n\n\t\t\t\tif(self.prevHeaderFilterChangeCheck !== filterChangeCheck){\n\t\t\t\t\tself.prevHeaderFilterChangeCheck = filterChangeCheck;\n\n\t\t\t\t\tself.trackChanges();\n\t\t\t\t\tself.refreshFilter();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\tcolumn.modules.filter = {\n\t\t\tsuccess:success,\n\t\t\tattrType:false,\n\t\t\ttagType:false,\n\t\t\temptyFunc:false,\n\t\t};\n\n\t\tthis.generateHeaderFilterElement(column);\n\t}\n\n\tgenerateHeaderFilterElement(column, initialValue, reinitialize){\n\t\tvar self = this,\n\t\tsuccess = column.modules.filter.success,\n\t\tfield = column.getField(),\n\t\tfilterElement, editor, editorElement, cellWrapper, typingTimer, searchTrigger, params, onRenderedCallback;\n\n\t\tcolumn.modules.filter.value = initialValue;\n\n\t\t//handle aborted edit\n\t\tfunction cancel(){}\n\n\t\tfunction onRendered(callback){\n\t\t\tonRenderedCallback = callback;\n\t\t}\n\n\t\tif(column.modules.filter.headerElement && column.modules.filter.headerElement.parentNode){\n\t\t\tcolumn.contentElement.removeChild(column.modules.filter.headerElement.parentNode);\n\t\t}\n\n\t\tif(field){\n\n\t\t\t//set empty value function\n\t\t\tcolumn.modules.filter.emptyFunc = column.definition.headerFilterEmptyCheck || function(value){\n\t\t\t\treturn !value && value !== 0;\n\t\t\t};\n\n\t\t\tfilterElement = document.createElement(\"div\");\n\t\t\tfilterElement.classList.add(\"tabulator-header-filter\");\n\n\t\t\t//set column editor\n\t\t\tswitch(typeof column.definition.headerFilter){\n\t\t\t\tcase \"string\":\n\t\t\t\t\tif(self.table.modules.edit.editors[column.definition.headerFilter]){\n\t\t\t\t\t\teditor = self.table.modules.edit.editors[column.definition.headerFilter];\n\n\t\t\t\t\t\tif((column.definition.headerFilter === \"tick\" || column.definition.headerFilter === \"tickCross\") && !column.definition.headerFilterEmptyCheck){\n\t\t\t\t\t\t\tcolumn.modules.filter.emptyFunc = function(value){\n\t\t\t\t\t\t\t\treturn value !== true && value !== false;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}else {\n\t\t\t\t\t\tconsole.warn(\"Filter Error - Cannot build header filter, No such editor found: \", column.definition.editor);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"function\":\n\t\t\t\t\teditor = column.definition.headerFilter;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"boolean\":\n\t\t\t\t\tif(column.modules.edit && column.modules.edit.editor){\n\t\t\t\t\t\teditor = column.modules.edit.editor;\n\t\t\t\t\t}else {\n\t\t\t\t\t\tif(column.definition.formatter && self.table.modules.edit.editors[column.definition.formatter]){\n\t\t\t\t\t\t\teditor = self.table.modules.edit.editors[column.definition.formatter];\n\n\t\t\t\t\t\t\tif((column.definition.formatter === \"tick\" || column.definition.formatter === \"tickCross\") && !column.definition.headerFilterEmptyCheck){\n\t\t\t\t\t\t\t\tcolumn.modules.filter.emptyFunc = function(value){\n\t\t\t\t\t\t\t\t\treturn value !== true && value !== false;\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\teditor = self.table.modules.edit.editors[\"input\"];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif(editor){\n\n\t\t\t\tcellWrapper = {\n\t\t\t\t\tgetValue:function(){\n\t\t\t\t\t\treturn typeof initialValue !== \"undefined\" ? initialValue : \"\";\n\t\t\t\t\t},\n\t\t\t\t\tgetField:function(){\n\t\t\t\t\t\treturn column.definition.field;\n\t\t\t\t\t},\n\t\t\t\t\tgetElement:function(){\n\t\t\t\t\t\treturn filterElement;\n\t\t\t\t\t},\n\t\t\t\t\tgetColumn:function(){\n\t\t\t\t\t\treturn column.getComponent();\n\t\t\t\t\t},\n\t\t\t\t\tgetTable:() => {\n\t\t\t\t\t\treturn this.table;\n\t\t\t\t\t},\n\t\t\t\t\tgetType:() => {\n\t\t\t\t\t\treturn \"header\";\n\t\t\t\t\t},\n\t\t\t\t\tgetRow:function(){\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tnormalizeHeight:function(){\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tparams = column.definition.headerFilterParams || {};\n\n\t\t\t\tparams = typeof params === \"function\" ? params.call(self.table, cellWrapper) : params;\n\n\t\t\t\teditorElement = editor.call(this.table.modules.edit, cellWrapper, onRendered, success, cancel, params);\n\n\t\t\t\tif(!editorElement){\n\t\t\t\t\tconsole.warn(\"Filter Error - Cannot add filter to \" + field + \" column, editor returned a value of false\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif(!(editorElement instanceof Node)){\n\t\t\t\t\tconsole.warn(\"Filter Error - Cannot add filter to \" + field + \" column, editor should return an instance of Node, the editor returned:\", editorElement);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t//set Placeholder Text\n\t\t\t\tself.langBind(\"headerFilters|columns|\" + column.definition.field, function(value){\n\t\t\t\t\teditorElement.setAttribute(\"placeholder\", typeof value !== \"undefined\" && value ? value : (column.definition.headerFilterPlaceholder || self.langText(\"headerFilters|default\")));\n\t\t\t\t});\n\n\t\t\t\t//focus on element on click\n\t\t\t\teditorElement.addEventListener(\"click\", function(e){\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\teditorElement.focus();\n\t\t\t\t});\n\n\t\t\t\teditorElement.addEventListener(\"focus\", (e) => {\n\t\t\t\t\tvar left = this.table.columnManager.contentsElement.scrollLeft;\n\n\t\t\t\t\tvar headerPos = this.table.rowManager.element.scrollLeft;\n\n\t\t\t\t\tif(left !== headerPos){\n\t\t\t\t\t\tthis.table.rowManager.scrollHorizontal(left);\n\t\t\t\t\t\tthis.table.columnManager.scrollHorizontal(left);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t//live update filters as user types\n\t\t\t\ttypingTimer = false;\n\n\t\t\t\tsearchTrigger = function(e){\n\t\t\t\t\tif(typingTimer){\n\t\t\t\t\t\tclearTimeout(typingTimer);\n\t\t\t\t\t}\n\n\t\t\t\t\ttypingTimer = setTimeout(function(){\n\t\t\t\t\t\tsuccess(editorElement.value);\n\t\t\t\t\t},self.table.options.headerFilterLiveFilterDelay);\n\t\t\t\t};\n\n\t\t\t\tcolumn.modules.filter.headerElement = editorElement;\n\t\t\t\tcolumn.modules.filter.attrType = editorElement.hasAttribute(\"type\") ? editorElement.getAttribute(\"type\").toLowerCase() : \"\" ;\n\t\t\t\tcolumn.modules.filter.tagType = editorElement.tagName.toLowerCase();\n\n\t\t\t\tif(column.definition.headerFilterLiveFilter !== false){\n\n\t\t\t\t\tif (\n\t\t\t\t\t\t!(\n\t\t\t\t\t\t\tcolumn.definition.headerFilter === 'autocomplete' ||\n\t\t\t\t\t\t\tcolumn.definition.headerFilter === 'tickCross' ||\n\t\t\t\t\t\t\t((column.definition.editor === 'autocomplete' ||\n\t\t\t\t\t\t\t\tcolumn.definition.editor === 'tickCross') &&\n\t\t\t\t\t\t\tcolumn.definition.headerFilter === true)\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\teditorElement.addEventListener(\"keyup\", searchTrigger);\n\t\t\t\t\t\teditorElement.addEventListener(\"search\", searchTrigger);\n\n\n\t\t\t\t\t\t//update number filtered columns on change\n\t\t\t\t\t\tif(column.modules.filter.attrType == \"number\"){\n\t\t\t\t\t\t\teditorElement.addEventListener(\"change\", function(e){\n\t\t\t\t\t\t\t\tsuccess(editorElement.value);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//change text inputs to search inputs to allow for clearing of field\n\t\t\t\t\t\tif(column.modules.filter.attrType == \"text\" && this.table.browser !== \"ie\"){\n\t\t\t\t\t\t\teditorElement.setAttribute(\"type\", \"search\");\n\t\t\t\t\t\t// editorElement.off(\"change blur\"); //prevent blur from triggering filter and preventing selection click\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//prevent input and select elements from propagating click to column sorters etc\n\t\t\t\t\tif(column.modules.filter.tagType == \"input\" || column.modules.filter.tagType == \"select\" || column.modules.filter.tagType == \"textarea\"){\n\t\t\t\t\t\teditorElement.addEventListener(\"mousedown\",function(e){\n\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfilterElement.appendChild(editorElement);\n\n\t\t\t\tcolumn.contentElement.appendChild(filterElement);\n\n\t\t\t\tif(!reinitialize){\n\t\t\t\t\tself.headerFilterColumns.push(column);\n\t\t\t\t}\n\n\t\t\t\tif(onRenderedCallback){\n\t\t\t\t\tonRenderedCallback();\n\t\t\t\t}\n\t\t\t}\n\t\t}else {\n\t\t\tconsole.warn(\"Filter Error - Cannot add header filter, column has no field set:\", column.definition.title);\n\t\t}\n\t}\n\n\t//hide all header filter elements (used to ensure correct column widths in \"fitData\" layout mode)\n\thideHeaderFilterElements(){\n\t\tthis.headerFilterColumns.forEach(function(column){\n\t\t\tif(column.modules.filter && column.modules.filter.headerElement){\n\t\t\t\tcolumn.modules.filter.headerElement.style.display = 'none';\n\t\t\t}\n\t\t});\n\t}\n\n\t//show all header filter elements (used to ensure correct column widths in \"fitData\" layout mode)\n\tshowHeaderFilterElements(){\n\t\tthis.headerFilterColumns.forEach(function(column){\n\t\t\tif(column.modules.filter && column.modules.filter.headerElement){\n\t\t\t\tcolumn.modules.filter.headerElement.style.display = '';\n\t\t\t}\n\t\t});\n\t}\n\n\t//programmatically set focus of header filter\n\tsetHeaderFilterFocus(column){\n\t\tif(column.modules.filter && column.modules.filter.headerElement){\n\t\t\tcolumn.modules.filter.headerElement.focus();\n\t\t}else {\n\t\t\tconsole.warn(\"Column Filter Focus Error - No header filter set on column:\", column.getField());\n\t\t}\n\t}\n\n\t//programmatically get value of header filter\n\tgetHeaderFilterValue(column){\n\t\tif(column.modules.filter && column.modules.filter.headerElement){\n\t\t\treturn column.modules.filter.value;\n\t\t} else {\n\t\t\tconsole.warn(\"Column Filter Error - No header filter set on column:\", column.getField());\n\t\t}\n\t}\n\n\t//programmatically set value of header filter\n\tsetHeaderFilterValue(column, value){\n\t\tif (column){\n\t\t\tif(column.modules.filter && column.modules.filter.headerElement){\n\t\t\t\tthis.generateHeaderFilterElement(column, value, true);\n\t\t\t\tcolumn.modules.filter.success(value);\n\t\t\t}else {\n\t\t\t\tconsole.warn(\"Column Filter Error - No header filter set on column:\", column.getField());\n\t\t\t}\n\t\t}\n\t}\n\n\treloadHeaderFilter(column){\n\t\tif (column){\n\t\t\tif(column.modules.filter && column.modules.filter.headerElement){\n\t\t\t\tthis.generateHeaderFilterElement(column, column.modules.filter.value, true);\n\t\t\t}else {\n\t\t\t\tconsole.warn(\"Column Filter Error - No header filter set on column:\", column.getField());\n\t\t\t}\n\t\t}\n\t}\n\n\trefreshFilter(){\n\t\tif(this.tableInitialized){\n\t\t\tif(this.table.options.filterMode === \"remote\"){\n\t\t\t\tthis.reloadData(null, false, false);\n\t\t\t}else {\n\t\t\t\tthis.refreshData(true);\n\t\t\t}\n\t\t}\n\n\t\t//TODO - Persist left position of row manager\n\t\t// left = this.scrollLeft;\n\t\t// this.scrollHorizontal(left);\n\t}\n\n\t//check if the filters has changed since last use\n\ttrackChanges(){\n\t\tthis.changed = true;\n\t\tthis.dispatch(\"filter-changed\");\n\t}\n\n\t//check if the filters has changed since last use\n\thasChanged(){\n\t\tvar changed = this.changed;\n\t\tthis.changed = false;\n\t\treturn changed;\n\t}\n\n\t//set standard filters\n\tsetFilter(field, type, value, params){\n\t\tthis.filterList = [];\n\n\t\tif(!Array.isArray(field)){\n\t\t\tfield = [{field:field, type:type, value:value, params:params}];\n\t\t}\n\n\t\tthis.addFilter(field);\n\t}\n\n\t//add filter to array\n\taddFilter(field, type, value, params){\n\t\tvar changed = false;\n\n\t\tif(!Array.isArray(field)){\n\t\t\tfield = [{field:field, type:type, value:value, params:params}];\n\t\t}\n\n\t\tfield.forEach((filter) => {\n\t\t\tfilter = this.findFilter(filter);\n\n\t\t\tif(filter){\n\t\t\t\tthis.filterList.push(filter);\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t});\n\n\t\tif(changed){\n\t\t\tthis.trackChanges();\n\t\t}\n\t}\n\n\tfindFilter(filter){\n\t\tvar column;\n\n\t\tif(Array.isArray(filter)){\n\t\t\treturn this.findSubFilters(filter);\n\t\t}\n\n\t\tvar filterFunc = false;\n\n\t\tif(typeof filter.field == \"function\"){\n\t\t\tfilterFunc = function(data){\n\t\t\t\treturn filter.field(data, filter.type || {});// pass params to custom filter function\n\t\t\t};\n\t\t}else {\n\n\t\t\tif(Filter.filters[filter.type]){\n\n\t\t\t\tcolumn = this.table.columnManager.getColumnByField(filter.field);\n\n\t\t\t\tif(column){\n\t\t\t\t\tfilterFunc = function(data){\n\t\t\t\t\t\treturn Filter.filters[filter.type](filter.value, column.getFieldValue(data), data, filter.params || {});\n\t\t\t\t\t};\n\t\t\t\t}else {\n\t\t\t\t\tfilterFunc = function(data){\n\t\t\t\t\t\treturn Filter.filters[filter.type](filter.value, data[filter.field], data, filter.params || {});\n\t\t\t\t\t};\n\t\t\t\t}\n\n\n\t\t\t}else {\n\t\t\t\tconsole.warn(\"Filter Error - No such filter type found, ignoring: \", filter.type);\n\t\t\t}\n\t\t}\n\n\t\tfilter.func = filterFunc;\n\n\t\treturn filter.func ? filter : false;\n\t}\n\n\tfindSubFilters(filters){\n\t\tvar output = [];\n\n\t\tfilters.forEach((filter) => {\n\t\t\tfilter = this.findFilter(filter);\n\n\t\t\tif(filter){\n\t\t\t\toutput.push(filter);\n\t\t\t}\n\t\t});\n\n\t\treturn output.length ? output : false;\n\t}\n\n\t//get all filters\n\tgetFilters(all, ajax){\n\t\tvar output = [];\n\n\t\tif(all){\n\t\t\toutput = this.getHeaderFilters();\n\t\t}\n\n\t\tif(ajax){\n\t\t\toutput.forEach(function(item){\n\t\t\t\tif(typeof item.type == \"function\"){\n\t\t\t\t\titem.type = \"function\";\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\toutput = output.concat(this.filtersToArray(this.filterList, ajax));\n\n\t\treturn output;\n\t}\n\n\t//filter to Object\n\tfiltersToArray(filterList, ajax){\n\t\tvar output = [];\n\n\t\tfilterList.forEach((filter) => {\n\t\t\tvar item;\n\n\t\t\tif(Array.isArray(filter)){\n\t\t\t\toutput.push(this.filtersToArray(filter, ajax));\n\t\t\t}else {\n\t\t\t\titem = {field:filter.field, type:filter.type, value:filter.value};\n\n\t\t\t\tif(ajax){\n\t\t\t\t\tif(typeof item.type == \"function\"){\n\t\t\t\t\t\titem.type = \"function\";\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\toutput.push(item);\n\t\t\t}\n\t\t});\n\n\t\treturn output;\n\t}\n\n\t//get all filters\n\tgetHeaderFilters(){\n\t\tvar output = [];\n\n\t\tfor(var key in this.headerFilters){\n\t\t\toutput.push({field:key, type:this.headerFilters[key].type, value:this.headerFilters[key].value});\n\t\t}\n\n\t\treturn output;\n\t}\n\n\t//remove filter from array\n\tremoveFilter(field, type, value){\n\t\tif(!Array.isArray(field)){\n\t\t\tfield = [{field:field, type:type, value:value}];\n\t\t}\n\n\t\tfield.forEach((filter) => {\n\t\t\tvar index = -1;\n\n\t\t\tif(typeof filter.field == \"object\"){\n\t\t\t\tindex = this.filterList.findIndex((element) => {\n\t\t\t\t\treturn filter === element;\n\t\t\t\t});\n\t\t\t}else {\n\t\t\t\tindex = this.filterList.findIndex((element) => {\n\t\t\t\t\treturn filter.field === element.field && filter.type === element.type && filter.value === element.value;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif(index > -1){\n\t\t\t\tthis.filterList.splice(index, 1);\n\t\t\t}else {\n\t\t\t\tconsole.warn(\"Filter Error - No matching filter type found, ignoring: \", filter.type);\n\t\t\t}\n\t\t});\n\n\t\tthis.trackChanges();\n\t}\n\n\t//clear filters\n\tclearFilter(all){\n\t\tthis.filterList = [];\n\n\t\tif(all){\n\t\t\tthis.clearHeaderFilter();\n\t\t}\n\n\t\tthis.trackChanges();\n\t}\n\n\t//clear header filters\n\tclearHeaderFilter(){\n\t\tthis.headerFilters = {};\n\t\tthis.prevHeaderFilterChangeCheck = \"{}\";\n\n\t\tthis.headerFilterColumns.forEach((column) => {\n\t\t\tif(typeof column.modules.filter.value !== \"undefined\"){\n\t\t\t\tdelete column.modules.filter.value;\n\t\t\t}\n\t\t\tcolumn.modules.filter.prevSuccess = undefined;\n\t\t\tthis.reloadHeaderFilter(column);\n\t\t});\n\n\t\tthis.trackChanges();\n\t}\n\n\t//search data and return matching rows\n\tsearch (searchType, field, type, value){\n\t\tvar activeRows = [],\n\t\tfilterList = [];\n\n\t\tif(!Array.isArray(field)){\n\t\t\tfield = [{field:field, type:type, value:value}];\n\t\t}\n\n\t\tfield.forEach((filter) => {\n\t\t\tfilter = this.findFilter(filter);\n\n\t\t\tif(filter){\n\t\t\t\tfilterList.push(filter);\n\t\t\t}\n\t\t});\n\n\t\tthis.table.rowManager.rows.forEach((row) => {\n\t\t\tvar match = true;\n\n\t\t\tfilterList.forEach((filter) => {\n\t\t\t\tif(!this.filterRecurse(filter, row.getData())){\n\t\t\t\t\tmatch = false;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif(match){\n\t\t\t\tactiveRows.push(searchType === \"data\" ? row.getData(\"data\") : row.getComponent());\n\t\t\t}\n\n\t\t});\n\n\t\treturn activeRows;\n\t}\n\n\t//filter row array\n\tfilter(rowList, filters){\n\t\tvar activeRows = [],\n\t\tactiveRowComponents = [];\n\n\t\tif(this.subscribedExternal(\"dataFiltering\")){\n\t\t\tthis.dispatchExternal(\"dataFiltering\", this.getFilters(true));\n\t\t}\n\n\t\tif(this.table.options.filterMode !== \"remote\" && (this.filterList.length || Object.keys(this.headerFilters).length)){\n\n\t\t\trowList.forEach((row) => {\n\t\t\t\tif(this.filterRow(row)){\n\t\t\t\t\tactiveRows.push(row);\n\t\t\t\t}\n\t\t\t});\n\n\t\t}else {\n\t\t\tactiveRows = rowList.slice(0);\n\t\t}\n\n\t\tif(this.subscribedExternal(\"dataFiltered\")){\n\n\t\t\tactiveRows.forEach((row) => {\n\t\t\t\tactiveRowComponents.push(row.getComponent());\n\t\t\t});\n\n\t\t\tthis.dispatchExternal(\"dataFiltered\", this.getFilters(true), activeRowComponents);\n\t\t}\n\n\t\treturn activeRows;\n\t}\n\n\t//filter individual row\n\tfilterRow(row, filters){\n\t\tvar match = true,\n\t\tdata = row.getData();\n\n\t\tthis.filterList.forEach((filter) => {\n\t\t\tif(!this.filterRecurse(filter, data)){\n\t\t\t\tmatch = false;\n\t\t\t}\n\t\t});\n\n\n\t\tfor(var field in this.headerFilters){\n\t\t\tif(!this.headerFilters[field].func(data)){\n\t\t\t\tmatch = false;\n\t\t\t}\n\t\t}\n\n\t\treturn match;\n\t}\n\n\tfilterRecurse(filter, data){\n\t\tvar match = false;\n\n\t\tif(Array.isArray(filter)){\n\t\t\tfilter.forEach((subFilter) => {\n\t\t\t\tif(this.filterRecurse(subFilter, data)){\n\t\t\t\t\tmatch = true;\n\t\t\t\t}\n\t\t\t});\n\t\t}else {\n\t\t\tmatch = filter.func(data);\n\t\t}\n\n\t\treturn match;\n\t}\n}\n\nfunction plaintext(cell, formatterParams, onRendered){\n\treturn this.emptyToSpace(this.sanitizeHTML(cell.getValue()));\n}\n\nfunction html(cell, formatterParams, onRendered){\n\treturn cell.getValue();\n}\n\nfunction textarea(cell, formatterParams, onRendered){\n\tcell.getElement().style.whiteSpace = \"pre-wrap\";\n\treturn this.emptyToSpace(this.sanitizeHTML(cell.getValue()));\n}\n\nfunction money(cell, formatterParams, onRendered){\n\tvar floatVal = parseFloat(cell.getValue()),\n\tsign = \"\",\n\tnumber, integer, decimal, rgx, value;\n\n\tvar decimalSym = formatterParams.decimal || \".\";\n\tvar thousandSym = formatterParams.thousand || \",\";\n\tvar negativeSign = formatterParams.negativeSign || \"-\";\n\tvar symbol = formatterParams.symbol || \"\";\n\tvar after = !!formatterParams.symbolAfter;\n\tvar precision = typeof formatterParams.precision !== \"undefined\" ? formatterParams.precision : 2;\n\n\tif(isNaN(floatVal)){\n\t\treturn this.emptyToSpace(this.sanitizeHTML(cell.getValue()));\n\t}\n\n\tif(floatVal < 0){\n\t\tfloatVal = Math.abs(floatVal);\n\t\tsign = negativeSign;\n\t}\n\n\tnumber = precision !== false ? floatVal.toFixed(precision) : floatVal;\n\tnumber = String(number).split(\".\");\n\n\tinteger = number[0];\n\tdecimal = number.length > 1 ? decimalSym + number[1] : \"\";\n\n\tif (formatterParams.thousand !== false) {\n\t\trgx = /(\\d+)(\\d{3})/;\n\n\t\twhile (rgx.test(integer)){\n\t\t\tinteger = integer.replace(rgx, \"$1\" + thousandSym + \"$2\");\n\t\t}\n\t}\n\n\tvalue = integer + decimal;\n\t\n\tif(sign === true){\n\t\tvalue = \"(\" + value + \")\";\n\t\treturn after ? value + symbol : symbol + value;\n\t}else {\n\t\treturn after ? sign + value + symbol : sign + symbol + value;\n\t}\n}\n\nfunction link(cell, formatterParams, onRendered){\n\tvar value = cell.getValue(),\n\turlPrefix = formatterParams.urlPrefix || \"\",\n\tdownload = formatterParams.download,\n\tlabel = value,\n\tel = document.createElement(\"a\"),\n\tdata;\n\n\tfunction labelTraverse(path, data){\n\t\tvar item = path.shift(),\n\t\tvalue = data[item];\n\t\t\n\t\tif(path.length && typeof value === \"object\"){\n\t\t\treturn labelTraverse(path, value);\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tif(formatterParams.labelField){\n\t\tdata = cell.getData();\n\t\tlabel = labelTraverse(formatterParams.labelField.split(this.table.options.nestedFieldSeparator), data);\n\t}\n\n\tif(formatterParams.label){\n\t\tswitch(typeof formatterParams.label){\n\t\t\tcase \"string\":\n\t\t\t\tlabel = formatterParams.label;\n\t\t\t\tbreak;\n\n\t\t\tcase \"function\":\n\t\t\t\tlabel = formatterParams.label(cell);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tif(label){\n\t\tif(formatterParams.urlField){\n\t\t\tdata = cell.getData();\n\n\t\t\tvalue = Helpers.retrieveNestedData(this.table.options.nestedFieldSeparator, formatterParams.urlField, data);\n\t\t}\n\n\t\tif(formatterParams.url){\n\t\t\tswitch(typeof formatterParams.url){\n\t\t\t\tcase \"string\":\n\t\t\t\t\tvalue = formatterParams.url;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"function\":\n\t\t\t\t\tvalue = formatterParams.url(cell);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tel.setAttribute(\"href\", urlPrefix + value);\n\n\t\tif(formatterParams.target){\n\t\t\tel.setAttribute(\"target\", formatterParams.target);\n\t\t}\n\n\t\tif(formatterParams.download){\n\n\t\t\tif(typeof download == \"function\"){\n\t\t\t\tdownload = download(cell);\n\t\t\t}else {\n\t\t\t\tdownload = download === true ? \"\" : download;\n\t\t\t}\n\n\t\t\tel.setAttribute(\"download\", download);\n\t\t}\n\n\t\tel.innerHTML = this.emptyToSpace(this.sanitizeHTML(label));\n\n\t\treturn el;\n\t}else {\n\t\treturn \"&nbsp;\";\n\t}\n}\n\nfunction image(cell, formatterParams, onRendered){\n\tvar el = document.createElement(\"img\"),\n\tsrc = cell.getValue();\n\n\tif(formatterParams.urlPrefix){\n\t\tsrc = formatterParams.urlPrefix + cell.getValue();\n\t}\n\n\tif(formatterParams.urlSuffix){\n\t\tsrc = src + formatterParams.urlSuffix;\n\t}\n\n\tel.setAttribute(\"src\", src);\n\n\tswitch(typeof formatterParams.height){\n\t\tcase \"number\":\n\t\t\tel.style.height = formatterParams.height + \"px\";\n\t\t\tbreak;\n\n\t\tcase \"string\":\n\t\t\tel.style.height = formatterParams.height;\n\t\t\tbreak;\n\t}\n\n\tswitch(typeof formatterParams.width){\n\t\tcase \"number\":\n\t\t\tel.style.width = formatterParams.width + \"px\";\n\t\t\tbreak;\n\n\t\tcase \"string\":\n\t\t\tel.style.width = formatterParams.width;\n\t\t\tbreak;\n\t}\n\n\tel.addEventListener(\"load\", function(){\n\t\tcell.getRow().normalizeHeight();\n\t});\n\n\treturn el;\n}\n\nfunction tickCross(cell, formatterParams, onRendered){\n\tvar value = cell.getValue(),\n\telement = cell.getElement(),\n\tempty = formatterParams.allowEmpty,\n\ttruthy = formatterParams.allowTruthy,\n\ttrueValueSet = Object.keys(formatterParams).includes(\"trueValue\"),\n\ttick = typeof formatterParams.tickElement !== \"undefined\" ? formatterParams.tickElement : '<svg enable-background=\"new 0 0 24 24\" height=\"14\" width=\"14\" viewBox=\"0 0 24 24\" xml:space=\"preserve\" ><path fill=\"#2DC214\" clip-rule=\"evenodd\" d=\"M21.652,3.211c-0.293-0.295-0.77-0.295-1.061,0L9.41,14.34 c-0.293,0.297-0.771,0.297-1.062,0L3.449,9.351C3.304,9.203,3.114,9.13,2.923,9.129C2.73,9.128,2.534,9.201,2.387,9.351 l-2.165,1.946C0.078,11.445,0,11.63,0,11.823c0,0.194,0.078,0.397,0.223,0.544l4.94,5.184c0.292,0.296,0.771,0.776,1.062,1.07 l2.124,2.141c0.292,0.293,0.769,0.293,1.062,0l14.366-14.34c0.293-0.294,0.293-0.777,0-1.071L21.652,3.211z\" fill-rule=\"evenodd\"/></svg>',\n\tcross = typeof formatterParams.crossElement !== \"undefined\" ? formatterParams.crossElement : '<svg enable-background=\"new 0 0 24 24\" height=\"14\" width=\"14\" viewBox=\"0 0 24 24\" xml:space=\"preserve\" ><path fill=\"#CE1515\" d=\"M22.245,4.015c0.313,0.313,0.313,0.826,0,1.139l-6.276,6.27c-0.313,0.312-0.313,0.826,0,1.14l6.273,6.272 c0.313,0.313,0.313,0.826,0,1.14l-2.285,2.277c-0.314,0.312-0.828,0.312-1.142,0l-6.271-6.271c-0.313-0.313-0.828-0.313-1.141,0 l-6.276,6.267c-0.313,0.313-0.828,0.313-1.141,0l-2.282-2.28c-0.313-0.313-0.313-0.826,0-1.14l6.278-6.269 c0.313-0.312,0.313-0.826,0-1.14L1.709,5.147c-0.314-0.313-0.314-0.827,0-1.14l2.284-2.278C4.308,1.417,4.821,1.417,5.135,1.73 L11.405,8c0.314,0.314,0.828,0.314,1.141,0.001l6.276-6.267c0.312-0.312,0.826-0.312,1.141,0L22.245,4.015z\"/></svg>';\n\n\tif((trueValueSet && value === formatterParams.trueValue) || (!trueValueSet && ((truthy && value) || (value === true || value === \"true\" || value === \"True\" || value === 1 || value === \"1\")))){\n\t\telement.setAttribute(\"aria-checked\", true);\n\t\treturn tick || \"\";\n\t}else {\n\t\tif(empty && (value === \"null\" || value === \"\" || value === null || typeof value === \"undefined\")){\n\t\t\telement.setAttribute(\"aria-checked\", \"mixed\");\n\t\t\treturn \"\";\n\t\t}else {\n\t\t\telement.setAttribute(\"aria-checked\", false);\n\t\t\treturn cross || \"\";\n\t\t}\n\t}\n}\n\nfunction datetime$1(cell, formatterParams, onRendered){\n\tvar DT = this.table.dependencyRegistry.lookup([\"luxon\", \"DateTime\"], \"DateTime\");\n\tvar inputFormat = formatterParams.inputFormat || \"yyyy-MM-dd HH:mm:ss\";\n\tvar\toutputFormat = formatterParams.outputFormat || \"dd/MM/yyyy HH:mm:ss\";\n\tvar\tinvalid = typeof formatterParams.invalidPlaceholder !== \"undefined\" ? formatterParams.invalidPlaceholder : \"\";\n\tvar value = cell.getValue();\n\n\tif(typeof DT != \"undefined\"){\n\t\tvar newDatetime;\n\n\t\tif(DT.isDateTime(value)){\n\t\t\tnewDatetime = value;\n\t\t}else if(inputFormat === \"iso\"){\n\t\t\tnewDatetime = DT.fromISO(String(value));\n\t\t}else {\n\t\t\tnewDatetime = DT.fromFormat(String(value), inputFormat);\n\t\t}\n\n\t\tif(newDatetime.isValid){\n\t\t\tif(formatterParams.timezone){\n\t\t\t\tnewDatetime = newDatetime.setZone(formatterParams.timezone);\n\t\t\t}\n\n\t\t\treturn newDatetime.toFormat(outputFormat);\n\t\t}else {\n\t\t\tif(invalid === true || !value){\n\t\t\t\treturn value;\n\t\t\t}else if(typeof invalid === \"function\"){\n\t\t\t\treturn invalid(value);\n\t\t\t}else {\n\t\t\t\treturn invalid;\n\t\t\t}\n\t\t}\n\t}else {\n\t\tconsole.error(\"Format Error - 'datetime' formatter is dependant on luxon.js\");\n\t}\n}\n\nfunction datetimediff (cell, formatterParams, onRendered) {\n\tvar DT = this.table.dependencyRegistry.lookup([\"luxon\", \"DateTime\"], \"DateTime\");\n\tvar inputFormat = formatterParams.inputFormat || \"yyyy-MM-dd HH:mm:ss\";\n\tvar invalid = typeof formatterParams.invalidPlaceholder !== \"undefined\" ? formatterParams.invalidPlaceholder : \"\";\n\tvar suffix = typeof formatterParams.suffix !== \"undefined\" ? formatterParams.suffix : false;\n\tvar unit = typeof formatterParams.unit !== \"undefined\" ? formatterParams.unit : \"days\";\n\tvar humanize = typeof formatterParams.humanize !== \"undefined\" ? formatterParams.humanize : false;\n\tvar date = typeof formatterParams.date !== \"undefined\" ? formatterParams.date : DT.now();\n\tvar value = cell.getValue();\n\n\tif(typeof DT != \"undefined\"){\n\t\tvar newDatetime;\n\n\t\tif(DT.isDateTime(value)){\n\t\t\tnewDatetime = value;\n\t\t}else if(inputFormat === \"iso\"){\n\t\t\tnewDatetime = DT.fromISO(String(value));\n\t\t}else {\n\t\t\tnewDatetime = DT.fromFormat(String(value), inputFormat);\n\t\t}\n\n\t\tif (newDatetime.isValid){\n\t\t\tif(humanize){\n\t\t\t\treturn newDatetime.diff(date, unit).toHuman() + (suffix ? \" \" + suffix : \"\");\n\t\t\t}else {\n\t\t\t\treturn parseInt(newDatetime.diff(date, unit)[unit]) + (suffix ? \" \" + suffix : \"\");\n\t\t\t}\n\t\t} else {\n\n\t\t\tif (invalid === true) {\n\t\t\t\treturn value;\n\t\t\t} else if (typeof invalid === \"function\") {\n\t\t\t\treturn invalid(value);\n\t\t\t} else {\n\t\t\t\treturn invalid;\n\t\t\t}\n\t\t}\n\t}else {\n\t\tconsole.error(\"Format Error - 'datetimediff' formatter is dependant on luxon.js\");\n\t}\n}\n\nfunction lookup (cell, formatterParams, onRendered) {\n\tvar value = cell.getValue();\n\n\tif (typeof formatterParams[value] === \"undefined\") {\n\t\tconsole.warn('Missing display value for ' + value);\n\t\treturn value;\n\t}\n\n\treturn formatterParams[value];\n}\n\nfunction star(cell, formatterParams, onRendered){\n\tvar value = cell.getValue(),\n\telement = cell.getElement(),\n\tmaxStars = formatterParams && formatterParams.stars ? formatterParams.stars : 5,\n\tstars = document.createElement(\"span\"),\n\tstar = document.createElementNS('http://www.w3.org/2000/svg', \"svg\"),\n\tstarActive = '<polygon fill=\"#FFEA00\" stroke=\"#C1AB60\" stroke-width=\"37.6152\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"259.216,29.942 330.27,173.919 489.16,197.007 374.185,309.08 401.33,467.31 259.216,392.612 117.104,467.31 144.25,309.08 29.274,197.007 188.165,173.919 \"/>',\n\tstarInactive = '<polygon fill=\"#D2D2D2\" stroke=\"#686868\" stroke-width=\"37.6152\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"259.216,29.942 330.27,173.919 489.16,197.007 374.185,309.08 401.33,467.31 259.216,392.612 117.104,467.31 144.25,309.08 29.274,197.007 188.165,173.919 \"/>';\n\n\t//style stars holder\n\tstars.style.verticalAlign = \"middle\";\n\n\t//style star\n\tstar.setAttribute(\"width\", \"14\");\n\tstar.setAttribute(\"height\", \"14\");\n\tstar.setAttribute(\"viewBox\", \"0 0 512 512\");\n\tstar.setAttribute(\"xml:space\", \"preserve\");\n\tstar.style.padding = \"0 1px\";\n\n\tvalue = value && !isNaN(value) ? parseInt(value) : 0;\n\n\tvalue = Math.max(0, Math.min(value, maxStars));\n\n\tfor(var i=1;i<= maxStars;i++){\n\t\tvar nextStar = star.cloneNode(true);\n\t\tnextStar.innerHTML = i <= value ? starActive : starInactive;\n\n\t\tstars.appendChild(nextStar);\n\t}\n\n\telement.style.whiteSpace = \"nowrap\";\n\telement.style.overflow = \"hidden\";\n\telement.style.textOverflow = \"ellipsis\";\n\n\telement.setAttribute(\"aria-label\", value);\n\n\treturn stars;\n}\n\nfunction traffic(cell, formatterParams, onRendered){\n\tvar value = this.sanitizeHTML(cell.getValue()) || 0,\n\tel = document.createElement(\"span\"),\n\tmax = formatterParams && formatterParams.max ? formatterParams.max : 100,\n\tmin = formatterParams && formatterParams.min ? formatterParams.min : 0,\n\tcolors = formatterParams && typeof formatterParams.color !== \"undefined\" ? formatterParams.color : [\"red\", \"orange\", \"green\"],\n\tcolor = \"#666666\",\n\tpercent, percentValue;\n\n\tif(isNaN(value) || typeof cell.getValue() === \"undefined\"){\n\t\treturn;\n\t}\n\n\tel.classList.add(\"tabulator-traffic-light\");\n\n\t//make sure value is in range\n\tpercentValue = parseFloat(value) <= max ? parseFloat(value) : max;\n\tpercentValue = parseFloat(percentValue) >= min ? parseFloat(percentValue) : min;\n\n\t//workout percentage\n\tpercent = (max - min) / 100;\n\tpercentValue = Math.round((percentValue - min) / percent);\n\n\t//set color\n\tswitch(typeof colors){\n\t\tcase \"string\":\n\t\t\tcolor = colors;\n\t\t\tbreak;\n\t\tcase \"function\":\n\t\t\tcolor = colors(value);\n\t\t\tbreak;\n\t\tcase \"object\":\n\t\t\tif(Array.isArray(colors)){\n\t\t\t\tvar unit = 100 / colors.length;\n\t\t\t\tvar index = Math.floor(percentValue / unit);\n\n\t\t\t\tindex = Math.min(index, colors.length - 1);\n\t\t\t\tindex = Math.max(index, 0);\n\t\t\t\tcolor = colors[index];\n\t\t\t\tbreak;\n\t\t\t}\n\t}\n\n\tel.style.backgroundColor = color;\n\n\treturn el;\n}\n\nfunction progress(cell, formatterParams = {}, onRendered){ //progress bar\n\tvar value = this.sanitizeHTML(cell.getValue()) || 0,\n\telement = cell.getElement(),\n\tmax = formatterParams.max ? formatterParams.max : 100,\n\tmin = formatterParams.min ? formatterParams.min : 0,\n\tlegendAlign = formatterParams.legendAlign ? formatterParams.legendAlign : \"center\",\n\tpercent, percentValue, color, legend, legendColor;\n\n\t//make sure value is in range\n\tpercentValue = parseFloat(value) <= max ? parseFloat(value) : max;\n\tpercentValue = parseFloat(percentValue) >= min ? parseFloat(percentValue) : min;\n\n\t//workout percentage\n\tpercent = (max - min) / 100;\n\tpercentValue = Math.round((percentValue - min) / percent);\n\n\t//set bar color\n\tswitch(typeof formatterParams.color){\n\t\tcase \"string\":\n\t\t\tcolor = formatterParams.color;\n\t\t\tbreak;\n\t\tcase \"function\":\n\t\t\tcolor = formatterParams.color(value);\n\t\t\tbreak;\n\t\tcase \"object\":\n\t\t\tif(Array.isArray(formatterParams.color)){\n\t\t\t\tlet unit = 100 / formatterParams.color.length;\n\t\t\t\tlet index = Math.floor(percentValue / unit);\n\n\t\t\t\tindex = Math.min(index, formatterParams.color.length - 1);\n\t\t\t\tindex = Math.max(index, 0);\n\t\t\t\tcolor = formatterParams.color[index];\n\t\t\t\tbreak;\n\t\t\t}\n\t\tdefault:\n\t\t\tcolor = \"#2DC214\";\n\t}\n\n\t//generate legend\n\tswitch(typeof formatterParams.legend){\n\t\tcase \"string\":\n\t\t\tlegend = formatterParams.legend;\n\t\t\tbreak;\n\t\tcase \"function\":\n\t\t\tlegend = formatterParams.legend(value);\n\t\t\tbreak;\n\t\tcase \"boolean\":\n\t\t\tlegend = value;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tlegend = false;\n\t}\n\n\t//set legend color\n\tswitch(typeof formatterParams.legendColor){\n\t\tcase \"string\":\n\t\t\tlegendColor = formatterParams.legendColor;\n\t\t\tbreak;\n\t\tcase \"function\":\n\t\t\tlegendColor = formatterParams.legendColor(value);\n\t\t\tbreak;\n\t\tcase \"object\":\n\t\t\tif(Array.isArray(formatterParams.legendColor)){\n\t\t\t\tlet unit = 100 / formatterParams.legendColor.length;\n\t\t\t\tlet index = Math.floor(percentValue / unit);\n\n\t\t\t\tindex = Math.min(index, formatterParams.legendColor.length - 1);\n\t\t\t\tindex = Math.max(index, 0);\n\t\t\t\tlegendColor = formatterParams.legendColor[index];\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tlegendColor = \"#000\";\n\t}\n\n\telement.style.minWidth = \"30px\";\n\telement.style.position = \"relative\";\n\n\telement.setAttribute(\"aria-label\", percentValue);\n\n\tvar barEl = document.createElement(\"div\");\n\tbarEl.style.display = \"inline-block\";\n\tbarEl.style.width = percentValue + \"%\";\n\tbarEl.style.backgroundColor = color;\n\tbarEl.style.height = \"100%\";\n\n\tbarEl.setAttribute('data-max', max);\n\tbarEl.setAttribute('data-min', min);\n\n\tvar barContainer = document.createElement(\"div\");\n\tbarContainer.style.position = \"relative\";\n\tbarContainer.style.width = \"100%\";\n\tbarContainer.style.height = \"100%\";\n\n\tif(legend){\n\t\tvar legendEl = document.createElement(\"div\");\n\t\tlegendEl.style.position = \"absolute\";\n\t\tlegendEl.style.top = 0;\n\t\tlegendEl.style.left = 0;\n\t\tlegendEl.style.textAlign = legendAlign;\n\t\tlegendEl.style.width = \"100%\";\n\t\tlegendEl.style.color = legendColor;\n\t\tlegendEl.innerHTML = legend;\n\t}\n\n\tonRendered(function(){\n\n\t\t//handle custom element needed if formatter is to be included in printed/downloaded output\n\t\tif(!(cell instanceof CellComponent)){\n\t\t\tvar holderEl = document.createElement(\"div\");\n\t\t\tholderEl.style.position = \"absolute\";\n\t\t\tholderEl.style.top = \"4px\";\n\t\t\tholderEl.style.bottom = \"4px\";\n\t\t\tholderEl.style.left = \"4px\";\n\t\t\tholderEl.style.right = \"4px\";\n\n\t\t\telement.appendChild(holderEl);\n\n\t\t\telement = holderEl;\n\t\t}\n\n\t\telement.appendChild(barContainer);\n\t\tbarContainer.appendChild(barEl);\n\n\t\tif(legend){\n\t\t\tbarContainer.appendChild(legendEl);\n\t\t}\n\t});\n\n\treturn \"\";\n}\n\nfunction color(cell, formatterParams, onRendered){\n\tcell.getElement().style.backgroundColor = this.sanitizeHTML(cell.getValue());\n\treturn \"\";\n}\n\nfunction buttonTick(cell, formatterParams, onRendered){\n\treturn '<svg enable-background=\"new 0 0 24 24\" height=\"14\" width=\"14\" viewBox=\"0 0 24 24\" xml:space=\"preserve\" ><path fill=\"#2DC214\" clip-rule=\"evenodd\" d=\"M21.652,3.211c-0.293-0.295-0.77-0.295-1.061,0L9.41,14.34 c-0.293,0.297-0.771,0.297-1.062,0L3.449,9.351C3.304,9.203,3.114,9.13,2.923,9.129C2.73,9.128,2.534,9.201,2.387,9.351 l-2.165,1.946C0.078,11.445,0,11.63,0,11.823c0,0.194,0.078,0.397,0.223,0.544l4.94,5.184c0.292,0.296,0.771,0.776,1.062,1.07 l2.124,2.141c0.292,0.293,0.769,0.293,1.062,0l14.366-14.34c0.293-0.294,0.293-0.777,0-1.071L21.652,3.211z\" fill-rule=\"evenodd\"/></svg>';\n}\n\nfunction buttonCross(cell, formatterParams, onRendered){\n\treturn '<svg enable-background=\"new 0 0 24 24\" height=\"14\" width=\"14\" viewBox=\"0 0 24 24\" xml:space=\"preserve\" ><path fill=\"#CE1515\" d=\"M22.245,4.015c0.313,0.313,0.313,0.826,0,1.139l-6.276,6.27c-0.313,0.312-0.313,0.826,0,1.14l6.273,6.272 c0.313,0.313,0.313,0.826,0,1.14l-2.285,2.277c-0.314,0.312-0.828,0.312-1.142,0l-6.271-6.271c-0.313-0.313-0.828-0.313-1.141,0 l-6.276,6.267c-0.313,0.313-0.828,0.313-1.141,0l-2.282-2.28c-0.313-0.313-0.313-0.826,0-1.14l6.278-6.269 c0.313-0.312,0.313-0.826,0-1.14L1.709,5.147c-0.314-0.313-0.314-0.827,0-1.14l2.284-2.278C4.308,1.417,4.821,1.417,5.135,1.73 L11.405,8c0.314,0.314,0.828,0.314,1.141,0.001l6.276-6.267c0.312-0.312,0.826-0.312,1.141,0L22.245,4.015z\"/></svg>';\n}\n\nfunction toggle(cell, formatterParams, onRendered){\r\n\tvar value = cell.getValue(),\r\n\tsize = formatterParams.size ||15,\r\n\tsizePx = size + \"px\",\r\n\tcontainEl, switchEl,\r\n\tonValue = formatterParams.hasOwnProperty(\"onValue\") ? formatterParams.onValue : true,\r\n\toffValue = formatterParams.hasOwnProperty(\"offValue\") ? formatterParams.offValue : false,\r\n\r\n\r\n\tstate = formatterParams.onTruthy ? value : value === onValue;\r\n\r\n\t\r\n\tcontainEl = document.createElement(\"div\");\r\n\tcontainEl.classList.add(\"tabulator-toggle\");\r\n\r\n\tif(state){\r\n\t\tcontainEl.classList.add(\"tabulator-toggle-on\");\r\n\t\tcontainEl.style.flexDirection = \"row-reverse\";\r\n\r\n\t\tif(formatterParams.onColor){\r\n\t\t\tcontainEl.style.background = formatterParams.onColor;\r\n\t\t}\r\n\t}else {\r\n\t\tif(formatterParams.offColor){\r\n\t\t\tcontainEl.style.background = formatterParams.offColor;\r\n\t\t}\r\n\t}\r\n\r\n\tcontainEl.style.width = (2.5 * size) + \"px\";\r\n\tcontainEl.style.borderRadius = sizePx;\r\n\r\n\tif(formatterParams.clickable){\r\n\t\tcontainEl.addEventListener(\"click\", (e) => {\r\n\t\t\tcell.setValue(state ? offValue : onValue);\r\n\t\t});\r\n\t}\r\n\r\n\tswitchEl = document.createElement(\"div\");\r\n\tswitchEl.classList.add(\"tabulator-toggle-switch\");\r\n\r\n\tswitchEl.style.height = sizePx;\r\n\tswitchEl.style.width = sizePx;\r\n\tswitchEl.style.borderRadius = sizePx;\r\n\t\r\n\tcontainEl.appendChild(switchEl);\r\n\t\r\n\treturn containEl;\r\n}\n\nfunction rownum(cell, formatterParams, onRendered){\n\tvar content = document.createElement(\"span\");\n\tvar row = cell.getRow();\n\tvar table = cell.getTable();\n\n\trow.watchPosition((position) => {\n\t\tif (formatterParams.relativeToPage) {\n\t\t\tposition += table.modules.page.getPageSize() * (table.modules.page.getPage() - 1);\n\t\t}\n\t\tcontent.innerText = position;\n\t});\n\t\n\treturn content;\n}\n\nfunction handle(cell, formatterParams, onRendered){\n\tcell.getElement().classList.add(\"tabulator-row-handle\");\n\treturn \"<div class='tabulator-row-handle-box'><div class='tabulator-row-handle-bar'></div><div class='tabulator-row-handle-bar'></div><div class='tabulator-row-handle-bar'></div></div>\";\n}\n\nfunction adaptable(cell, params, onRendered){\r\n\tvar lookup, formatterFunc, formatterParams;\r\n \r\n\tfunction defaultLookup(cell){\r\n\t\tvar value = cell.getValue(),\r\n\t\tformatter = \"plaintext\";\r\n \r\n\t\tswitch(typeof value){ \r\n\t\t\tcase \"boolean\":\r\n\t\t\t\tformatter = \"tickCross\";\r\n\t\t\t\tbreak;\r\n \r\n\t\t\tcase \"string\":\r\n\t\t\t\tif(value.includes(\"\\n\")){\r\n\t\t\t\t\tformatter = \"textarea\";\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n \r\n\t\treturn formatter;\r\n\t}\r\n \r\n\tlookup = params.formatterLookup ? params.formatterLookup(cell) : defaultLookup(cell);\r\n\r\n\tif(params.paramsLookup){\r\n\t\tformatterParams = typeof params.paramsLookup === \"function\" ? params.paramsLookup(lookup, cell) : params.paramsLookup[lookup];\r\n\t}\r\n\r\n\tformatterFunc = this.table.modules.format.lookupFormatter(lookup);\r\n \r\n\treturn formatterFunc.call(this, cell, formatterParams || {}, onRendered);\r\n}\n\nfunction array$2(cell, formatterParams, onRendered){\n\tvar delimiter = formatterParams.delimiter || \",\",\n\tvalue = cell.getValue(),\n\ttable = this.table,\n\tvalueMap;\n\t\n\tif(formatterParams.valueMap){\n\t\tif(typeof formatterParams.valueMap === \"string\"){\n\t\t\tvalueMap = function(value){\n\t\t\t\treturn value.map((item) => {\n\t\t\t\t\treturn Helpers.retrieveNestedData(table.options.nestedFieldSeparator, formatterParams.valueMap, item);\n\t\t\t\t});\n\t\t\t};\n\t\t}else {\n\t\t\tvalueMap = formatterParams.valueMap;\n\t\t}\n\t}\n\n\tif(Array.isArray(value)){\n\t\tif(valueMap){\n\t\t\tvalue = valueMap(value);\n\t\t}\n\n\t\treturn value.join(delimiter);\n\t}else {\n\t\treturn value;\n\t}\n}\n\nfunction json$1(cell, formatterParams, onRendered){\n\tvar indent = formatterParams.indent || \"\\t\",\n\tmultiline = typeof formatterParams.multiline === \"undefined\" ? true : formatterParams.multiline,\n\treplacer = formatterParams.replacer || null,\n\tvalue = cell.getValue();\n\t\n\tif(multiline){\n\t\tcell.getElement().style.whiteSpace = \"pre-wrap\";\n\t}\n\n\treturn JSON.stringify(value, replacer, indent);\n}\n\nvar defaultFormatters = {\n\tplaintext:plaintext,\n\thtml:html,\n\ttextarea:textarea,\n\tmoney:money,\n\tlink:link,\n\timage:image,\n\ttickCross:tickCross,\n\tdatetime:datetime$1,\n\tdatetimediff:datetimediff,\n\tlookup:lookup,\n\tstar:star,\n\ttraffic:traffic,\n\tprogress:progress,\n\tcolor:color,\n\tbuttonTick:buttonTick,\n\tbuttonCross:buttonCross,\n\ttoggle:toggle,\n\trownum:rownum,\n\thandle:handle,\n\tadaptable:adaptable,\n\tarray:array$2,\n\tjson:json$1,\n};\n\nclass Format extends Module{\n\t\n\tstatic moduleName = \"format\";\n\t\n\t//load defaults\n\tstatic formatters = defaultFormatters;\n\t\n\tconstructor(table){\n\t\tsuper(table);\n\t\t\n\t\tthis.registerColumnOption(\"formatter\");\n\t\tthis.registerColumnOption(\"formatterParams\");\n\t\t\n\t\tthis.registerColumnOption(\"formatterPrint\");\n\t\tthis.registerColumnOption(\"formatterPrintParams\");\n\t\tthis.registerColumnOption(\"formatterClipboard\");\n\t\tthis.registerColumnOption(\"formatterClipboardParams\");\n\t\tthis.registerColumnOption(\"formatterHtmlOutput\");\n\t\tthis.registerColumnOption(\"formatterHtmlOutputParams\");\n\t\tthis.registerColumnOption(\"titleFormatter\");\n\t\tthis.registerColumnOption(\"titleFormatterParams\");\n\t}\n\t\n\tinitialize(){\n\t\tthis.subscribe(\"cell-format\", this.formatValue.bind(this));\n\t\tthis.subscribe(\"cell-rendered\", this.cellRendered.bind(this));\n\t\tthis.subscribe(\"column-layout\", this.initializeColumn.bind(this));\n\t\tthis.subscribe(\"column-format\", this.formatHeader.bind(this));\n\t}\n\t\n\t//initialize column formatter\n\tinitializeColumn(column){\n\t\tcolumn.modules.format = this.lookupTypeFormatter(column, \"\");\n\t\t\n\t\tif(typeof column.definition.formatterPrint !== \"undefined\"){\n\t\t\tcolumn.modules.format.print = this.lookupTypeFormatter(column, \"Print\");\n\t\t}\n\t\t\n\t\tif(typeof column.definition.formatterClipboard !== \"undefined\"){\n\t\t\tcolumn.modules.format.clipboard = this.lookupTypeFormatter(column, \"Clipboard\");\n\t\t}\n\t\t\n\t\tif(typeof column.definition.formatterHtmlOutput !== \"undefined\"){\n\t\t\tcolumn.modules.format.htmlOutput = this.lookupTypeFormatter(column, \"HtmlOutput\");\n\t\t}\n\t}\n\t\n\tlookupTypeFormatter(column, type){\n\t\tvar config = {params:column.definition[\"formatter\" + type + \"Params\"] || {}},\n\t\tformatter = column.definition[\"formatter\" + type];\n\t\t\n\t\tconfig.formatter = this.lookupFormatter(formatter);\n\t\t\n\t\treturn config;\n\t}\n\t\n\t\n\tlookupFormatter(formatter){\n\t\tvar formatterFunc;\n\n\t\t//set column formatter\n\t\tswitch(typeof formatter){\n\t\t\tcase \"string\":\n\t\t\t\tif(Format.formatters[formatter]){\n\t\t\t\t\tformatterFunc = Format.formatters[formatter];\n\t\t\t\t}else {\n\t\t\t\t\tconsole.warn(\"Formatter Error - No such formatter found: \", formatter);\n\t\t\t\t\tformatterFunc = Format.formatters.plaintext;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase \"function\":\n\t\t\t\tformatterFunc = formatter;\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tdefault:\n\t\t\t\tformatterFunc = Format.formatters.plaintext;\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\treturn formatterFunc;\n\t}\n\t\n\tcellRendered(cell){\n\t\tif(cell.modules.format && cell.modules.format.renderedCallback && !cell.modules.format.rendered){\n\t\t\tcell.modules.format.renderedCallback();\n\t\t\tcell.modules.format.rendered = true;\n\t\t}\n\t}\n\t\n\t//return a formatted value for a column header\n\tformatHeader(column, title, el){\n\t\tvar formatter, params, onRendered, mockCell;\n\t\t\n\t\tif(column.definition.titleFormatter){\n\t\t\tformatter = this.lookupFormatter(column.definition.titleFormatter);\n\t\t\t\n\t\t\tonRendered = (callback) => {\n\t\t\t\tcolumn.titleFormatterRendered = callback;\n\t\t\t};\n\t\t\t\n\t\t\tmockCell = {\n\t\t\t\tgetValue:function(){\n\t\t\t\t\treturn title;\n\t\t\t\t},\n\t\t\t\tgetElement:function(){\n\t\t\t\t\treturn el;\n\t\t\t\t},\n\t\t\t\tgetType:function(){\n\t\t\t\t\treturn \"header\";\n\t\t\t\t},\n\t\t\t\tgetColumn:function(){\n\t\t\t\t\treturn column.getComponent();\n\t\t\t\t},\n\t\t\t\tgetTable:() => {\n\t\t\t\t\treturn this.table;\n\t\t\t\t}\n\t\t\t};\n\t\t\t\n\t\t\tparams = column.definition.titleFormatterParams || {};\n\t\t\t\n\t\t\tparams = typeof params === \"function\" ? params() : params;\n\t\t\t\n\t\t\treturn formatter.call(this, mockCell, params, onRendered);\n\t\t}else {\n\t\t\treturn title;\n\t\t}\n\t}\n\t\n\t\n\t//return a formatted value for a cell\n\tformatValue(cell){\n\t\tvar component = cell.getComponent(),\n\t\tparams = typeof cell.column.modules.format.params === \"function\" ? cell.column.modules.format.params(component) : cell.column.modules.format.params;\n\t\t\n\t\tfunction onRendered(callback){\n\t\t\tif(!cell.modules.format){\n\t\t\t\tcell.modules.format = {};\n\t\t\t}\n\t\t\t\n\t\t\tcell.modules.format.renderedCallback = callback;\n\t\t\tcell.modules.format.rendered = false;\n\t\t}\n\t\t\n\t\treturn cell.column.modules.format.formatter.call(this, component, params, onRendered);\n\t}\n\t\n\tformatExportValue(cell, type){\n\t\tvar formatter = cell.column.modules.format[type],\n\t\tparams;\n\t\t\n\t\tif(formatter){\n\t\t\tparams = typeof formatter.params === \"function\" ? formatter.params(cell.getComponent()) : formatter.params;\n\t\t\t\n\t\t\tfunction onRendered(callback){\n\t\t\t\tif(!cell.modules.format){\n\t\t\t\t\tcell.modules.format = {};\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tcell.modules.format.renderedCallback = callback;\n\t\t\t\tcell.modules.format.rendered = false;\n\t\t\t}\n\t\t\t\n\t\t\treturn formatter.formatter.call(this, cell.getComponent(), params, onRendered);\n\t\t\t\n\t\t}else {\n\t\t\treturn this.formatValue(cell);\n\t\t}\n\t}\n\t\n\tsanitizeHTML(value){\n\t\tif(value){\n\t\t\tvar entityMap = {\n\t\t\t\t'&': '&amp;',\n\t\t\t\t'<': '&lt;',\n\t\t\t\t'>': '&gt;',\n\t\t\t\t'\"': '&quot;',\n\t\t\t\t\"'\": '&#39;',\n\t\t\t\t'/': '&#x2F;',\n\t\t\t\t'`': '&#x60;',\n\t\t\t\t'=': '&#x3D;'\n\t\t\t};\n\t\t\t\n\t\t\treturn String(value).replace(/[&<>\"'`=/]/g, function (s) {\n\t\t\t\treturn entityMap[s];\n\t\t\t});\n\t\t}else {\n\t\t\treturn value;\n\t\t}\n\t}\n\t\n\temptyToSpace(value){\n\t\treturn value === null || typeof value === \"undefined\" || value === \"\" ? \"&nbsp;\" : value;\n\t}\n\t\n}\n\nclass FrozenColumns extends Module{\n\n\tstatic moduleName = \"frozenColumns\";\n\t\n\tconstructor(table){\n\t\tsuper(table);\n\t\t\n\t\tthis.leftColumns = [];\n\t\tthis.rightColumns = [];\n\t\tthis.initializationMode = \"left\";\n\t\tthis.active = false;\n\t\tthis.blocked = true;\n\t\t\n\t\tthis.registerColumnOption(\"frozen\");\n\t}\n\t\n\t//reset initial state\n\treset(){\n\t\tthis.initializationMode = \"left\";\n\t\tthis.leftColumns = [];\n\t\tthis.rightColumns = [];\n\t\tthis.active = false;\n\t}\n\t\n\tinitialize(){\n\t\tthis.subscribe(\"cell-layout\", this.layoutCell.bind(this));\n\t\tthis.subscribe(\"column-init\", this.initializeColumn.bind(this));\n\t\tthis.subscribe(\"column-width\", this.layout.bind(this));\n\t\tthis.subscribe(\"row-layout-after\", this.layoutRow.bind(this));\n\t\tthis.subscribe(\"table-layout\", this.layout.bind(this));\n\t\tthis.subscribe(\"columns-loading\", this.reset.bind(this));\n\t\t\n\t\tthis.subscribe(\"column-add\", this.reinitializeColumns.bind(this));\n\t\tthis.subscribe(\"column-deleted\", this.reinitializeColumns.bind(this));\n\t\tthis.subscribe(\"column-hide\", this.reinitializeColumns.bind(this));\n\t\tthis.subscribe(\"column-show\", this.reinitializeColumns.bind(this));\n\t\tthis.subscribe(\"columns-loaded\", this.reinitializeColumns.bind(this));\n\t\t\n\t\tthis.subscribe(\"table-redraw\", this.layout.bind(this));\n\t\tthis.subscribe(\"layout-refreshing\", this.blockLayout.bind(this));\n\t\tthis.subscribe(\"layout-refreshed\", this.unblockLayout.bind(this));\n\t\tthis.subscribe(\"scrollbar-vertical\", this.adjustForScrollbar.bind(this));\n\t}\n\t\n\tblockLayout(){\n\t\tthis.blocked = true;\n\t}\n\t\n\tunblockLayout(){\n\t\tthis.blocked = false;\n\t}\n\t\n\tlayoutCell(cell){\n\t\tthis.layoutElement(cell.element, cell.column);\n\t}\n\t\n\treinitializeColumns(){\n\t\tthis.reset();\n\t\t\n\t\tthis.table.columnManager.columnsByIndex.forEach((column) => {\n\t\t\tthis.initializeColumn(column);\n\t\t});\n\n\t\tthis.layout();\n\t}\n\t\n\t//initialize specific column\n\tinitializeColumn(column){\n\t\tvar config = {margin:0, edge:false};\n\t\t\n\t\tif(!column.isGroup){\t\t\t\n\t\t\tif(this.frozenCheck(column)){\n\t\t\t\tconfig.position = this.initializationMode;\n\t\t\t\t\n\t\t\t\tif(this.initializationMode == \"left\"){\n\t\t\t\t\tthis.leftColumns.push(column);\n\t\t\t\t}else {\n\t\t\t\t\tthis.rightColumns.unshift(column);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.active = true;\n\t\t\t\t\n\t\t\t\tcolumn.modules.frozen = config;\n\t\t\t}else {\n\t\t\t\tthis.initializationMode = \"right\";\n\t\t\t}\n\t\t}\n\t}\n\t\n\tfrozenCheck(column){\n\t\tif(column.parent.isGroup && column.definition.frozen){\n\t\t\tconsole.warn(\"Frozen Column Error - Parent column group must be frozen, not individual columns or sub column groups\");\n\t\t}\n\t\t\n\t\tif(column.parent.isGroup){\n\t\t\treturn this.frozenCheck(column.parent);\n\t\t}else {\n\t\t\treturn column.definition.frozen;\n\t\t}\n\t}\n\t\n\t//layout calculation rows\n\tlayoutCalcRows(){\n\t\tif(this.table.modExists(\"columnCalcs\")){\n\t\t\tif(this.table.modules.columnCalcs.topInitialized && this.table.modules.columnCalcs.topRow){\n\t\t\t\tthis.layoutRow(this.table.modules.columnCalcs.topRow);\n\t\t\t}\n\t\t\t\n\t\t\tif(this.table.modules.columnCalcs.botInitialized && this.table.modules.columnCalcs.botRow){\n\t\t\t\tthis.layoutRow(this.table.modules.columnCalcs.botRow);\n\t\t\t}\n\t\t\t\n\t\t\tif(this.table.modExists(\"groupRows\")){\n\t\t\t\tthis.layoutGroupCalcs(this.table.modules.groupRows.getGroups());\n\t\t\t}\n\t\t}\n\t}\n\t\n\tlayoutGroupCalcs(groups){\n\t\tgroups.forEach((group) => {\n\t\t\tif(group.calcs.top){\n\t\t\t\tthis.layoutRow(group.calcs.top);\n\t\t\t}\n\t\t\t\n\t\t\tif(group.calcs.bottom){\n\t\t\t\tthis.layoutRow(group.calcs.bottom);\n\t\t\t}\n\t\t\t\n\t\t\tif(group.groupList && group.groupList.length){\n\t\t\t\tthis.layoutGroupCalcs(group.groupList);\n\t\t\t}\n\t\t});\n\t}\n\t\n\t//calculate column positions and layout headers\n\tlayoutColumnPosition(allCells){\n\t\tvar leftParents = [];\n\t\t\n\t\tvar leftMargin = 0;\n\t\tvar rightMargin = 0;\n\t\t\n\t\tthis.leftColumns.forEach((column, i) => {\t\n\t\t\tcolumn.modules.frozen.marginValue = leftMargin;\n\t\t\tcolumn.modules.frozen.margin = column.modules.frozen.marginValue + \"px\";\n\t\t\t\n\t\t\tif(column.visible){\n\t\t\t\tleftMargin += column.getWidth();\n\t\t\t}\n\t\t\t\n\t\t\tif(i == this.leftColumns.length - 1){\n\t\t\t\tcolumn.modules.frozen.edge = true;\n\t\t\t}else {\n\t\t\t\tcolumn.modules.frozen.edge = false;\n\t\t\t}\n\t\t\t\n\t\t\tif(column.parent.isGroup){\n\t\t\t\tvar parentEl = this.getColGroupParentElement(column);\n\t\t\t\tif(!leftParents.includes(parentEl)){\n\t\t\t\t\tthis.layoutElement(parentEl, column);\n\t\t\t\t\tleftParents.push(parentEl);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tparentEl.classList.toggle(\"tabulator-frozen-left\", column.modules.frozen.edge && column.modules.frozen.position === \"left\");\n\t\t\t\tparentEl.classList.toggle(\"tabulator-frozen-right\", column.modules.frozen.edge && column.modules.frozen.position === \"right\");\n\t\t\t}else {\n\t\t\t\tthis.layoutElement(column.getElement(), column);\n\t\t\t}\n\t\t\t\n\t\t\tif(allCells){\n\t\t\t\tcolumn.cells.forEach((cell) => {\n\t\t\t\t\tthis.layoutElement(cell.getElement(true), column);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t\n\t\tthis.rightColumns.forEach((column, i) => {\n\t\t\t\n\t\t\tcolumn.modules.frozen.marginValue = rightMargin;\n\t\t\tcolumn.modules.frozen.margin = column.modules.frozen.marginValue + \"px\";\n\t\t\t\n\t\t\tif(column.visible){\n\t\t\t\trightMargin += column.getWidth();\n\t\t\t}\n\t\t\t\n\t\t\tif(i == this.rightColumns.length - 1){\n\t\t\t\tcolumn.modules.frozen.edge = true;\n\t\t\t}else {\n\t\t\t\tcolumn.modules.frozen.edge = false;\n\t\t\t}\n\t\t\t\n\t\t\tif(column.parent.isGroup){\n\t\t\t\tthis.layoutElement(this.getColGroupParentElement(column), column);\n\t\t\t}else {\n\t\t\t\tthis.layoutElement(column.getElement(), column);\n\t\t\t}\n\t\t\t\n\t\t\tif(allCells){\n\t\t\t\tcolumn.cells.forEach((cell) => {\n\t\t\t\t\tthis.layoutElement(cell.getElement(true), column);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\t\n\tgetColGroupParentElement(column){\n\t\treturn column.parent.isGroup ? this.getColGroupParentElement(column.parent) : column.getElement();\n\t}\n\t\n\t//layout columns appropriately\n\tlayout(){\t\n\t\tif(this.active && !this.blocked){\n\t\t\t//calculate left columns\n\t\t\tthis.layoutColumnPosition();\n\t\t\t\n\t\t\tthis.reinitializeRows();\n\t\t\t\n\t\t\tthis.layoutCalcRows();\n\t\t}\n\t}\n\t\n\treinitializeRows(){\n\t\tvar visibleRows = this.table.rowManager.getVisibleRows(true);\n\t\tvar otherRows = this.table.rowManager.getRows().filter(row => !visibleRows.includes(row));\n\t\t\n\t\totherRows.forEach((row) =>{\n\t\t\trow.deinitialize();\n\t\t});\n\t\t\n\t\tvisibleRows.forEach((row) =>{\n\t\t\tif(row.type === \"row\"){\n\t\t\t\tthis.layoutRow(row);\n\t\t\t}\n\t\t});\n\t}\n\t\n\tlayoutRow(row){\n\t\tif(this.table.options.layout === \"fitDataFill\" && this.rightColumns.length){\n\t\t\tthis.table.rowManager.getTableElement().style.minWidth = \"calc(100% - \" + this.rightMargin + \")\";\n\t\t}\n\t\t\n\t\tthis.leftColumns.forEach((column) => {\n\t\t\tvar cell = row.getCell(column);\n\t\t\t\n\t\t\tif(cell){\n\t\t\t\tthis.layoutElement(cell.getElement(true), column);\n\t\t\t}\n\t\t});\n\t\t\n\t\tthis.rightColumns.forEach((column) => {\n\t\t\tvar cell = row.getCell(column);\n\t\t\t\n\t\t\tif(cell){\n\t\t\t\tthis.layoutElement(cell.getElement(true), column);\n\t\t\t}\n\t\t});\n\t}\n\t\n\tlayoutElement(element, column){\n\t\tvar position;\n\t\t\n\t\tif(column.modules.frozen && element){\n\t\t\telement.style.position = \"sticky\";\n\n\t\t\tif(this.table.rtl){\n\t\t\t\tposition = column.modules.frozen.position === \"left\" ? \"right\" : \"left\";\n\t\t\t}else {\n\t\t\t\tposition = column.modules.frozen.position;\n\t\t\t}\n\t\t\n\t\t\telement.style[position] = column.modules.frozen.margin;\n\n\t\t\telement.classList.add(\"tabulator-frozen\");\n\t\t\t\n\t\t\telement.classList.toggle(\"tabulator-frozen-left\", column.modules.frozen.edge && column.modules.frozen.position === \"left\");\n\t\t\telement.classList.toggle(\"tabulator-frozen-right\", column.modules.frozen.edge && column.modules.frozen.position === \"right\");\n\t\t}\n\t}\n\n\tadjustForScrollbar(width){\n\t\tif(this.rightColumns.length){\n\t\t\tthis.table.columnManager.getContentsElement().style.width = \"calc(100% - \" + width + \"px)\";\n\t\t}\n\t}\n\n\tgetFrozenColumns(){\n\t\treturn this.leftColumns.concat(this.rightColumns);\n\t}\n\t\n\t_calcSpace(columns, index){\n\t\tvar width = 0;\n\t\t\n\t\tfor (let i = 0; i < index; i++){\n\t\t\tif(columns[i].visible){\n\t\t\t\twidth += columns[i].getWidth();\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn width;\n\t}\n}\n\nclass FrozenRows extends Module{\n\n\tstatic moduleName = \"frozenRows\";\n\n\tconstructor(table){\n\t\tsuper(table);\n\n\t\tthis.topElement = document.createElement(\"div\");\n\t\tthis.rows = [];\n\n\t\t//register component functions\n\t\tthis.registerComponentFunction(\"row\", \"freeze\", this.freezeRow.bind(this));\n\t\tthis.registerComponentFunction(\"row\", \"unfreeze\", this.unfreezeRow.bind(this));\n\t\tthis.registerComponentFunction(\"row\", \"isFrozen\", this.isRowFrozen.bind(this));\n\n\t\t//register table options\n\t\tthis.registerTableOption(\"frozenRowsField\", \"id\"); //field to choose frozen rows by\n\t\tthis.registerTableOption(\"frozenRows\", false); //holder for frozen row identifiers\n\t}\n\n\tinitialize(){\n\t\tvar\tfragment = document.createDocumentFragment();\n\t\t\n\t\tthis.rows = [];\n\n\t\tthis.topElement.classList.add(\"tabulator-frozen-rows-holder\");\n\t\t\n\t\tfragment.appendChild(document.createElement(\"br\"));\n\t\tfragment.appendChild(this.topElement);\n\n\t\t// this.table.columnManager.element.append(this.topElement);\n\t\tthis.table.columnManager.getContentsElement().insertBefore(fragment, this.table.columnManager.headersElement.nextSibling);\n\n\t\tthis.subscribe(\"row-deleting\", this.detachRow.bind(this));\n\t\tthis.subscribe(\"rows-visible\", this.visibleRows.bind(this));\n\n\t\tthis.registerDisplayHandler(this.getRows.bind(this), 10);\n\n\t\tif(this.table.options.frozenRows){\n\t\t\tthis.subscribe(\"data-processed\", this.initializeRows.bind(this));\n\t\t\tthis.subscribe(\"row-added\", this.initializeRow.bind(this));\n\t\t\tthis.subscribe(\"table-redrawing\", this.resizeHolderWidth.bind(this));\n\t\t\tthis.subscribe(\"column-resized\", this.resizeHolderWidth.bind(this));\n\t\t\tthis.subscribe(\"column-show\", this.resizeHolderWidth.bind(this));\n\t\t\tthis.subscribe(\"column-hide\", this.resizeHolderWidth.bind(this));\n\t\t}\n\n\t\tthis.resizeHolderWidth();\n\t}\n\n\tresizeHolderWidth(){\n\t\tthis.topElement.style.minWidth = this.table.columnManager.headersElement.offsetWidth + \"px\";\n\t}\n\n\tinitializeRows(){\n\t\tthis.table.rowManager.getRows().forEach((row) => {\n\t\t\tthis.initializeRow(row);\n\t\t});\n\t}\n\n\tinitializeRow(row){\n\t\tvar frozenRows = this.table.options.frozenRows,\n\t\trowType = typeof frozenRows;\n\n\t\tif(rowType === \"number\"){\n\t\t\tif(row.getPosition() && (row.getPosition() + this.rows.length) <= frozenRows){\n\t\t\t\tthis.freezeRow(row);\n\t\t\t}\n\t\t}else if(rowType === \"function\"){\n\t\t\tif(frozenRows.call(this.table, row.getComponent())){\n\t\t\t\tthis.freezeRow(row);\n\t\t\t}\n\t\t}else if(Array.isArray(frozenRows)){\n\t\t\tif(frozenRows.includes(row.data[this.options(\"frozenRowsField\")])){\n\t\t\t\tthis.freezeRow(row);\n\t\t\t}\n\t\t}\n\t}\n\n\tisRowFrozen(row){\n\t\tvar index = this.rows.indexOf(row);\n\t\treturn index > -1;\n\t}\n\n\tisFrozen(){\n\t\treturn !!this.rows.length;\n\t}\n\n\tvisibleRows(viewable, rows){\n\t\tthis.rows.forEach((row) => {\n\t\t\trows.push(row);\n\t\t});\n\n\t\treturn rows;\n\t}\n\n\t//filter frozen rows out of display data\n\tgetRows(rows){\n\t\tvar output = rows.slice(0);\n\n\t\tthis.rows.forEach(function(row){\n\t\t\tvar index = output.indexOf(row);\n\n\t\t\tif(index > -1){\n\t\t\t\toutput.splice(index, 1);\n\t\t\t}\n\t\t});\n\n\t\treturn output;\n\t}\n\n\tfreezeRow(row){\n\t\tif(!row.modules.frozen){\n\t\t\trow.modules.frozen = true;\n\t\t\tthis.topElement.appendChild(row.getElement());\n\t\t\trow.initialize();\n\t\t\trow.normalizeHeight();\n\t\t\n\t\t\tthis.rows.push(row);\n\n\t\t\tthis.refreshData(false, \"display\");\n\n\t\t\tthis.table.rowManager.adjustTableSize();\n\n\t\t\tthis.styleRows();\n\n\t\t}else {\n\t\t\tconsole.warn(\"Freeze Error - Row is already frozen\");\n\t\t}\n\t}\n\n\tunfreezeRow(row){\n\t\tif(row.modules.frozen){\n\n\t\t\trow.modules.frozen = false;\n\n\t\t\tthis.detachRow(row);\n\n\t\t\tthis.table.rowManager.adjustTableSize();\n\n\t\t\tthis.refreshData(false, \"display\");\n\n\t\t\tif(this.rows.length){\n\t\t\t\tthis.styleRows();\n\t\t\t}\n\n\t\t}else {\n\t\t\tconsole.warn(\"Freeze Error - Row is already unfrozen\");\n\t\t}\n\t}\n\n\tdetachRow(row){\n\t\tvar index = this.rows.indexOf(row);\n\n\t\tif(index > -1){\n\t\t\tvar rowEl = row.getElement();\n\n\t\t\tif(rowEl.parentNode){\n\t\t\t\trowEl.parentNode.removeChild(rowEl);\n\t\t\t}\n\n\t\t\tthis.rows.splice(index, 1);\n\t\t}\n\t}\n\n\tstyleRows(row){\n\t\tthis.rows.forEach((row, i) => {\n\t\t\tthis.table.rowManager.styleRow(row, i);\n\t\t});\n\t}\n}\n\n//public group object\nclass GroupComponent {\n\tconstructor (group){\n\t\tthis._group = group;\n\t\tthis.type = \"GroupComponent\";\n\n\t\treturn new Proxy(this, {\n\t\t\tget: function(target, name, receiver) {\n\t\t\t\tif (typeof target[name] !== \"undefined\") {\n\t\t\t\t\treturn target[name];\n\t\t\t\t}else {\n\t\t\t\t\treturn target._group.groupManager.table.componentFunctionBinder.handle(\"group\", target._group, name);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tgetKey(){\n\t\treturn this._group.key;\n\t}\n\n\tgetField(){\n\t\treturn this._group.field;\n\t}\n\n\tgetElement(){\n\t\treturn this._group.element;\n\t}\n\n\tgetRows(){\n\t\treturn this._group.getRows(true);\n\t}\n\n\tgetSubGroups(){\n\t\treturn this._group.getSubGroups(true);\n\t}\n\n\tgetParentGroup(){\n\t\treturn this._group.parent ? this._group.parent.getComponent() : false;\n\t}\n\n\tisVisible(){\n\t\treturn this._group.visible;\n\t}\n\n\tshow(){\n\t\tthis._group.show();\n\t}\n\n\thide(){\n\t\tthis._group.hide();\n\t}\n\n\ttoggle(){\n\t\tthis._group.toggleVisibility();\n\t}\n\n\tscrollTo(position, ifVisible){\n\t\treturn this._group.groupManager.table.rowManager.scrollToRow(this._group, position, ifVisible);\n\t}\n\n\t_getSelf(){\n\t\treturn this._group;\n\t}\n\n\tgetTable(){\n\t\treturn this._group.groupManager.table;\n\t}\n}\n\n//Group functions\nclass Group{\n\t\n\tconstructor(groupManager, parent, level, key, field, generator, oldGroup){\n\t\tthis.groupManager = groupManager;\n\t\tthis.parent = parent;\n\t\tthis.key = key;\n\t\tthis.level = level;\n\t\tthis.field = field;\n\t\tthis.hasSubGroups = level < (groupManager.groupIDLookups.length - 1);\n\t\tthis.addRow = this.hasSubGroups ? this._addRowToGroup : this._addRow;\n\t\tthis.type = \"group\"; //type of element\n\t\tthis.old = oldGroup;\n\t\tthis.rows = [];\n\t\tthis.groups = [];\n\t\tthis.groupList = [];\n\t\tthis.generator = generator;\n\t\tthis.element = false;\n\t\tthis.elementContents = false;\n\t\tthis.height = 0;\n\t\tthis.outerHeight = 0;\n\t\tthis.initialized = false;\n\t\tthis.calcs = {};\n\t\tthis.initialized = false;\n\t\tthis.modules = {};\n\t\tthis.arrowElement = false;\n\t\t\n\t\tthis.visible = oldGroup ? oldGroup.visible : (typeof groupManager.startOpen[level] !== \"undefined\" ? groupManager.startOpen[level] : groupManager.startOpen[0]);\n\t\t\n\t\tthis.component = null;\n\t\t\n\t\tthis.createElements();\n\t\tthis.addBindings();\n\t\t\n\t\tthis.createValueGroups();\n\t}\n\t\n\twipe(elementsOnly){\n\t\tif(!elementsOnly){\n\t\t\tif(this.groupList.length){\n\t\t\t\tthis.groupList.forEach(function(group){\n\t\t\t\t\tgroup.wipe();\n\t\t\t\t});\n\t\t\t}else {\n\t\t\t\tthis.rows.forEach((row) => {\n\t\t\t\t\tif(row.modules){\n\t\t\t\t\t\tdelete row.modules.group;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t\n\t\tthis.element = false;\n\t\tthis.arrowElement = false;\n\t\tthis.elementContents = false;\n\t}\n\t\n\tcreateElements(){\n\t\tvar arrow = document.createElement(\"div\");\n\t\tarrow.classList.add(\"tabulator-arrow\");\n\t\t\n\t\tthis.element = document.createElement(\"div\");\n\t\tthis.element.classList.add(\"tabulator-row\");\n\t\tthis.element.classList.add(\"tabulator-group\");\n\t\tthis.element.classList.add(\"tabulator-group-level-\" + this.level);\n\t\tthis.element.setAttribute(\"role\", \"rowgroup\");\n\t\t\n\t\tthis.arrowElement = document.createElement(\"div\");\n\t\tthis.arrowElement.classList.add(\"tabulator-group-toggle\");\n\t\tthis.arrowElement.appendChild(arrow);\n\t\t\n\t\t//setup movable rows\n\t\tif(this.groupManager.table.options.movableRows !== false && this.groupManager.table.modExists(\"moveRow\")){\n\t\t\tthis.groupManager.table.modules.moveRow.initializeGroupHeader(this);\n\t\t}\n\t}\n\t\n\tcreateValueGroups(){\n\t\tvar level = this.level + 1;\n\t\tif(this.groupManager.allowedValues && this.groupManager.allowedValues[level]){\n\t\t\tthis.groupManager.allowedValues[level].forEach((value) => {\n\t\t\t\tthis._createGroup(value, level);\n\t\t\t});\n\t\t}\n\t}\n\t\n\taddBindings(){\n\t\tvar toggleElement;\n\t\t\n\t\tif(this.groupManager.table.options.groupToggleElement){\n\t\t\ttoggleElement = this.groupManager.table.options.groupToggleElement == \"arrow\" ? this.arrowElement : this.element;\n\t\t\t\n\t\t\ttoggleElement.addEventListener(\"click\", (e) => {\n\t\t\t\tif(this.groupManager.table.options.groupToggleElement === \"arrow\"){\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\te.stopImmediatePropagation();\n\t\t\t\t}\n\n\t\t\t\t//allow click event to propagate before toggling visibility\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.toggleVisibility();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\t\n\t_createGroup(groupID, level){\n\t\tvar groupKey = level + \"_\" + groupID;\n\t\tvar group = new Group(this.groupManager, this, level, groupID, this.groupManager.groupIDLookups[level].field, this.groupManager.headerGenerator[level] || this.groupManager.headerGenerator[0], this.old ? this.old.groups[groupKey] : false);\n\t\t\n\t\tthis.groups[groupKey] = group;\n\t\tthis.groupList.push(group);\n\t}\n\t\n\t_addRowToGroup(row){\n\t\t\n\t\tvar level = this.level + 1;\n\t\t\n\t\tif(this.hasSubGroups){\n\t\t\tvar groupID = this.groupManager.groupIDLookups[level].func(row.getData()),\n\t\t\tgroupKey = level + \"_\" + groupID;\n\t\t\t\n\t\t\tif(this.groupManager.allowedValues && this.groupManager.allowedValues[level]){\n\t\t\t\tif(this.groups[groupKey]){\n\t\t\t\t\tthis.groups[groupKey].addRow(row);\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tif(!this.groups[groupKey]){\n\t\t\t\t\tthis._createGroup(groupID, level);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.groups[groupKey].addRow(row);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t_addRow(row){\n\t\tthis.rows.push(row);\n\t\trow.modules.group = this;\n\t}\n\t\n\tinsertRow(row, to, after){\n\t\tvar data = this.conformRowData({});\n\t\t\n\t\trow.updateData(data);\n\t\t\n\t\tvar toIndex = this.rows.indexOf(to);\n\t\t\n\t\tif(toIndex > -1){\n\t\t\tif(after){\n\t\t\t\tthis.rows.splice(toIndex+1, 0, row);\n\t\t\t}else {\n\t\t\t\tthis.rows.splice(toIndex, 0, row);\n\t\t\t}\n\t\t}else {\n\t\t\tif(after){\n\t\t\t\tthis.rows.push(row);\n\t\t\t}else {\n\t\t\t\tthis.rows.unshift(row);\n\t\t\t}\n\t\t}\n\t\t\n\t\trow.modules.group = this;\n\t\t\n\t\t// this.generateGroupHeaderContents();\n\t\t\n\t\tif(this.groupManager.table.modExists(\"columnCalcs\") && this.groupManager.table.options.columnCalcs != \"table\"){\n\t\t\tthis.groupManager.table.modules.columnCalcs.recalcGroup(this);\n\t\t}\n\t\t\n\t\tthis.groupManager.updateGroupRows(true);\n\t}\n\t\n\tscrollHeader(left){\n\t\tif(this.arrowElement){\n\t\t\tthis.arrowElement.style.marginLeft = left;\n\t\t\t\n\t\t\tthis.groupList.forEach(function(child){\n\t\t\t\tchild.scrollHeader(left);\n\t\t\t});\n\t\t}\n\t}\n\t\n\tgetRowIndex(row){}\n\t\n\t//update row data to match grouping constraints\n\tconformRowData(data){\n\t\tif(this.field){\n\t\t\tdata[this.field] = this.key;\n\t\t}else {\n\t\t\tconsole.warn(\"Data Conforming Error - Cannot conform row data to match new group as groupBy is a function\");\n\t\t}\n\t\t\n\t\tif(this.parent){\n\t\t\tdata = this.parent.conformRowData(data);\n\t\t}\n\t\t\n\t\treturn data;\n\t}\n\t\n\tremoveRow(row){\n\t\tvar index = this.rows.indexOf(row);\n\t\tvar el = row.getElement();\n\t\t\n\t\tif(index > -1){\n\t\t\tthis.rows.splice(index, 1);\n\t\t}\n\t\t\n\t\tif(!this.groupManager.table.options.groupValues && !this.rows.length){\n\t\t\tif(this.parent){\n\t\t\t\tthis.parent.removeGroup(this);\n\t\t\t}else {\n\t\t\t\tthis.groupManager.removeGroup(this);\n\t\t\t}\t\t\n\t\t\t\n\t\t\tthis.groupManager.updateGroupRows(true);\n\t\t\t\n\t\t}else {\n\t\t\t\n\t\t\tif(el.parentNode){\n\t\t\t\tel.parentNode.removeChild(el);\n\t\t\t}\n\t\t\t\n\t\t\tif(!this.groupManager.blockRedraw){\n\t\t\t\tthis.generateGroupHeaderContents();\n\t\t\t\t\n\t\t\t\tif(this.groupManager.table.modExists(\"columnCalcs\") && this.groupManager.table.options.columnCalcs != \"table\"){\n\t\t\t\t\tthis.groupManager.table.modules.columnCalcs.recalcGroup(this);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t}\n\t}\n\t\n\tremoveGroup(group){\n\t\tvar groupKey = group.level + \"_\" + group.key,\n\t\tindex;\n\t\t\n\t\tif(this.groups[groupKey]){\n\t\t\tdelete this.groups[groupKey];\n\t\t\t\n\t\t\tindex = this.groupList.indexOf(group);\n\t\t\t\n\t\t\tif(index > -1){\n\t\t\t\tthis.groupList.splice(index, 1);\n\t\t\t}\n\t\t\t\n\t\t\tif(!this.groupList.length){\n\t\t\t\tif(this.parent){\n\t\t\t\t\tthis.parent.removeGroup(this);\n\t\t\t\t}else {\n\t\t\t\t\tthis.groupManager.removeGroup(this);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tgetHeadersAndRows(){\n\t\tvar output = [];\n\t\t\n\t\toutput.push(this);\n\t\t\n\t\tthis._visSet();\n\t\t\n\t\t\n\t\tif(this.calcs.top){\n\t\t\tthis.calcs.top.detachElement();\n\t\t\tthis.calcs.top.deleteCells();\n\t\t}\n\t\t\n\t\tif(this.calcs.bottom){\n\t\t\tthis.calcs.bottom.detachElement();\n\t\t\tthis.calcs.bottom.deleteCells();\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\tif(this.visible){\n\t\t\tif(this.groupList.length){\n\t\t\t\tthis.groupList.forEach(function(group){\n\t\t\t\t\toutput = output.concat(group.getHeadersAndRows());\n\t\t\t\t});\n\t\t\t\t\n\t\t\t}else {\n\t\t\t\tif(this.groupManager.table.options.columnCalcs != \"table\" && this.groupManager.table.modExists(\"columnCalcs\") && this.groupManager.table.modules.columnCalcs.hasTopCalcs()){\n\t\t\t\t\tthis.calcs.top = this.groupManager.table.modules.columnCalcs.generateTopRow(this.rows);\n\t\t\t\t\toutput.push(this.calcs.top);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\toutput = output.concat(this.rows);\n\t\t\t\t\n\t\t\t\tif(this.groupManager.table.options.columnCalcs != \"table\" && this.groupManager.table.modExists(\"columnCalcs\") && this.groupManager.table.modules.columnCalcs.hasBottomCalcs()){\n\t\t\t\t\tthis.calcs.bottom = this.groupManager.table.modules.columnCalcs.generateBottomRow(this.rows);\n\t\t\t\t\toutput.push(this.calcs.bottom);\n\t\t\t\t}\n\t\t\t}\n\t\t}else {\n\t\t\tif(!this.groupList.length && this.groupManager.table.options.columnCalcs != \"table\"){\n\t\t\t\t\n\t\t\t\tif(this.groupManager.table.modExists(\"columnCalcs\")){\n\t\t\t\t\tif(this.groupManager.table.modules.columnCalcs.hasTopCalcs()){\n\t\t\t\t\t\tif(this.groupManager.table.options.groupClosedShowCalcs){\n\t\t\t\t\t\t\tthis.calcs.top = this.groupManager.table.modules.columnCalcs.generateTopRow(this.rows);\n\t\t\t\t\t\t\toutput.push(this.calcs.top);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif(this.groupManager.table.modules.columnCalcs.hasBottomCalcs()){\t\t\t\t\t\t\n\t\t\t\t\t\tif(this.groupManager.table.options.groupClosedShowCalcs){\n\t\t\t\t\t\t\tthis.calcs.bottom = this.groupManager.table.modules.columnCalcs.generateBottomRow(this.rows);\n\t\t\t\t\t\t\toutput.push(this.calcs.bottom);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t\n\t\treturn output;\n\t}\n\t\n\tgetData(visible, transform){\n\t\tvar output = [];\n\t\t\n\t\tthis._visSet();\n\t\t\n\t\tif(!visible || (visible && this.visible)){\n\t\t\tthis.rows.forEach((row) => {\n\t\t\t\toutput.push(row.getData(transform || \"data\"));\n\t\t\t});\n\t\t}\n\t\t\n\t\treturn output;\n\t}\n\t\n\tgetRowCount(){\n\t\tvar count = 0;\n\t\t\n\t\tif(this.groupList.length){\n\t\t\tthis.groupList.forEach((group) => {\n\t\t\t\tcount += group.getRowCount();\n\t\t\t});\n\t\t}else {\n\t\t\tcount = this.rows.length;\n\t\t}\n\t\treturn count;\n\t}\n\n\t\n\ttoggleVisibility(){\n\t\tif(this.visible){\n\t\t\tthis.hide();\n\t\t}else {\n\t\t\tthis.show();\n\t\t}\n\t}\n\t\n\thide(){\n\t\tthis.visible = false;\n\t\t\n\t\tif(this.groupManager.table.rowManager.getRenderMode() == \"basic\" && !this.groupManager.table.options.pagination){\n\t\t\t\n\t\t\tthis.element.classList.remove(\"tabulator-group-visible\");\n\t\t\t\n\t\t\tif(this.groupList.length){\n\t\t\t\tthis.groupList.forEach((group) => {\n\t\t\t\t\t\n\t\t\t\t\tvar rows = group.getHeadersAndRows();\n\t\t\t\t\t\n\t\t\t\t\trows.forEach((row) => {\n\t\t\t\t\t\trow.detachElement();\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\t\n\t\t\t}else {\n\t\t\t\tthis.rows.forEach((row) => {\n\t\t\t\t\tvar rowEl = row.getElement();\n\t\t\t\t\trowEl.parentNode.removeChild(rowEl);\n\t\t\t\t});\n\t\t\t}\n\t\t\t\n\t\t\tthis.groupManager.updateGroupRows(true);\n\t\t\t\n\t\t}else {\n\t\t\tthis.groupManager.updateGroupRows(true);\n\t\t}\n\t\t\n\t\tthis.groupManager.table.externalEvents.dispatch(\"groupVisibilityChanged\", this.getComponent(), false);\n\t}\n\t\n\tshow(){\n\t\tthis.visible = true;\n\t\t\n\t\tif(this.groupManager.table.rowManager.getRenderMode() == \"basic\" && !this.groupManager.table.options.pagination){\n\t\t\t\n\t\t\tthis.element.classList.add(\"tabulator-group-visible\");\n\t\t\t\n\t\t\tvar prev = this.generateElement();\n\t\t\t\n\t\t\tif(this.groupList.length){\n\t\t\t\tthis.groupList.forEach((group) => {\n\t\t\t\t\tvar rows = group.getHeadersAndRows();\n\t\t\t\t\t\n\t\t\t\t\trows.forEach((row) => {\n\t\t\t\t\t\tvar rowEl = row.getElement();\n\t\t\t\t\t\tprev.parentNode.insertBefore(rowEl, prev.nextSibling);\n\t\t\t\t\t\trow.initialize();\n\t\t\t\t\t\tprev = rowEl;\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\t\n\t\t\t}else {\n\t\t\t\tthis.rows.forEach((row) => {\n\t\t\t\t\tvar rowEl = row.getElement();\n\t\t\t\t\tprev.parentNode.insertBefore(rowEl, prev.nextSibling);\n\t\t\t\t\trow.initialize();\n\t\t\t\t\tprev = rowEl;\n\t\t\t\t});\n\t\t\t}\n\t\t\t\n\t\t\tthis.groupManager.updateGroupRows(true);\n\t\t}else {\n\t\t\tthis.groupManager.updateGroupRows(true);\n\t\t}\n\t\t\n\t\tthis.groupManager.table.externalEvents.dispatch(\"groupVisibilityChanged\", this.getComponent(), true);\n\t}\n\t\n\t_visSet(){\n\t\tvar data = [];\n\t\t\n\t\tif(typeof this.visible == \"function\"){\n\t\t\t\n\t\t\tthis.rows.forEach(function(row){\n\t\t\t\tdata.push(row.getData());\n\t\t\t});\n\t\t\t\n\t\t\tthis.visible = this.visible(this.key, this.getRowCount(), data, this.getComponent());\n\t\t}\n\t}\n\t\n\tgetRowGroup(row){\n\t\tvar match = false;\n\t\tif(this.groupList.length){\n\t\t\tthis.groupList.forEach(function(group){\n\t\t\t\tvar result = group.getRowGroup(row);\n\t\t\t\t\n\t\t\t\tif(result){\n\t\t\t\t\tmatch = result;\n\t\t\t\t}\n\t\t\t});\n\t\t}else {\n\t\t\tif(this.rows.find(function(item){\n\t\t\t\treturn item === row;\n\t\t\t})){\n\t\t\t\tmatch = this;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn match;\n\t}\n\t\n\tgetSubGroups(component){\n\t\tvar output = [];\n\t\t\n\t\tthis.groupList.forEach(function(child){\n\t\t\toutput.push(component ? child.getComponent() : child);\n\t\t});\n\t\t\n\t\treturn output;\n\t}\n\t\n\tgetRows(component, includeChildren){\n\t\tvar output = [];\n\t\t\n\t\tif(includeChildren && this.groupList.length){\n\t\t\tthis.groupList.forEach((group) => {\n\t\t\t\toutput = output.concat(group.getRows(component, includeChildren));\n\t\t\t});\n\t\t}else {\n\t\t\tthis.rows.forEach(function(row){\n\t\t\t\toutput.push(component ? row.getComponent() : row);\n\t\t\t});\n\t\t}\n\t\t\n\t\treturn output;\n\t}\n\t\n\tgenerateGroupHeaderContents(){\n\t\tvar data = [];\n\t\t\n\t\tvar rows = this.getRows(false, true);\n\t\t\n\t\trows.forEach(function(row){\n\t\t\tdata.push(row.getData());\n\t\t});\n\t\t\n\t\tthis.elementContents = this.generator(this.key, this.getRowCount(), data, this.getComponent());\n\t\t\n\t\twhile(this.element.firstChild) this.element.removeChild(this.element.firstChild);\n\t\t\n\t\tif(typeof this.elementContents === \"string\"){\n\t\t\tthis.element.innerHTML = this.elementContents;\n\t\t}else {\n\t\t\tthis.element.appendChild(this.elementContents);\n\t\t}\n\t\t\n\t\tthis.element.insertBefore(this.arrowElement, this.element.firstChild);\n\t}\n\t\n\tgetPath(path = []) {\n\t\tpath.unshift(this.key);\n\t\tif(this.parent) {\n\t\t\tthis.parent.getPath(path);\n\t\t}\n\t\treturn path;\n\t}\n\t\n\t////////////// Standard Row Functions //////////////\n\t\n\tgetElement(){\n\t\treturn this.elementContents ? this.element : this.generateElement();\n\t}\n\t\n\tgenerateElement(){\n\t\tthis.addBindings = false;\n\t\t\n\t\tthis._visSet();\n\t\t\n\t\tif(this.visible){\n\t\t\tthis.element.classList.add(\"tabulator-group-visible\");\n\t\t}else {\n\t\t\tthis.element.classList.remove(\"tabulator-group-visible\");\n\t\t}\n\t\t\n\t\tfor(var i = 0; i < this.element.childNodes.length; ++i){\n\t\t\tthis.element.childNodes[i].parentNode.removeChild(this.element.childNodes[i]);\n\t\t}\n\t\t\n\t\tthis.generateGroupHeaderContents();\n\t\t\n\t\t// this.addBindings();\n\t\t\n\t\treturn this.element;\n\t}\n\t\n\tdetachElement(){\n\t\tif (this.element && this.element.parentNode){\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n\t\n\t//normalize the height of elements in the row\n\tnormalizeHeight(){\n\t\tthis.setHeight(this.element.clientHeight);\n\t}\n\t\n\tinitialize(force){\n\t\tif(!this.initialized || force){\n\t\t\tthis.normalizeHeight();\n\t\t\tthis.initialized = true;\n\t\t}\n\t}\n\t\n\treinitialize(){\n\t\tthis.initialized = false;\n\t\tthis.height = 0;\n\t\t\n\t\tif(Helpers.elVisible(this.element)){\n\t\t\tthis.initialize(true);\n\t\t}\n\t}\n\t\n\tsetHeight(height){\n\t\tif(this.height != height){\n\t\t\tthis.height = height;\n\t\t\tthis.outerHeight = this.element.offsetHeight;\n\t\t}\n\t}\n\t\n\t//return rows outer height\n\tgetHeight(){\n\t\treturn this.outerHeight;\n\t}\n\t\n\tgetGroup(){\n\t\treturn this;\n\t}\n\t\n\treinitializeHeight(){}\n\t\n\tcalcHeight(){}\n\t\n\tsetCellHeight(){}\n\t\n\tclearCellHeight(){}\n\t\n\tdeinitializeHeight(){}\n\n\trendered(){}\n\t\n\t//////////////// Object Generation /////////////////\n\tgetComponent(){\n\t\tif(!this.component){\n\t\t\tthis.component = new GroupComponent(this);\n\t\t}\n\t\t\n\t\treturn this.component;\n\t}\n}\n\nclass GroupRows extends Module{\n\n\tstatic moduleName = \"groupRows\";\n\t\n\tconstructor(table){\n\t\tsuper(table);\n\t\t\n\t\tthis.groupIDLookups = false; //enable table grouping and set field to group by\n\t\tthis.startOpen = [function(){return false;}]; //starting state of group\n\t\tthis.headerGenerator = [function(){return \"\";}];\n\t\tthis.groupList = []; //ordered list of groups\n\t\tthis.allowedValues = false;\n\t\tthis.groups = {}; //hold row groups\n\t\t\n\t\tthis.displayHandler = this.getRows.bind(this);\n\n\t\tthis.blockRedraw = false;\n\t\t\n\t\t//register table options\n\t\tthis.registerTableOption(\"groupBy\", false); //enable table grouping and set field to group by\n\t\tthis.registerTableOption(\"groupStartOpen\", true); //starting state of group\n\t\tthis.registerTableOption(\"groupValues\", false);\n\t\tthis.registerTableOption(\"groupUpdateOnCellEdit\", false);\n\t\tthis.registerTableOption(\"groupHeader\", false); //header generation function\n\t\tthis.registerTableOption(\"groupHeaderPrint\", null);\n\t\tthis.registerTableOption(\"groupHeaderClipboard\", null);\n\t\tthis.registerTableOption(\"groupHeaderHtmlOutput\", null);\n\t\tthis.registerTableOption(\"groupHeaderDownload\", null);\n\t\tthis.registerTableOption(\"groupToggleElement\", \"arrow\");\n\t\tthis.registerTableOption(\"groupClosedShowCalcs\", false);\n\t\t\n\t\t//register table functions\n\t\tthis.registerTableFunction(\"setGroupBy\", this.setGroupBy.bind(this));\n\t\tthis.registerTableFunction(\"setGroupValues\", this.setGroupValues.bind(this));\n\t\tthis.registerTableFunction(\"setGroupStartOpen\", this.setGroupStartOpen.bind(this));\n\t\tthis.registerTableFunction(\"setGroupHeader\", this.setGroupHeader.bind(this));\n\t\tthis.registerTableFunction(\"getGroups\", this.userGetGroups.bind(this));\n\t\tthis.registerTableFunction(\"getGroupedData\", this.userGetGroupedData.bind(this));\n\t\t\n\t\t//register component functions\n\t\tthis.registerComponentFunction(\"row\", \"getGroup\", this.rowGetGroup.bind(this));\n\t}\n\t\n\t//initialize group configuration\n\tinitialize(){\n\t\tthis.subscribe(\"table-destroy\", this._blockRedrawing.bind(this));\n\t\tthis.subscribe(\"rows-wipe\", this._blockRedrawing.bind(this));\n\t\tthis.subscribe(\"rows-wiped\", this._restore_redrawing.bind(this));\n\n\t\tif(this.table.options.groupBy){\n\t\t\tif(this.table.options.groupUpdateOnCellEdit){\n\t\t\t\tthis.subscribe(\"cell-value-updated\", this.cellUpdated.bind(this));\n\t\t\t\tthis.subscribe(\"row-data-changed\", this.reassignRowToGroup.bind(this), 0);\n\t\t\t}\n\t\t\t\n\t\t\tthis.subscribe(\"table-built\", this.configureGroupSetup.bind(this));\n\t\t\t\n\t\t\tthis.subscribe(\"row-deleting\", this.rowDeleting.bind(this));\n\t\t\tthis.subscribe(\"row-deleted\", this.rowsUpdated.bind(this));\n\t\t\tthis.subscribe(\"scroll-horizontal\", this.scrollHeaders.bind(this));\n\t\t\tthis.subscribe(\"rows-wipe\", this.wipe.bind(this));\n\t\t\tthis.subscribe(\"rows-added\", this.rowsUpdated.bind(this));\n\t\t\tthis.subscribe(\"row-moving\", this.rowMoving.bind(this));\n\t\t\tthis.subscribe(\"row-adding-index\", this.rowAddingIndex.bind(this));\n\t\t\t\n\t\t\tthis.subscribe(\"rows-sample\", this.rowSample.bind(this));\n\t\t\t\n\t\t\tthis.subscribe(\"render-virtual-fill\", this.virtualRenderFill.bind(this));\n\t\t\t\n\t\t\tthis.registerDisplayHandler(this.displayHandler, 20);\n\t\t\t\n\t\t\tthis.initialized = true;\n\t\t}\n\t}\n\t\n\t_blockRedrawing(){\n\t\tthis.blockRedraw = true;\n\t}\n\n\t_restore_redrawing(){\n\t\tthis.blockRedraw = false;\n\t}\n\n\tconfigureGroupSetup(){\n\t\tif(this.table.options.groupBy){\n\t\t\tvar groupBy = this.table.options.groupBy,\n\t\t\tstartOpen = this.table.options.groupStartOpen,\n\t\t\tgroupHeader = this.table.options.groupHeader;\n\t\t\t\n\t\t\tthis.allowedValues = this.table.options.groupValues;\n\t\t\t\n\t\t\tif(Array.isArray(groupBy) && Array.isArray(groupHeader) && groupBy.length > groupHeader.length){\n\t\t\t\tconsole.warn(\"Error creating group headers, groupHeader array is shorter than groupBy array\");\n\t\t\t}\n\t\t\t\n\t\t\tthis.headerGenerator = [function(){return \"\";}];\n\t\t\tthis.startOpen = [function(){return false;}]; //starting state of group\n\t\t\t\n\t\t\tthis.langBind(\"groups|item\", (langValue, lang) => {\n\t\t\t\tthis.headerGenerator[0] = (value, count, data) => { //header layout function\n\t\t\t\t\treturn (typeof value === \"undefined\" ? \"\" : value) + \"<span>(\" + count + \" \" + ((count === 1) ? langValue : lang.groups.items) + \")</span>\";\n\t\t\t\t};\n\t\t\t});\n\t\t\t\n\t\t\tthis.groupIDLookups = [];\n\t\t\t\n\t\t\tif(groupBy){\n\t\t\t\tif(this.table.modExists(\"columnCalcs\") && this.table.options.columnCalcs != \"table\" && this.table.options.columnCalcs != \"both\"){\n\t\t\t\t\tthis.table.modules.columnCalcs.removeCalcs();\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tif(this.table.modExists(\"columnCalcs\") && this.table.options.columnCalcs != \"group\"){\n\t\t\t\t\t\n\t\t\t\t\tvar cols = this.table.columnManager.getRealColumns();\n\t\t\t\t\t\n\t\t\t\t\tcols.forEach((col) => {\n\t\t\t\t\t\tif(col.definition.topCalc){\n\t\t\t\t\t\t\tthis.table.modules.columnCalcs.initializeTopRow();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(col.definition.bottomCalc){\n\t\t\t\t\t\t\tthis.table.modules.columnCalcs.initializeBottomRow();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif(!Array.isArray(groupBy)){\n\t\t\t\tgroupBy = [groupBy];\n\t\t\t}\n\t\t\t\n\t\t\tgroupBy.forEach((group, i) => {\n\t\t\t\tvar lookupFunc, column;\n\t\t\t\t\n\t\t\t\tif(typeof group == \"function\"){\n\t\t\t\t\tlookupFunc = group;\n\t\t\t\t}else {\n\t\t\t\t\tcolumn = this.table.columnManager.getColumnByField(group);\n\t\t\t\t\t\n\t\t\t\t\tif(column){\n\t\t\t\t\t\tlookupFunc = function(data){\n\t\t\t\t\t\t\treturn column.getFieldValue(data);\n\t\t\t\t\t\t};\n\t\t\t\t\t}else {\n\t\t\t\t\t\tlookupFunc = function(data){\n\t\t\t\t\t\t\treturn data[group];\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.groupIDLookups.push({\n\t\t\t\t\tfield: typeof group === \"function\" ? false : group,\n\t\t\t\t\tfunc:lookupFunc,\n\t\t\t\t\tvalues:this.allowedValues ? this.allowedValues[i] : false,\n\t\t\t\t});\n\t\t\t});\n\t\t\t\n\t\t\tif(startOpen){\n\t\t\t\tif(!Array.isArray(startOpen)){\n\t\t\t\t\tstartOpen = [startOpen];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tstartOpen.forEach((level) => {\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tthis.startOpen = startOpen;\n\t\t\t}\n\t\t\t\n\t\t\tif(groupHeader){\n\t\t\t\tthis.headerGenerator = Array.isArray(groupHeader) ? groupHeader : [groupHeader];\n\t\t\t}\n\t\t}else {\n\t\t\tthis.groupList = [];\n\t\t\tthis.groups = {};\n\t\t}\n\t}\n\t\n\trowSample(rows, prevValue){\n\t\tif(this.table.options.groupBy){\n\t\t\tvar group = this.getGroups(false)[0];\n\t\t\t\n\t\t\tprevValue.push(group.getRows(false)[0]);\n\t\t}\n\t\t\n\t\treturn prevValue;\n\t}\n\t\n\tvirtualRenderFill(){\n\t\tvar el = this.table.rowManager.tableElement;\n\t\tvar rows = this.table.rowManager.getVisibleRows();\n\t\t\n\t\tif(this.table.options.groupBy){\n\t\t\trows = rows.filter((row) => {\n\t\t\t\treturn row.type !== \"group\";\n\t\t\t});\n\t\t\t\n\t\t\tel.style.minWidth = !rows.length ? this.table.columnManager.getWidth() + \"px\" : \"\";\n\t\t}else {\n\t\t\treturn rows;\n\t\t}\n\t}\n\t\n\trowAddingIndex(row, index, top){\n\t\tif(this.table.options.groupBy){\n\t\t\tthis.assignRowToGroup(row);\n\t\t\t\n\t\t\tvar groupRows = row.modules.group.rows;\n\t\t\t\n\t\t\tif(groupRows.length > 1){\n\t\t\t\tif(!index || (index && groupRows.indexOf(index) == -1)){\n\t\t\t\t\tif(top){\n\t\t\t\t\t\tif(groupRows[0] !== row){\n\t\t\t\t\t\t\tindex = groupRows[0];\n\t\t\t\t\t\t\tthis.table.rowManager.moveRowInArray(row.modules.group.rows, row, index, !top);\n\t\t\t\t\t\t}\n\t\t\t\t\t}else {\n\t\t\t\t\t\tif(groupRows[groupRows.length -1] !== row){\n\t\t\t\t\t\t\tindex = groupRows[groupRows.length -1];\n\t\t\t\t\t\t\tthis.table.rowManager.moveRowInArray(row.modules.group.rows, row, index, !top);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}else {\n\t\t\t\t\tthis.table.rowManager.moveRowInArray(row.modules.group.rows, row, index, !top);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn index;\n\t\t}\n\t}\n\t\n\ttrackChanges(){\n\t\tthis.dispatch(\"group-changed\");\n\t}\n\t\n\t///////////////////////////////////\n\t///////// Table Functions /////////\n\t///////////////////////////////////\n\t\n\tsetGroupBy(groups){\n\t\tthis.table.options.groupBy = groups;\n\t\t\n\t\tif(!this.initialized){\n\t\t\tthis.initialize();\n\t\t}\n\t\t\n\t\tthis.configureGroupSetup();\n\n\t\tif(!groups && this.table.modExists(\"columnCalcs\") && this.table.options.columnCalcs === true){\n\t\t\tthis.table.modules.columnCalcs.reinitializeCalcs();\n\t\t}\n\t\t\n\t\tthis.refreshData();\n\t\t\n\t\tthis.trackChanges();\n\t}\n\t\n\tsetGroupValues(groupValues){\n\t\tthis.table.options.groupValues = groupValues;\n\t\tthis.configureGroupSetup();\n\t\tthis.refreshData();\n\t\t\n\t\tthis.trackChanges();\n\t}\n\t\n\tsetGroupStartOpen(values){\n\t\tthis.table.options.groupStartOpen = values;\n\t\tthis.configureGroupSetup();\n\t\t\n\t\tif(this.table.options.groupBy){\n\t\t\tthis.refreshData();\n\t\t\t\n\t\t\tthis.trackChanges();\n\t\t}else {\n\t\t\tconsole.warn(\"Grouping Update - cant refresh view, no groups have been set\");\n\t\t}\n\t}\n\t\n\tsetGroupHeader(values){\n\t\tthis.table.options.groupHeader = values;\n\t\tthis.configureGroupSetup();\n\t\t\n\t\tif(this.table.options.groupBy){\n\t\t\tthis.refreshData();\n\t\t\t\n\t\t\tthis.trackChanges();\n\t\t}else {\n\t\t\tconsole.warn(\"Grouping Update - cant refresh view, no groups have been set\");\n\t\t}\n\t}\n\t\n\tuserGetGroups(values){\n\t\treturn this.getGroups(true);\n\t}\n\t\n\t// get grouped table data in the same format as getData()\n\tuserGetGroupedData(){\n\t\treturn this.table.options.groupBy ? this.getGroupedData() : this.getData();\n\t}\n\t\n\t\n\t///////////////////////////////////////\n\t///////// Component Functions /////////\n\t///////////////////////////////////////\n\t\n\trowGetGroup(row){\n\t\treturn row.modules.group ? row.modules.group.getComponent() : false;\n\t}\n\t\n\t///////////////////////////////////\n\t///////// Internal Logic //////////\n\t///////////////////////////////////\n\t\n\trowMoving(from, to, after){\n\t\tif(this.table.options.groupBy){\n\t\t\tif(!after && to instanceof Group){\n\t\t\t\tto = this.table.rowManager.prevDisplayRow(from) || to;\n\t\t\t}\n\t\t\t\n\t\t\tvar toGroup = to instanceof Group ? to : to.modules.group;\n\t\t\tvar fromGroup = from instanceof Group ? from : from.modules.group;\n\t\t\t\n\t\t\tif(toGroup === fromGroup){\n\t\t\t\tthis.table.rowManager.moveRowInArray(toGroup.rows, from, to, after);\n\t\t\t}else {\n\t\t\t\tif(fromGroup){\n\t\t\t\t\tfromGroup.removeRow(from);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\ttoGroup.insertRow(from, to, after);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\trowDeleting(row){\n\t\t//remove from group\n\t\tif(this.table.options.groupBy && row.modules.group){\n\t\t\trow.modules.group.removeRow(row);\n\t\t}\n\t}\n\t\n\trowsUpdated(row){\n\t\tif(this.table.options.groupBy){\n\t\t\tthis.updateGroupRows(true);\n\t\t}\t\n\t}\n\t\n\tcellUpdated(cell){\n\t\tif(this.table.options.groupBy){\n\t\t\tthis.reassignRowToGroup(cell.row);\n\t\t}\n\t}\n\t\n\t//return appropriate rows with group headers\n\tgetRows(rows){\n\t\tif(this.table.options.groupBy && this.groupIDLookups.length){\n\t\t\t\n\t\t\tthis.dispatchExternal(\"dataGrouping\");\n\t\t\t\n\t\t\tthis.generateGroups(rows);\n\t\t\t\n\t\t\tif(this.subscribedExternal(\"dataGrouped\")){\n\t\t\t\tthis.dispatchExternal(\"dataGrouped\", this.getGroups(true));\n\t\t\t}\n\t\t\t\n\t\t\treturn this.updateGroupRows();\n\t\t\t\n\t\t}else {\n\t\t\treturn rows.slice(0);\n\t\t}\n\t}\n\t\n\tgetGroups(component){\n\t\tvar groupComponents = [];\n\t\t\n\t\tthis.groupList.forEach(function(group){\n\t\t\tgroupComponents.push(component ? group.getComponent() : group);\n\t\t});\n\t\t\n\t\treturn groupComponents;\n\t}\n\t\n\tgetChildGroups(group){\n\t\tvar groupComponents = [];\n\t\t\n\t\tif(!group){\n\t\t\tgroup = this;\n\t\t}\n\t\t\n\t\tgroup.groupList.forEach((child) => {\n\t\t\tif(child.groupList.length){\n\t\t\t\tgroupComponents = groupComponents.concat(this.getChildGroups(child));\n\t\t\t}else {\n\t\t\t\tgroupComponents.push(child);\n\t\t\t}\n\t\t});\n\t\t\n\t\treturn groupComponents;\n\t}\n\t\n\twipe(){\n\t\tif(this.table.options.groupBy){\n\t\t\tthis.groupList.forEach(function(group){\n\t\t\t\tgroup.wipe();\n\t\t\t});\n\t\t\t\n\t\t\tthis.groupList = [];\n\t\t\tthis.groups = {};\n\t\t}\n\t}\n\t\n\tpullGroupListData(groupList) {\n\t\tvar groupListData = [];\n\t\t\n\t\tgroupList.forEach((group) => {\n\t\t\tvar groupHeader = {};\n\t\t\tgroupHeader.level = 0;\n\t\t\tgroupHeader.rowCount = 0;\n\t\t\tgroupHeader.headerContent = \"\";\n\t\t\tvar childData = [];\n\t\t\t\n\t\t\tif (group.hasSubGroups) {\n\t\t\t\tchildData = this.pullGroupListData(group.groupList);\n\t\t\t\t\n\t\t\t\tgroupHeader.level = group.level;\n\t\t\t\tgroupHeader.rowCount = childData.length - group.groupList.length; // data length minus number of sub-headers\n\t\t\t\tgroupHeader.headerContent = group.generator(group.key, groupHeader.rowCount, group.rows, group);\n\t\t\t\t\n\t\t\t\tgroupListData.push(groupHeader);\n\t\t\t\tgroupListData = groupListData.concat(childData);\n\t\t\t}\n\t\t\t\n\t\t\telse {\n\t\t\t\tgroupHeader.level = group.level;\n\t\t\t\tgroupHeader.headerContent = group.generator(group.key, group.rows.length, group.rows, group);\n\t\t\t\tgroupHeader.rowCount = group.getRows().length;\n\t\t\t\t\n\t\t\t\tgroupListData.push(groupHeader);\n\t\t\t\t\n\t\t\t\tgroup.getRows().forEach((row) => {\n\t\t\t\t\tgroupListData.push(row.getData(\"data\"));\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t\n\t\treturn groupListData;\n\t}\n\t\n\tgetGroupedData(){\n\t\t\n\t\treturn this.pullGroupListData(this.groupList);\n\t}\n\t\n\tgetRowGroup(row){\n\t\tvar match = false;\n\t\t\n\t\tif(this.options(\"dataTree\")){\n\t\t\trow = this.table.modules.dataTree.getTreeParentRoot(row);\n\t\t}\n\t\t\n\t\tthis.groupList.forEach((group) => {\n\t\t\tvar result = group.getRowGroup(row);\n\t\t\t\n\t\t\tif(result){\n\t\t\t\tmatch = result;\n\t\t\t}\n\t\t});\n\t\t\n\t\treturn match;\n\t}\n\t\n\tcountGroups(){\n\t\treturn this.groupList.length;\n\t}\n\t\n\tgenerateGroups(rows){\n\t\tvar oldGroups = this.groups;\n\t\t\n\t\tthis.groups = {};\n\t\tthis.groupList = [];\n\t\t\n\t\tif(this.allowedValues && this.allowedValues[0]){\n\t\t\tthis.allowedValues[0].forEach((value) => {\n\t\t\t\tthis.createGroup(value, 0, oldGroups);\n\t\t\t});\n\t\t\t\n\t\t\trows.forEach((row) => {\n\t\t\t\tthis.assignRowToExistingGroup(row, oldGroups);\n\t\t\t});\n\t\t}else {\n\t\t\trows.forEach((row) => {\n\t\t\t\tthis.assignRowToGroup(row, oldGroups);\n\t\t\t});\n\t\t}\n\t\t\n\t\tObject.values(oldGroups).forEach((group) => {\n\t\t\tgroup.wipe(true);\n\t\t});\t\n\t}\n\t\n\t\n\tcreateGroup(groupID, level, oldGroups){\n\t\tvar groupKey = level + \"_\" + groupID,\n\t\tgroup;\n\t\t\n\t\toldGroups = oldGroups || [];\n\t\t\n\t\tgroup = new Group(this, false, level, groupID, this.groupIDLookups[0].field, this.headerGenerator[0], oldGroups[groupKey]);\n\t\t\n\t\tthis.groups[groupKey] = group;\n\t\tthis.groupList.push(group);\n\t}\n\t\n\tassignRowToExistingGroup(row, oldGroups){\n\t\tvar groupID = this.groupIDLookups[0].func(row.getData()),\n\t\tgroupKey = \"0_\" + groupID;\n\t\t\n\t\tif(this.groups[groupKey]){\n\t\t\tthis.groups[groupKey].addRow(row);\n\t\t}\n\t}\n\t\n\tassignRowToGroup(row, oldGroups){\n\t\tvar groupID = this.groupIDLookups[0].func(row.getData()),\n\t\tnewGroupNeeded = !this.groups[\"0_\" + groupID];\n\t\t\n\t\tif(newGroupNeeded){\n\t\t\tthis.createGroup(groupID, 0, oldGroups);\n\t\t}\n\t\t\n\t\tthis.groups[\"0_\" + groupID].addRow(row);\n\t\t\n\t\treturn !newGroupNeeded;\n\t}\n\t\n\treassignRowToGroup(row){\n\t\tif(row.type === \"row\"){\n\t\t\tvar oldRowGroup = row.modules.group,\n\t\t\toldGroupPath = oldRowGroup.getPath(),\n\t\t\tnewGroupPath = this.getExpectedPath(row),\n\t\t\tsamePath;\n\t\t\t\n\t\t\t// figure out if new group path is the same as old group path\n\t\t\tsamePath = (oldGroupPath.length == newGroupPath.length) && oldGroupPath.every((element, index) => {\n\t\t\t\treturn element === newGroupPath[index];\n\t\t\t});\n\t\t\t\n\t\t\t// refresh if they new path and old path aren't the same (aka the row's groupings have changed)\n\t\t\tif(!samePath) {\n\t\t\t\toldRowGroup.removeRow(row);\n\t\t\t\tthis.assignRowToGroup(row, this.groups);\n\t\t\t\tthis.refreshData(true);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tgetExpectedPath(row) {\n\t\tvar groupPath = [], rowData = row.getData();\n\t\t\n\t\tthis.groupIDLookups.forEach((groupId) => {\n\t\t\tgroupPath.push(groupId.func(rowData));\n\t\t});\n\t\t\n\t\treturn groupPath;\n\t}\n\t\n\tupdateGroupRows(force){\n\t\tvar output = [];\n\n\t\tif(!this.blockRedraw){\n\t\t\tthis.groupList.forEach((group) => {\n\t\t\t\toutput = output.concat(group.getHeadersAndRows());\n\t\t\t});\n\t\t\t\n\t\t\tif(force){\n\t\t\t\tthis.refreshData(true);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn output;\n\t}\n\t\n\tscrollHeaders(left){\n\t\tif(this.table.options.groupBy){\n\t\t\tif(this.table.options.renderHorizontal === \"virtual\"){\n\t\t\t\tleft -= this.table.columnManager.renderer.vDomPadLeft;\n\t\t\t}\n\t\t\t\n\t\t\tleft = left + \"px\";\n\t\t\t\n\t\t\tthis.groupList.forEach((group) => {\n\t\t\t\tgroup.scrollHeader(left);\n\t\t\t});\n\t\t}\n\t}\n\t\n\tremoveGroup(group){\n\t\tvar groupKey = group.level + \"_\" + group.key,\n\t\tindex;\n\t\t\n\t\tif(this.groups[groupKey]){\n\t\t\tdelete this.groups[groupKey];\n\t\t\t\n\t\t\tindex = this.groupList.indexOf(group);\n\t\t\t\n\t\t\tif(index > -1){\n\t\t\t\tthis.groupList.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tcheckBasicModeGroupHeaderWidth(){\n\t\tvar element = this.table.rowManager.tableElement,\n\t\tonlyGroupHeaders = true;\n\t\t\n\t\tthis.table.rowManager.getDisplayRows().forEach((row, index) =>{\n\t\t\tthis.table.rowManager.styleRow(row, index);\n\t\t\telement.appendChild(row.getElement());\n\t\t\trow.initialize(true);\n\t\t\t\n\t\t\tif(row.type !== \"group\"){\n\t\t\t\tonlyGroupHeaders = false;\n\t\t\t}\n\t\t});\n\t\t\n\t\tif(onlyGroupHeaders){\n\t\t\telement.style.minWidth = this.table.columnManager.getWidth() + \"px\";\n\t\t}else {\n\t\t\telement.style.minWidth = \"\";\n\t\t}\n\t}\n\t\n}\n\nvar defaultUndoers = {\n\tcellEdit: function(action){\n\t\taction.component.setValueProcessData(action.data.oldValue);\n\t\taction.component.cellRendered();\n\t},\n\n\trowAdd: function(action){\n\t\taction.component.deleteActual();\n\n\t\tthis.table.rowManager.checkPlaceholder();\n\t},\n\n\trowDelete: function(action){\n\t\tvar newRow = this.table.rowManager.addRowActual(action.data.data, action.data.pos, action.data.index);\n\n\t\tif(this.table.options.groupBy && this.table.modExists(\"groupRows\")){\n\t\t\tthis.table.modules.groupRows.updateGroupRows(true);\n\t\t}\n\n\t\tthis._rebindRow(action.component, newRow);\n\n\t\tthis.table.rowManager.checkPlaceholder();\n\t},\n\n\trowMove: function(action){\n\t\tvar after = (action.data.posFrom - action.data.posTo) > 0;\n\n\t\tthis.table.rowManager.moveRowActual(action.component, this.table.rowManager.getRowFromPosition(action.data.posFrom), after);\n\n\t\tthis.table.rowManager.regenerateRowPositions();\n\t\tthis.table.rowManager.reRenderInPosition();\n\t},\n};\n\nvar defaultRedoers = {\n\tcellEdit: function(action){\n\t\taction.component.setValueProcessData(action.data.newValue);\n\t\taction.component.cellRendered();\n\t},\n\n\trowAdd: function(action){\n\t\tvar newRow = this.table.rowManager.addRowActual(action.data.data, action.data.pos, action.data.index);\n\n\t\tif(this.table.options.groupBy && this.table.modExists(\"groupRows\")){\n\t\t\tthis.table.modules.groupRows.updateGroupRows(true);\n\t\t}\n\n\t\tthis._rebindRow(action.component, newRow);\n\n\t\tthis.table.rowManager.checkPlaceholder();\n\t},\n\n\trowDelete:function(action){\n\t\taction.component.deleteActual();\n\n\t\tthis.table.rowManager.checkPlaceholder();\n\t},\n\n\trowMove: function(action){\n\t\tthis.table.rowManager.moveRowActual(action.component, this.table.rowManager.getRowFromPosition(action.data.posTo), action.data.after);\n\t\t\n\t\tthis.table.rowManager.regenerateRowPositions();\n\t\tthis.table.rowManager.reRenderInPosition();\n\t},\n};\n\nvar bindings$1 = {\r\n\tundo:[\"ctrl + 90\", \"meta + 90\"],\r\n\tredo:[\"ctrl + 89\", \"meta + 89\"],\r\n};\n\nvar actions$1 = {\r\n\tundo:function(e){\r\n\t\tvar cell = false;\r\n\t\tif(this.table.options.history && this.table.modExists(\"history\") && this.table.modExists(\"edit\")){\r\n\r\n\t\t\tcell = this.table.modules.edit.currentCell;\r\n\r\n\t\t\tif(!cell){\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tthis.table.modules.history.undo();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tredo:function(e){\r\n\t\tvar cell = false;\r\n\t\tif(this.table.options.history && this.table.modExists(\"history\") && this.table.modExists(\"edit\")){\r\n\r\n\t\t\tcell = this.table.modules.edit.currentCell;\r\n\r\n\t\t\tif(!cell){\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tthis.table.modules.history.redo();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\n\nvar extensions$3 = {\r\n\tkeybindings:{\r\n\t\tbindings:bindings$1,\r\n\t\tactions:actions$1\r\n\t},\r\n};\n\nclass History extends Module{\n\n\tstatic moduleName = \"history\";\n\tstatic moduleExtensions = extensions$3;\n\n\t//load defaults\n\tstatic undoers = defaultUndoers;\n\tstatic redoers = defaultRedoers;\n\n\tconstructor(table){\n\t\tsuper(table);\n\n\t\tthis.history = [];\n\t\tthis.index = -1;\n\n\t\tthis.registerTableOption(\"history\", false); //enable edit history\n\t}\n\n\tinitialize(){\n\t\tif(this.table.options.history){\n\t\t\tthis.subscribe(\"cell-value-updated\", this.cellUpdated.bind(this));\n\t\t\tthis.subscribe(\"cell-delete\", this.clearComponentHistory.bind(this));\n\t\t\tthis.subscribe(\"row-delete\", this.rowDeleted.bind(this));\n\t\t\tthis.subscribe(\"rows-wipe\", this.clear.bind(this));\n\t\t\tthis.subscribe(\"row-added\", this.rowAdded.bind(this));\n\t\t\tthis.subscribe(\"row-move\", this.rowMoved.bind(this));\n\t\t}\n\n\t\tthis.registerTableFunction(\"undo\", this.undo.bind(this));\n\t\tthis.registerTableFunction(\"redo\", this.redo.bind(this));\n\t\tthis.registerTableFunction(\"getHistoryUndoSize\", this.getHistoryUndoSize.bind(this));\n\t\tthis.registerTableFunction(\"getHistoryRedoSize\", this.getHistoryRedoSize.bind(this));\n\t\tthis.registerTableFunction(\"clearHistory\", this.clear.bind(this));\n\t}\n\n\trowMoved(from, to, after){\n\t\tthis.action(\"rowMove\", from, {posFrom:from.getPosition(), posTo:to.getPosition(), to:to, after:after});\n\t}\n\n\trowAdded(row, data, pos, index){\n\t\tthis.action(\"rowAdd\", row, {data:data, pos:pos, index:index});\n\t}\n\n\trowDeleted(row){\n\t\tvar index, rows;\n\n\t\tif(this.table.options.groupBy){\n\n\t\t\trows = row.getComponent().getGroup()._getSelf().rows;\n\t\t\tindex = rows.indexOf(row);\n\n\t\t\tif(index){\n\t\t\t\tindex = rows[index-1];\n\t\t\t}\n\t\t}else {\n\t\t\tindex = row.table.rowManager.getRowIndex(row);\n\n\t\t\tif(index){\n\t\t\t\tindex = row.table.rowManager.rows[index-1];\n\t\t\t}\n\t\t}\n\n\t\tthis.action(\"rowDelete\", row, {data:row.getData(), pos:!index, index:index});\n\t}\n\n\tcellUpdated(cell){\n\t\tthis.action(\"cellEdit\", cell, {oldValue:cell.oldValue, newValue:cell.value});\n\t}\n\n\tclear(){\n\t\tthis.history = [];\n\t\tthis.index = -1;\n\t}\n\n\taction(type, component, data){\n\t\tthis.history = this.history.slice(0, this.index + 1);\n\n\t\tthis.history.push({\n\t\t\ttype:type,\n\t\t\tcomponent:component,\n\t\t\tdata:data,\n\t\t});\n\n\t\tthis.index ++;\n\t}\n\n\tgetHistoryUndoSize(){\n\t\treturn this.index + 1;\n\t}\n\n\tgetHistoryRedoSize(){\n\t\treturn this.history.length - (this.index + 1);\n\t}\n\n\tclearComponentHistory(component){\n\t\tvar index = this.history.findIndex(function(item){\n\t\t\treturn item.component === component;\n\t\t});\n\n\t\tif(index > -1){\n\t\t\tthis.history.splice(index, 1);\n\t\t\tif(index <= this.index){\n\t\t\t\tthis.index--;\n\t\t\t}\n\n\t\t\tthis.clearComponentHistory(component);\n\t\t}\n\t}\n\n\tundo(){\n\t\tif(this.index > -1){\n\t\t\tlet action = this.history[this.index];\n\n\t\t\tHistory.undoers[action.type].call(this, action);\n\n\t\t\tthis.index--;\n\n\t\t\tthis.dispatchExternal(\"historyUndo\", action.type, action.component.getComponent(), action.data);\n\n\t\t\treturn true;\n\t\t}else {\n\t\t\tconsole.warn(this.options(\"history\") ? \"History Undo Error - No more history to undo\" : \"History module not enabled\");\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tredo(){\n\t\tif(this.history.length-1 > this.index){\n\n\t\t\tthis.index++;\n\n\t\t\tlet action = this.history[this.index];\n\n\t\t\tHistory.redoers[action.type].call(this, action);\n\n\t\t\tthis.dispatchExternal(\"historyRedo\", action.type, action.component.getComponent(), action.data);\n\n\t\t\treturn true;\n\t\t}else {\n\t\t\tconsole.warn(this.options(\"history\") ? \"History Redo Error - No more history to redo\" : \"History module not enabled\");\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t//rebind rows to new element after deletion\n\t_rebindRow(oldRow, newRow){\n\t\tthis.history.forEach(function(action){\n\t\t\tif(action.component instanceof Row){\n\t\t\t\tif(action.component === oldRow){\n\t\t\t\t\taction.component = newRow;\n\t\t\t\t}\n\t\t\t}else if(action.component instanceof Cell){\n\t\t\t\tif(action.component.row === oldRow){\n\t\t\t\t\tvar field = action.component.column.getField();\n\n\t\t\t\t\tif(field){\n\t\t\t\t\t\taction.component = newRow.getCell(field);\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\nclass HtmlTableImport extends Module{\n\n\tstatic moduleName = \"htmlTableImport\";\n\n\tconstructor(table){\n\t\tsuper(table);\n\n\t\tthis.fieldIndex = [];\n\t\tthis.hasIndex = false;\n\t}\n\n\tinitialize(){\n\t\tthis.tableElementCheck();\n\t}\n\n\ttableElementCheck(){\n\t\tif(this.table.originalElement && this.table.originalElement.tagName === \"TABLE\"){\n\t\t\tif(this.table.originalElement.childNodes.length){\n\t\t\t\tthis.parseTable();\n\t\t\t}else {\n\t\t\t\tconsole.warn(\"Unable to parse data from empty table tag, Tabulator should be initialized on a div tag unless importing data from a table element.\");\n\t\t\t}\n\t\t}\n\t}\n\n\tparseTable(){\n\t\tvar element = this.table.originalElement,\n\t\toptions = this.table.options,\n\t\theaders = element.getElementsByTagName(\"th\"),\n\t\trows = element.getElementsByTagName(\"tbody\")[0],\n\t\tdata = [];\n\n\t\tthis.hasIndex = false;\n\n\t\tthis.dispatchExternal(\"htmlImporting\");\n\n\t\trows = rows ? rows.getElementsByTagName(\"tr\") : [];\n\n\t\t//check for Tabulator inline options\n\t\tthis._extractOptions(element, options);\n\n\t\tif(headers.length){\n\t\t\tthis._extractHeaders(headers, rows);\n\t\t}else {\n\t\t\tthis._generateBlankHeaders(headers, rows);\n\t\t}\n\n\t\t//iterate through table rows and build data set\n\t\tfor(var index = 0; index < rows.length; index++){\n\t\t\tvar row = rows[index],\n\t\t\tcells = row.getElementsByTagName(\"td\"),\n\t\t\titem = {};\n\n\t\t\t//create index if the don't exist in table\n\t\t\tif(!this.hasIndex){\n\t\t\t\titem[options.index] = index;\n\t\t\t}\n\n\t\t\tfor(var i = 0; i < cells.length; i++){\n\t\t\t\tvar cell = cells[i];\n\t\t\t\tif(typeof this.fieldIndex[i] !== \"undefined\"){\n\t\t\t\t\titem[this.fieldIndex[i]] = cell.innerHTML;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//add row data to item\n\t\t\tdata.push(item);\n\t\t}\n\n\t\toptions.data = data;\n\n\t\tthis.dispatchExternal(\"htmlImported\");\n\t}\n\n\t//extract tabulator attribute options\n\t_extractOptions(element, options, defaultOptions){\n\t\tvar attributes = element.attributes;\n\t\tvar optionsArr = defaultOptions ? Object.keys(defaultOptions) : Object.keys(options);\n\t\tvar optionsList = {};\n\n\t\toptionsArr.forEach((item) => {\n\t\t\toptionsList[item.toLowerCase()] = item;\n\t\t});\n\n\t\tfor(var index in attributes){\n\t\t\tvar attrib = attributes[index];\n\t\t\tvar name;\n\n\t\t\tif(attrib && typeof attrib == \"object\" && attrib.name && attrib.name.indexOf(\"tabulator-\") === 0){\n\t\t\t\tname = attrib.name.replace(\"tabulator-\", \"\");\n\n\t\t\t\tif(typeof optionsList[name] !== \"undefined\"){\n\t\t\t\t\toptions[optionsList[name]] = this._attribValue(attrib.value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t//get value of attribute\n\t_attribValue(value){\n\t\tif(value === \"true\"){\n\t\t\treturn true;\n\t\t}\n\n\t\tif(value === \"false\"){\n\t\t\treturn false;\n\t\t}\n\n\t\treturn value;\n\t}\n\n\t//find column if it has already been defined\n\t_findCol(title){\n\t\tvar match = this.table.options.columns.find((column) => {\n\t\t\treturn column.title === title;\n\t\t});\n\n\t\treturn match || false;\n\t}\n\n\t//extract column from headers\n\t_extractHeaders(headers, rows){\n\t\tfor(var index = 0; index < headers.length; index++){\n\t\t\tvar header = headers[index],\n\t\t\texists = false,\n\t\t\tcol = this._findCol(header.textContent),\n\t\t\twidth;\n\n\t\t\tif(col){\n\t\t\t\texists = true;\n\t\t\t}else {\n\t\t\t\tcol = {title:header.textContent.trim()};\n\t\t\t}\n\n\t\t\tif(!col.field) {\n\t\t\t\tcol.field = header.textContent.trim().toLowerCase().replaceAll(\" \", \"_\");\n\t\t\t}\n\n\t\t\twidth = header.getAttribute(\"width\");\n\n\t\t\tif(width && !col.width)\t{\n\t\t\t\tcol.width = width;\n\t\t\t}\n\n\t\t\t//check for Tabulator inline options\n\t\t\tthis._extractOptions(header, col, this.table.columnManager.optionsList.registeredDefaults);\n\n\t\t\tthis.fieldIndex[index] = col.field;\n\n\t\t\tif(col.field == this.table.options.index){\n\t\t\t\tthis.hasIndex = true;\n\t\t\t}\n\n\t\t\tif(!exists){\n\t\t\t\tthis.table.options.columns.push(col);\n\t\t\t}\n\n\t\t}\n\t}\n\n\t//generate blank headers\n\t_generateBlankHeaders(headers, rows){\n\t\tfor(var index = 0; index < headers.length; index++){\n\t\t\tvar header = headers[index],\n\t\t\tcol = {title:\"\", field:\"col\" + index};\n\n\t\t\tthis.fieldIndex[index] = col.field;\n\n\t\t\tvar width = header.getAttribute(\"width\");\n\n\t\t\tif(width){\n\t\t\t\tcol.width = width;\n\t\t\t}\n\n\t\t\tthis.table.options.columns.push(col);\n\t\t}\n\t}\n}\n\nfunction csv(input){\n\tvar data = [],\n\trow = 0, \n\tcol = 0,\n\tinQuote = false;\n \n\t//Iterate over each character\n\tfor (let index = 0; index < input.length; index++) {\n\t\tlet char = input[index], \n\t\tnextChar = input[index+1]; \n \n\t\t//Initialize empty row\n\t\tif(!data[row]){\n\t\t\tdata[row] = [];\n\t\t}\n\n\t\t//Initialize empty column\n\t\tif(!data[row][col]){\n\t\t\tdata[row][col] = \"\";\n\t\t}\n \n\t\t//Handle quotation mark inside string\n\t\tif (char == '\"' && inQuote && nextChar == '\"') { \n\t\t\tdata[row][col] += char; \n\t\t\tindex++;\n\t\t\tcontinue; \n\t\t}\n \n\t\t//Begin / End Quote\n\t\tif (char == '\"') { \n\t\t\tinQuote = !inQuote;\n\t\t\tcontinue;\n\t\t}\n \n\t\t//Next column (if not in quote)\n\t\tif (char == ',' && !inQuote) { \n\t\t\tcol++;\n\t\t\tcontinue; \n\t\t}\n \n\t\t//New row if new line and not in quote (CRLF) \n\t\tif (char == '\\r' && nextChar == '\\n' && !inQuote) { \n\t\t\tcol = 0; \n\t\t\trow++; \n\t\t\tindex++; \n\t\t\tcontinue; \n\t\t}\n \n\t\t//New row if new line and not in quote (CR or LF) \n\t\tif ((char == '\\r' || char == '\\n') && !inQuote) { \n\t\t\tcol = 0;\n\t\t\trow++;\n\t\t\tcontinue; \n\t\t}\n\n\t\t//Normal Character, append to column\n\t\tdata[row][col] += char;\n\t}\n\n\treturn data;\n}\n\nfunction json(input){\n\ttry {\n\t\treturn JSON.parse(input);\n\t} catch(e) {\n\t\tconsole.warn(\"JSON Import Error - File contents is invalid JSON\", e);\n\t\treturn Promise.reject();\n\t}\n}\n\nfunction array$1 (input){\n\treturn input;\n}\n\nfunction xlsx(input){\r\n\tvar XLSXLib = this.dependencyRegistry.lookup(\"XLSX\"),\r\n\tworkbook2 = XLSXLib.read(input),\r\n\tsheet = workbook2.Sheets[workbook2.SheetNames[0]];\r\n\t\r\n\treturn XLSXLib.utils.sheet_to_json(sheet, {header: 1 });\r\n}\n\nvar defaultImporters = {\n\tcsv:csv,\n\tjson:json,\n\tarray:array$1,\n\txlsx:xlsx,\n};\n\nclass Import extends Module{\n\t\n\tstatic moduleName = \"import\";\n\t\n\t//load defaults\n\tstatic importers = defaultImporters;\n\t\n\tconstructor(table){\n\t\tsuper(table);\n\t\t\n\t\tthis.registerTableOption(\"importFormat\");\n\t\tthis.registerTableOption(\"importReader\", \"text\");\n\t\tthis.registerTableOption(\"importHeaderTransform\");\n\t\tthis.registerTableOption(\"importValueTransform\");\n\t\tthis.registerTableOption(\"importDataValidator\");\n\t\tthis.registerTableOption(\"importFileValidator\");\n\t}\n\t\n\tinitialize(){\n\t\tthis.registerTableFunction(\"import\", this.importFromFile.bind(this));\n\t\t\n\t\tif(this.table.options.importFormat){\n\t\t\tthis.subscribe(\"data-loading\", this.loadDataCheck.bind(this), 10);\n\t\t\tthis.subscribe(\"data-load\", this.loadData.bind(this), 10);\n\t\t}\n\t}\n\t\n\tloadDataCheck(data){\n\t\treturn this.table.options.importFormat && (typeof data === \"string\" || (Array.isArray(data) && data.length && Array.isArray(data)));\n\t}\n\t\n\tloadData(data, params, config, silent, previousData){\n\t\treturn this.importData(this.lookupImporter(), data)\n\t\t\t.then(this.structureData.bind(this))\n\t\t\t.catch((err) => {\n\t\t\t\tconsole.error(\"Import Error:\", err || \"Unable to import data\");\n\t\t\t\treturn Promise.reject(err);\n\t\t\t});\n\t}\n\t\n\tlookupImporter(importFormat){\n\t\tvar importer;\n\t\t\n\t\tif(!importFormat){\n\t\t\timportFormat = this.table.options.importFormat;\n\t\t}\n\t\t\n\t\tif(typeof importFormat === \"string\"){\n\t\t\timporter = Import.importers[importFormat];\n\t\t}else {\n\t\t\timporter = importFormat;\n\t\t}\n\t\t\n\t\tif(!importer){\n\t\t\tconsole.error(\"Import Error - Importer not found:\", importFormat);\n\t\t}\n\t\t\n\t\treturn importer;\n\t}\n\t\n\timportFromFile(importFormat, extension, importReader){\n\t\tvar importer = this.lookupImporter(importFormat);\n\t\t\n\t\tif(importer){\n\t\t\treturn this.pickFile(extension, importReader)\n\t\t\t\t.then(this.importData.bind(this, importer))\n\t\t\t\t.then(this.structureData.bind(this))\n\t\t\t\t.then(this.mutateData.bind(this))\n\t\t\t\t.then(this.validateData.bind(this))\n\t\t\t\t.then(this.setData.bind(this))\n\t\t\t\t.catch((err) => {\n\t\t\t\t\tthis.dispatch(\"import-error\", err);\n\t\t\t\t\tthis.dispatchExternal(\"importError\", err);\n\t\t\t\t\t\n\t\t\t\t\tconsole.error(\"Import Error:\", err || \"Unable to import file\");\n\t\t\t\t\t\n\t\t\t\t\tthis.table.dataLoader.alertError();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis.table.dataLoader.clearAlert();\n\t\t\t\t\t}, 3000);\n\t\t\t\t\t\n\t\t\t\t\treturn Promise.reject(err);\n\t\t\t\t});\n\t\t}\n\t}\n\t\n\tpickFile(extensions, importReader){\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tvar input = document.createElement(\"input\");\n\t\t\tinput.type = \"file\";\n\t\t\tinput.accept = extensions;\n\t\t\t\n\t\t\tinput.addEventListener(\"change\", (e) => {\n\t\t\t\tvar file = input.files[0],\n\t\t\t\treader = new FileReader(),\n\t\t\t\tvalid = this.validateFile(file);\n\n\t\t\t\tif(valid === true){\n\t\t\t\t\n\t\t\t\t\tthis.dispatch(\"import-importing\", input.files);\n\t\t\t\t\tthis.dispatchExternal(\"importImporting\", input.files);\n\t\t\t\t\n\t\t\t\t\tswitch(importReader || this.table.options.importReader){\n\t\t\t\t\t\tcase \"buffer\":\n\t\t\t\t\t\t\treader.readAsArrayBuffer(file);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\t\tcase \"binary\":\n\t\t\t\t\t\t\treader.readAsBinaryString(file);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\t\tcase \"url\":\n\t\t\t\t\t\t\treader.readAsDataURL(file);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\t\tcase \"text\":\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treader.readAsText(file);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treader.onload = (e) => {\n\t\t\t\t\t\tresolve(reader.result);\n\t\t\t\t\t};\n\t\t\t\t\t\n\t\t\t\t\treader.onerror = (e) => {\n\t\t\t\t\t\tconsole.warn(\"File Load Error - Unable to read file\");\n\t\t\t\t\t\treject(e);\n\t\t\t\t\t};\n\t\t\t\t}else {\n\t\t\t\t\treject(valid);\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tthis.dispatch(\"import-choose\");\n\t\t\tthis.dispatchExternal(\"importChoose\");\n\t\t\tinput.click();\n\t\t});\n\t}\n\t\n\timportData(importer, fileContents){\n\t\tvar data;\n\t\t\n\t\tthis.table.dataLoader.alertLoader();\n\t\t\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tsetTimeout(() => {\n\t\t\t\tdata = importer.call(this.table, fileContents);\n\t\t\t\t\n\t\t\t\tif(data instanceof Promise){\n\t\t\t\t\tresolve(data);\n\t\t\t\t}else {\n\t\t\t\t\tdata ? resolve(data) : reject();\n\t\t\t\t}\n\t\t\t}, 10);\n\t\t});\n\t}\n\t\n\tstructureData(parsedData){\n\t\tvar data = [];\n\t\t\n\t\tif(Array.isArray(parsedData) && parsedData.length && Array.isArray(parsedData[0])){\n\t\t\tif(this.table.options.autoColumns){\n\t\t\t\tdata = this.structureArrayToObject(parsedData);\n\t\t\t}else {\n\t\t\t\tdata = this.structureArrayToColumns(parsedData);\n\t\t\t}\n\t\t\t\n\t\t\treturn data;\n\t\t}else {\n\t\t\treturn parsedData;\n\t\t}\n\t}\n\t\n\tmutateData(data){\n\t\tvar output = [];\n\t\t\n\t\tif(Array.isArray(data)){\n\t\t\tdata.forEach((row) => {\n\t\t\t\toutput.push(this.table.modules.mutator.transformRow(row, \"import\"));\n\t\t\t});\n\t\t}else {\n\t\t\toutput = data;\n\t\t}\n\t\t\n\t\treturn output;\n\t}\n\t\n\ttransformHeader(headers){\n\t\tvar output = [];\n\t\t\n\t\tif(this.table.options.importHeaderTransform){\n\t\t\theaders.forEach((item) => {\n\t\t\t\toutput.push(this.table.options.importHeaderTransform.call(this.table, item, headers));\n\t\t\t});\n\t\t}else {\n\t\t\treturn headers;\n\t\t}\n\t\t\n\t\treturn output;\n\t}\n\t\n\ttransformData(row){\n\t\tvar output = [];\n\n\t\tif(this.table.options.importValueTransform){\n\t\t\trow.forEach((item) => {\n\t\t\t\toutput.push(this.table.options.importValueTransform.call(this.table, item, row));\n\t\t\t});\n\t\t}else {\n\t\t\treturn row;\n\t\t}\n\t\t\n\t\treturn output;\n\t}\n\t\n\tstructureArrayToObject(parsedData){\n\t\tvar columns = this.transformHeader(parsedData.shift());\t\n\t\t\n\t\tvar data = parsedData.map((values) => {\n\t\t\tvar row = {};\n\n\t\t\tvalues = this.transformData(values);\n\t\t\t\n\t\t\tcolumns.forEach((key, i) => {\n\t\t\t\trow[key] = values[i];\n\t\t\t});\n\t\t\t\n\t\t\treturn row;\n\t\t});\n\t\t\n\t\treturn data;\n\t}\n\t\n\tstructureArrayToColumns(parsedData){\n\t\tvar data = [],\n\t\tfirstRow = this.transformHeader(parsedData[0]),\n\t\tcolumns = this.table.getColumns();\n\t\t\n\t\t//remove first row if it is the column names\n\t\tif(columns[0] && firstRow[0]){\n\t\t\tif(columns[0].getDefinition().title === firstRow[0]){\n\t\t\t\tparsedData.shift();\n\t\t\t}\n\t\t}\n\t\t\n\t\t//convert row arrays to objects\n\t\tparsedData.forEach((rowData) => {\n\t\t\tvar row = {};\n\n\t\t\trowData = this.transformData(rowData);\n\t\t\t\n\t\t\trowData.forEach((value, index) => {\n\t\t\t\tvar column = columns[index];\n\t\t\t\t\n\t\t\t\tif(column){\n\t\t\t\t\trow[column.getField()] = value;\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tdata.push(row);\n\t\t});\n\t\t\n\t\treturn data;\n\t}\n\n\tvalidateFile(file){\n\t\tif(this.table.options.importFileValidator){\n\t\t\treturn this.table.options.importFileValidator.call(this.table, file);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tvalidateData(data){\n\t\tvar result;\n\n\t\tif(this.table.options.importDataValidator){\n\t\t\tresult = this.table.options.importDataValidator.call(this.table, data);\n\n\t\t\tif(result === true){\n\t\t\t\treturn data;\n\t\t\t}else {\n\t\t\t\treturn Promise.reject(result);\n\t\t\t}\n\t\t}\n\n\t\treturn data;\n\t}\n\t\n\tsetData(data){\n\t\tthis.dispatch(\"import-imported\", data);\n\t\tthis.dispatchExternal(\"importImported\", data);\n\t\t\n\t\tthis.table.dataLoader.clearAlert();\n\t\t\n\t\treturn this.table.setData(data);\n\t}\n}\n\nclass Interaction extends Module{\n\n\tstatic moduleName = \"interaction\";\n\n\tconstructor(table){\n\t\tsuper(table);\n\n\t\tthis.eventMap = {\n\t\t\t//row events\n\t\t\trowClick:\"row-click\",\n\t\t\trowDblClick:\"row-dblclick\",\n\t\t\trowContext:\"row-contextmenu\",\n\t\t\trowMouseEnter:\"row-mouseenter\",\n\t\t\trowMouseLeave:\"row-mouseleave\",\n\t\t\trowMouseOver:\"row-mouseover\",\n\t\t\trowMouseOut:\"row-mouseout\",\n\t\t\trowMouseMove:\"row-mousemove\",\n\t\t\trowMouseDown:\"row-mousedown\",\n\t\t\trowMouseUp:\"row-mouseup\",\n\t\t\trowTap:\"row\",\n\t\t\trowDblTap:\"row\",\n\t\t\trowTapHold:\"row\",\n\n\t\t\t//cell events\n\t\t\tcellClick:\"cell-click\",\n\t\t\tcellDblClick:\"cell-dblclick\",\n\t\t\tcellContext:\"cell-contextmenu\",\n\t\t\tcellMouseEnter:\"cell-mouseenter\",\n\t\t\tcellMouseLeave:\"cell-mouseleave\",\n\t\t\tcellMouseOver:\"cell-mouseover\",\n\t\t\tcellMouseOut:\"cell-mouseout\",\n\t\t\tcellMouseMove:\"cell-mousemove\",\n\t\t\tcellMouseDown:\"cell-mousedown\",\n\t\t\tcellMouseUp:\"cell-mouseup\",\n\t\t\tcellTap:\"cell\",\n\t\t\tcellDblTap:\"cell\",\n\t\t\tcellTapHold:\"cell\",\n\n\t\t\t//column header events\n\t\t\theaderClick:\"column-click\",\n\t\t\theaderDblClick:\"column-dblclick\",\n\t\t\theaderContext:\"column-contextmenu\",\n\t\t\theaderMouseEnter:\"column-mouseenter\",\n\t\t\theaderMouseLeave:\"column-mouseleave\",\n\t\t\theaderMouseOver:\"column-mouseover\",\n\t\t\theaderMouseOut:\"column-mouseout\",\n\t\t\theaderMouseMove:\"column-mousemove\",\n\t\t\theaderMouseDown:\"column-mousedown\",\n\t\t\theaderMouseUp:\"column-mouseup\",\n\t\t\theaderTap:\"column\",\n\t\t\theaderDblTap:\"column\",\n\t\t\theaderTapHold:\"column\",\n\n\t\t\t//group header\n\t\t\tgroupClick:\"group-click\",\n\t\t\tgroupDblClick:\"group-dblclick\",\n\t\t\tgroupContext:\"group-contextmenu\",\n\t\t\tgroupMouseEnter:\"group-mouseenter\",\n\t\t\tgroupMouseLeave:\"group-mouseleave\",\n\t\t\tgroupMouseOver:\"group-mouseover\",\n\t\t\tgroupMouseOut:\"group-mouseout\",\n\t\t\tgroupMouseMove:\"group-mousemove\",\n\t\t\tgroupMouseDown:\"group-mousedown\",\n\t\t\tgroupMouseUp:\"group-mouseup\",\n\t\t\tgroupTap:\"group\",\n\t\t\tgroupDblTap:\"group\",\n\t\t\tgroupTapHold:\"group\",\n\t\t};\n\n\t\tthis.subscribers = {};\n\n\t\tthis.touchSubscribers = {};\n\n\t\tthis.columnSubscribers = {};\n\n\t\tthis.touchWatchers = {\n\t\t\trow:{\n\t\t\t\ttap:null,\n\t\t\t\ttapDbl:null,\n\t\t\t\ttapHold:null,\n\t\t\t},\n\t\t\tcell:{\n\t\t\t\ttap:null,\n\t\t\t\ttapDbl:null,\n\t\t\t\ttapHold:null,\n\t\t\t},\n\t\t\tcolumn:{\n\t\t\t\ttap:null,\n\t\t\t\ttapDbl:null,\n\t\t\t\ttapHold:null,\n\t\t\t},\n\t\t\tgroup:{\n\t\t\t\ttap:null,\n\t\t\t\ttapDbl:null,\n\t\t\t\ttapHold:null,\n\t\t\t}\n\t\t};\n\n\t\tthis.registerColumnOption(\"headerClick\");\n\t\tthis.registerColumnOption(\"headerDblClick\");\n\t\tthis.registerColumnOption(\"headerContext\");\n\t\tthis.registerColumnOption(\"headerMouseEnter\");\n\t\tthis.registerColumnOption(\"headerMouseLeave\");\n\t\tthis.registerColumnOption(\"headerMouseOver\");\n\t\tthis.registerColumnOption(\"headerMouseOut\");\n\t\tthis.registerColumnOption(\"headerMouseMove\");\n\t\tthis.registerColumnOption(\"headerMouseDown\");\n\t\tthis.registerColumnOption(\"headerMouseUp\");\n\t\tthis.registerColumnOption(\"headerTap\");\n\t\tthis.registerColumnOption(\"headerDblTap\");\n\t\tthis.registerColumnOption(\"headerTapHold\");\n\n\t\tthis.registerColumnOption(\"cellClick\");\n\t\tthis.registerColumnOption(\"cellDblClick\");\n\t\tthis.registerColumnOption(\"cellContext\");\n\t\tthis.registerColumnOption(\"cellMouseEnter\");\n\t\tthis.registerColumnOption(\"cellMouseLeave\");\n\t\tthis.registerColumnOption(\"cellMouseOver\");\n\t\tthis.registerColumnOption(\"cellMouseOut\");\n\t\tthis.registerColumnOption(\"cellMouseMove\");\n\t\tthis.registerColumnOption(\"cellMouseDown\");\n\t\tthis.registerColumnOption(\"cellMouseUp\");\n\t\tthis.registerColumnOption(\"cellTap\");\n\t\tthis.registerColumnOption(\"cellDblTap\");\n\t\tthis.registerColumnOption(\"cellTapHold\");\n\n\t}\n\n\tinitialize(){\n\t\tthis.initializeExternalEvents();\n\n\t\tthis.subscribe(\"column-init\", this.initializeColumn.bind(this));\n\t\tthis.subscribe(\"cell-dblclick\", this.cellContentsSelectionFixer.bind(this));\n\t\tthis.subscribe(\"scroll-horizontal\", this.clearTouchWatchers.bind(this));\n\t\tthis.subscribe(\"scroll-vertical\", this.clearTouchWatchers.bind(this));\n\t}\n\n\tclearTouchWatchers(){\n\t\tvar types = Object.values(this.touchWatchers);\n\n\t\ttypes.forEach((type) => {\n\t\t\tfor(let key in type){\n\t\t\t\ttype[key] = null;\n\t\t\t}\n\t\t});\n\t}\n\t\t\n\tcellContentsSelectionFixer(e, cell){\n\t\tvar range;\n\n\t\tif(this.table.modExists(\"edit\")){\n\t\t\tif (this.table.modules.edit.currentCell === cell){\n\t\t\t\treturn; //prevent instant selection of editor content\n\t\t\t}\n\t\t}\n\n\t\te.preventDefault();\n\n\t\ttry{\n\t\t\tif (document.selection) { // IE\n\t\t\t\trange = document.body.createTextRange();\n\t\t\t\trange.moveToElementText(cell.getElement());\n\t\t\t\trange.select();\n\t\t\t} else if (window.getSelection) {\n\t\t\t\trange = document.createRange();\n\t\t\t\trange.selectNode(cell.getElement());\n\t\t\t\twindow.getSelection().removeAllRanges();\n\t\t\t\twindow.getSelection().addRange(range);\n\t\t\t}\n\t\t}catch(e){}\n\t}\n\n\tinitializeExternalEvents(){\n\t\tfor(let key in this.eventMap){\n\t\t\tthis.subscriptionChangeExternal(key, this.subscriptionChanged.bind(this, key));\n\t\t}\n\t}\n\n\tsubscriptionChanged(key, added){\n\t\tif(added){\n\t\t\tif(!this.subscribers[key]){\n\t\t\t\tif(this.eventMap[key].includes(\"-\")){\n\t\t\t\t\tthis.subscribers[key] = this.handle.bind(this, key);\n\t\t\t\t\tthis.subscribe(this.eventMap[key], this.subscribers[key]);\n\t\t\t\t}else {\n\t\t\t\t\tthis.subscribeTouchEvents(key);\n\t\t\t\t}\n\t\t\t}\n\t\t}else {\n\t\t\tif(this.eventMap[key].includes(\"-\")){\n\t\t\t\tif(this.subscribers[key] && !this.columnSubscribers[key] && !this.subscribedExternal(key)){\n\t\t\t\t\tthis.unsubscribe(this.eventMap[key], this.subscribers[key]);\n\t\t\t\t\tdelete this.subscribers[key];\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tthis.unsubscribeTouchEvents(key);\n\t\t\t}\n\t\t}\n\t}\n\n\n\tsubscribeTouchEvents(key){\n\t\tvar type = this.eventMap[key];\n\n\t\tif(!this.touchSubscribers[type + \"-touchstart\"]){\n\t\t\tthis.touchSubscribers[type + \"-touchstart\"] = this.handleTouch.bind(this, type, \"start\");\n\t\t\tthis.touchSubscribers[type + \"-touchend\"] = this.handleTouch.bind(this, type, \"end\");\n\n\t\t\tthis.subscribe(type + \"-touchstart\", this.touchSubscribers[type + \"-touchstart\"]);\n\t\t\tthis.subscribe(type + \"-touchend\", this.touchSubscribers[type + \"-touchend\"]);\n\t\t}\n\n\t\tthis.subscribers[key] = true;\n\t}\n\n\tunsubscribeTouchEvents(key){\n\t\tvar noTouch = true,\n\t\ttype = this.eventMap[key];\n\n\t\tif(this.subscribers[key] && !this.subscribedExternal(key)){\n\t\t\tdelete this.subscribers[key];\n\n\t\t\tfor(let i in this.eventMap){\n\t\t\t\tif(this.eventMap[i] === type){\n\t\t\t\t\tif(this.subscribers[i]){\n\t\t\t\t\t\tnoTouch = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(noTouch){\n\t\t\t\tthis.unsubscribe(type + \"-touchstart\", this.touchSubscribers[type + \"-touchstart\"]);\n\t\t\t\tthis.unsubscribe(type + \"-touchend\", this.touchSubscribers[type + \"-touchend\"]);\n\n\t\t\t\tdelete this.touchSubscribers[type + \"-touchstart\"];\n\t\t\t\tdelete this.touchSubscribers[type + \"-touchend\"];\n\t\t\t}\n\t\t}\n\t}\n\n\tinitializeColumn(column){\n\t\tvar def = column.definition;\n\n\t\tfor(let key in this.eventMap){\n\t\t\tif(def[key]){\n\t\t\t\tthis.subscriptionChanged(key, true);\n\n\t\t\t\tif(!this.columnSubscribers[key]){\n\t\t\t\t\tthis.columnSubscribers[key] = [];\n\t\t\t\t}\n\n\t\t\t\tthis.columnSubscribers[key].push(column);\n\t\t\t}\n\t\t}\n\t}\n\n\thandle(action, e, component){\n\t\tthis.dispatchEvent(action, e, component);\n\t}\n\n\thandleTouch(type, action, e, component){\n\t\tvar watchers = this.touchWatchers[type];\n\n\t\tif(type === \"column\"){\n\t\t\ttype = \"header\";\n\t\t}\n\n\t\tswitch(action){\n\t\t\tcase \"start\":\n\t\t\t\twatchers.tap = true;\n\n\t\t\t\tclearTimeout(watchers.tapHold);\n\n\t\t\t\twatchers.tapHold = setTimeout(() => {\n\t\t\t\t\tclearTimeout(watchers.tapHold);\n\t\t\t\t\twatchers.tapHold = null;\n\n\t\t\t\t\twatchers.tap = null;\n\t\t\t\t\tclearTimeout(watchers.tapDbl);\n\t\t\t\t\twatchers.tapDbl = null;\n\n\t\t\t\t\tthis.dispatchEvent(type + \"TapHold\", e, component);\n\t\t\t\t}, 1000);\n\t\t\t\tbreak;\n\n\t\t\tcase \"end\":\n\t\t\t\tif(watchers.tap){\n\n\t\t\t\t\twatchers.tap = null;\n\t\t\t\t\tthis.dispatchEvent(type + \"Tap\", e, component);\n\t\t\t\t}\n\n\t\t\t\tif(watchers.tapDbl){\n\t\t\t\t\tclearTimeout(watchers.tapDbl);\n\t\t\t\t\twatchers.tapDbl = null;\n\n\t\t\t\t\tthis.dispatchEvent(type + \"DblTap\", e, component);\n\t\t\t\t}else {\n\t\t\t\t\twatchers.tapDbl = setTimeout(() => {\n\t\t\t\t\t\tclearTimeout(watchers.tapDbl);\n\t\t\t\t\t\twatchers.tapDbl = null;\n\t\t\t\t\t}, 300);\n\t\t\t\t}\n\n\t\t\t\tclearTimeout(watchers.tapHold);\n\t\t\t\twatchers.tapHold = null;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tdispatchEvent(action, e, component){\n\t\tvar componentObj = component.getComponent(),\n\t\tcallback;\n\n\t\tif(this.columnSubscribers[action]){\n\n\t\t\tif(component instanceof Cell){\n\t\t\t\tcallback = component.column.definition[action];\n\t\t\t}else if(component instanceof Column){\n\t\t\t\tcallback = component.definition[action];\n\t\t\t}\n\n\t\t\tif(callback){\n\t\t\t\tcallback(e, componentObj);\n\t\t\t}\n\t\t}\n\n\t\tthis.dispatchExternal(action, e, componentObj);\n\t}\n}\n\nvar defaultBindings = {\n\tnavPrev:\"shift + 9\",\n\tnavNext:9,\n\tnavUp:38,\n\tnavDown:40,\n\tnavLeft:37,\n\tnavRight:39,\n\tscrollPageUp:33,\n\tscrollPageDown:34,\n\tscrollToStart:36,\n\tscrollToEnd:35,\n};\n\nvar defaultActions = {\n\tkeyBlock:function(e){\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\t},\n\n\tscrollPageUp:function(e){\n\t\tvar rowManager = this.table.rowManager,\n\t\tnewPos = rowManager.scrollTop - rowManager.element.clientHeight;\n\n\t\te.preventDefault();\n\n\t\tif(rowManager.displayRowsCount){\n\t\t\tif(newPos >= 0){\n\t\t\t\trowManager.element.scrollTop = newPos;\n\t\t\t}else {\n\t\t\t\trowManager.scrollToRow(rowManager.getDisplayRows()[0]);\n\t\t\t}\n\t\t}\n\n\t\tthis.table.element.focus();\n\t},\n\n\tscrollPageDown:function(e){\n\t\tvar rowManager = this.table.rowManager,\n\t\tnewPos = rowManager.scrollTop + rowManager.element.clientHeight,\n\t\tscrollMax = rowManager.element.scrollHeight;\n\n\t\te.preventDefault();\n\n\t\tif(rowManager.displayRowsCount){\n\t\t\tif(newPos <= scrollMax){\n\t\t\t\trowManager.element.scrollTop = newPos;\n\t\t\t}else {\n\t\t\t\trowManager.scrollToRow(rowManager.getDisplayRows()[rowManager.displayRowsCount - 1]);\n\t\t\t}\n\t\t}\n\n\t\tthis.table.element.focus();\n\n\t},\n\n\tscrollToStart:function(e){\n\t\tvar rowManager = this.table.rowManager;\n\n\t\te.preventDefault();\n\n\t\tif(rowManager.displayRowsCount){\n\t\t\trowManager.scrollToRow(rowManager.getDisplayRows()[0]);\n\t\t}\n\n\t\tthis.table.element.focus();\n\t},\n\n\tscrollToEnd:function(e){\n\t\tvar rowManager = this.table.rowManager;\n\n\t\te.preventDefault();\n\n\t\tif(rowManager.displayRowsCount){\n\t\t\trowManager.scrollToRow(rowManager.getDisplayRows()[rowManager.displayRowsCount - 1]);\n\t\t}\n\n\t\tthis.table.element.focus();\n\t},\n\n\tnavPrev:function(e){\n\t\tthis.dispatch(\"keybinding-nav-prev\", e);\n\t},\n\n\tnavNext:function(e){\n\t\tthis.dispatch(\"keybinding-nav-next\", e);\n\t},\n\n\tnavLeft:function(e){\n\t\tthis.dispatch(\"keybinding-nav-left\", e);\n\t},\n\n\tnavRight:function(e){\n\t\tthis.dispatch(\"keybinding-nav-right\", e);\n\t},\n\n\tnavUp:function(e){\n\t\tthis.dispatch(\"keybinding-nav-up\", e);\n\t},\n\n\tnavDown:function(e){\n\t\tthis.dispatch(\"keybinding-nav-down\", e);\n\t},\n};\n\nclass Keybindings extends Module{\n\n\tstatic moduleName = \"keybindings\";\n\n\t//load defaults\n\tstatic bindings = defaultBindings;\n\tstatic actions = defaultActions;\n\n\tconstructor(table){\n\t\tsuper(table);\n\n\t\tthis.watchKeys = null;\n\t\tthis.pressedKeys = null;\n\t\tthis.keyupBinding = false;\n\t\tthis.keydownBinding = false;\n\n\t\tthis.registerTableOption(\"keybindings\", {}); //array for keybindings\n\t\tthis.registerTableOption(\"tabEndNewRow\", false); //create new row when tab to end of table\n\t}\n\n\tinitialize(){\n\t\tvar bindings = this.table.options.keybindings,\n\t\tmergedBindings = {};\n\n\t\tthis.watchKeys = {};\n\t\tthis.pressedKeys = [];\n\n\t\tif(bindings !== false){\n\t\t\tObject.assign(mergedBindings, Keybindings.bindings);\n\t\t\tObject.assign(mergedBindings, bindings);\n\n\t\t\tthis.mapBindings(mergedBindings);\n\t\t\tthis.bindEvents();\n\t\t}\n\n\t\tthis.subscribe(\"table-destroy\", this.clearBindings.bind(this));\n\t}\n\n\tmapBindings(bindings){\n\t\tfor(let key in bindings){\n\t\t\tif(Keybindings.actions[key]){\n\t\t\t\tif(bindings[key]){\n\t\t\t\t\tif(typeof bindings[key] !== \"object\"){\n\t\t\t\t\t\tbindings[key] = [bindings[key]];\n\t\t\t\t\t}\n\n\t\t\t\t\tbindings[key].forEach((binding) => {\n\t\t\t\t\t\tvar bindingList = Array.isArray(binding) ? binding : [binding];\n\t\t\t\t\t\t\n\t\t\t\t\t\tbindingList.forEach((item) => {\n\t\t\t\t\t\t\tthis.mapBinding(key, item);\n\t\t\t\t\t\t});\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tconsole.warn(\"Key Binding Error - no such action:\", key);\n\t\t\t}\n\t\t}\n\t}\n\n\tmapBinding(action, symbolsList){\n\t\tvar binding = {\n\t\t\taction: Keybindings.actions[action],\n\t\t\tkeys: [],\n\t\t\tctrl: false,\n\t\t\tshift: false,\n\t\t\tmeta: false,\n\t\t};\n\n\t\tvar symbols = symbolsList.toString().toLowerCase().split(\" \").join(\"\").split(\"+\");\n\n\t\tsymbols.forEach((symbol) => {\n\t\t\tswitch(symbol){\n\t\t\t\tcase \"ctrl\":\n\t\t\t\t\tbinding.ctrl = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"shift\":\n\t\t\t\t\tbinding.shift = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"meta\":\n\t\t\t\t\tbinding.meta = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tsymbol = isNaN(symbol) ? symbol.toUpperCase().charCodeAt(0) : parseInt(symbol);\n\t\t\t\t\tbinding.keys.push(symbol);\n\n\t\t\t\t\tif(!this.watchKeys[symbol]){\n\t\t\t\t\t\tthis.watchKeys[symbol] = [];\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.watchKeys[symbol].push(binding);\n\t\t\t}\n\t\t});\n\t}\n\n\tbindEvents(){\n\t\tvar self = this;\n\n\t\tthis.keyupBinding = function(e){\n\t\t\tvar code = e.keyCode;\n\t\t\tvar bindings = self.watchKeys[code];\n\n\t\t\tif(bindings){\n\n\t\t\t\tself.pressedKeys.push(code);\n\n\t\t\t\tbindings.forEach(function(binding){\n\t\t\t\t\tself.checkBinding(e, binding);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tthis.keydownBinding = function(e){\n\t\t\tvar code = e.keyCode;\n\t\t\tvar bindings = self.watchKeys[code];\n\n\t\t\tif(bindings){\n\n\t\t\t\tvar index = self.pressedKeys.indexOf(code);\n\n\t\t\t\tif(index > -1){\n\t\t\t\t\tself.pressedKeys.splice(index, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tthis.table.element.addEventListener(\"keydown\", this.keyupBinding);\n\n\t\tthis.table.element.addEventListener(\"keyup\", this.keydownBinding);\n\t}\n\n\tclearBindings(){\n\t\tif(this.keyupBinding){\n\t\t\tthis.table.element.removeEventListener(\"keydown\", this.keyupBinding);\n\t\t}\n\n\t\tif(this.keydownBinding){\n\t\t\tthis.table.element.removeEventListener(\"keyup\", this.keydownBinding);\n\t\t}\n\t}\n\n\tcheckBinding(e, binding){\n\t\tvar match = true;\n\n\t\tif(e.ctrlKey == binding.ctrl && e.shiftKey == binding.shift && e.metaKey == binding.meta){\n\t\t\tbinding.keys.forEach((key) => {\n\t\t\t\tvar index = this.pressedKeys.indexOf(key);\n\n\t\t\t\tif(index == -1){\n\t\t\t\t\tmatch = false;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif(match){\n\t\t\t\tbinding.action.call(this, e);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n}\n\nclass Menu extends Module{\n\n\tstatic moduleName = \"menu\";\n\t\n\tconstructor(table){\n\t\tsuper(table);\n\t\t\n\t\tthis.menuContainer = null;\n\t\tthis.nestedMenuBlock = false;\n\t\t\n\t\tthis.currentComponent = null;\n\t\tthis.rootPopup = null;\n\t\t\n\t\tthis.columnSubscribers = {};\n\t\t\n\t\t// this.registerTableOption(\"menuContainer\", undefined); //deprecated\n\t\t\n\t\tthis.registerTableOption(\"rowContextMenu\", false);\n\t\tthis.registerTableOption(\"rowClickMenu\", false);\n\t\tthis.registerTableOption(\"rowDblClickMenu\", false);\n\t\tthis.registerTableOption(\"groupContextMenu\", false);\n\t\tthis.registerTableOption(\"groupClickMenu\", false);\n\t\tthis.registerTableOption(\"groupDblClickMenu\", false);\n\t\t\n\t\tthis.registerColumnOption(\"headerContextMenu\");\n\t\tthis.registerColumnOption(\"headerClickMenu\");\n\t\tthis.registerColumnOption(\"headerDblClickMenu\");\n\t\tthis.registerColumnOption(\"headerMenu\");\n\t\tthis.registerColumnOption(\"headerMenuIcon\");\n\t\tthis.registerColumnOption(\"contextMenu\");\n\t\tthis.registerColumnOption(\"clickMenu\");\n\t\tthis.registerColumnOption(\"dblClickMenu\");\n\t\t\n\t}\n\t\n\tinitialize(){\n\t\tthis.deprecatedOptionsCheck();\n\t\tthis.initializeRowWatchers();\n\t\tthis.initializeGroupWatchers();\n\t\t\n\t\tthis.subscribe(\"column-init\", this.initializeColumn.bind(this));\n\t}\n\t\n\tdeprecatedOptionsCheck(){\n\t\t// if(!this.deprecationCheck(\"menuContainer\", \"popupContainer\")){\n\t\t// \tthis.table.options.popupContainer = this.table.options.menuContainer;\n\t\t// }\n\t}\t\n\t\n\tinitializeRowWatchers(){\n\t\tif(this.table.options.rowContextMenu){\n\t\t\tthis.subscribe(\"row-contextmenu\", this.loadMenuEvent.bind(this, this.table.options.rowContextMenu));\n\t\t\tthis.table.on(\"rowTapHold\", this.loadMenuEvent.bind(this, this.table.options.rowContextMenu));\n\t\t}\n\t\t\n\t\tif(this.table.options.rowClickMenu){\n\t\t\tthis.subscribe(\"row-click\", this.loadMenuEvent.bind(this, this.table.options.rowClickMenu));\n\t\t}\n\t\t\n\t\tif(this.table.options.rowDblClickMenu){\n\t\t\tthis.subscribe(\"row-dblclick\", this.loadMenuEvent.bind(this, this.table.options.rowDblClickMenu));\n\t\t}\n\t}\n\t\n\tinitializeGroupWatchers(){\n\t\tif(this.table.options.groupContextMenu){\n\t\t\tthis.subscribe(\"group-contextmenu\", this.loadMenuEvent.bind(this, this.table.options.groupContextMenu));\n\t\t\tthis.table.on(\"groupTapHold\", this.loadMenuEvent.bind(this, this.table.options.groupContextMenu));\n\t\t}\n\t\t\n\t\tif(this.table.options.groupClickMenu){\n\t\t\tthis.subscribe(\"group-click\", this.loadMenuEvent.bind(this, this.table.options.groupClickMenu));\n\t\t}\n\t\t\n\t\tif(this.table.options.groupDblClickMenu){\n\t\t\tthis.subscribe(\"group-dblclick\", this.loadMenuEvent.bind(this, this.table.options.groupDblClickMenu));\n\t\t}\n\t}\n\n\tinitializeColumn(column){\n\t\tvar\tdef = column.definition;\n\t\t\n\t\t//handle column events\n\t\tif(def.headerContextMenu && !this.columnSubscribers.headerContextMenu){\n\t\t\tthis.columnSubscribers.headerContextMenu = this.loadMenuTableColumnEvent.bind(this, \"headerContextMenu\");\n\t\t\tthis.subscribe(\"column-contextmenu\", this.columnSubscribers.headerContextMenu);\n\t\t\tthis.table.on(\"headerTapHold\", this.loadMenuTableColumnEvent.bind(this, \"headerContextMenu\"));\n\t\t}\n\t\t\n\t\tif(def.headerClickMenu && !this.columnSubscribers.headerClickMenu){\n\t\t\tthis.columnSubscribers.headerClickMenu = this.loadMenuTableColumnEvent.bind(this, \"headerClickMenu\");\n\t\t\tthis.subscribe(\"column-click\", this.columnSubscribers.headerClickMenu);\n\t\t}\n\t\t\n\t\tif(def.headerDblClickMenu && !this.columnSubscribers.headerDblClickMenu){\n\t\t\tthis.columnSubscribers.headerDblClickMenu = this.loadMenuTableColumnEvent.bind(this, \"headerDblClickMenu\");\n\t\t\tthis.subscribe(\"column-dblclick\", this.columnSubscribers.headerDblClickMenu);\n\t\t}\n\t\t\n\t\tif(def.headerMenu){\n\t\t\tthis.initializeColumnHeaderMenu(column);\n\t\t}\n\t\t\n\t\t//handle cell events\n\t\tif(def.contextMenu && !this.columnSubscribers.contextMenu){\n\t\t\tthis.columnSubscribers.contextMenu = this.loadMenuTableCellEvent.bind(this, \"contextMenu\");\n\t\t\tthis.subscribe(\"cell-contextmenu\", this.columnSubscribers.contextMenu);\n\t\t\tthis.table.on(\"cellTapHold\", this.loadMenuTableCellEvent.bind(this, \"contextMenu\"));\n\t\t}\n\t\t\n\t\tif(def.clickMenu && !this.columnSubscribers.clickMenu){\n\t\t\tthis.columnSubscribers.clickMenu = this.loadMenuTableCellEvent.bind(this, \"clickMenu\");\n\t\t\tthis.subscribe(\"cell-click\", this.columnSubscribers.clickMenu);\n\t\t}\n\t\t\n\t\tif(def.dblClickMenu && !this.columnSubscribers.dblClickMenu){\n\t\t\tthis.columnSubscribers.dblClickMenu = this.loadMenuTableCellEvent.bind(this, \"dblClickMenu\");\n\t\t\tthis.subscribe(\"cell-dblclick\", this.columnSubscribers.dblClickMenu);\n\t\t}\n\t}\n\t\n\tinitializeColumnHeaderMenu(column){\n\t\tvar icon = column.definition.headerMenuIcon,\n\t\theaderMenuEl;\n\t\t\n\t\theaderMenuEl = document.createElement(\"span\");\n\t\theaderMenuEl.classList.add(\"tabulator-header-popup-button\");\n\t\t\n\t\tif(icon){\n\t\t\tif(typeof icon === \"function\"){\n\t\t\t\ticon = icon(column.getComponent());\n\t\t\t}\n\t\t\t\n\t\t\tif(icon instanceof HTMLElement){\n\t\t\t\theaderMenuEl.appendChild(icon);\n\t\t\t}else {\n\t\t\t\theaderMenuEl.innerHTML = icon;\n\t\t\t}\n\t\t}else {\n\t\t\theaderMenuEl.innerHTML = \"&vellip;\";\n\t\t}\n\t\t\n\t\theaderMenuEl.addEventListener(\"click\", (e) => {\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\t\n\t\t\tthis.loadMenuEvent(column.definition.headerMenu, e, column);\n\t\t});\n\t\t\n\t\tcolumn.titleElement.insertBefore(headerMenuEl, column.titleElement.firstChild);\n\t}\n\t\n\tloadMenuTableCellEvent(option, e, cell){\n\t\tif(cell._cell){\n\t\t\tcell = cell._cell;\n\t\t}\n\t\t\n\t\tif(cell.column.definition[option]){\n\t\t\tthis.loadMenuEvent(cell.column.definition[option], e, cell);\n\t\t}\n\t}\n\t\n\tloadMenuTableColumnEvent(option, e, column){\n\t\tif(column._column){\n\t\t\tcolumn = column._column;\n\t\t}\n\t\t\n\t\tif(column.definition[option]){\n\t\t\tthis.loadMenuEvent(column.definition[option], e, column);\n\t\t}\n\t}\n\t\n\tloadMenuEvent(menu, e, component){\n\t\tif(component._group){\n\t\t\tcomponent = component._group;\n\t\t}else if(component._row){\n\t\t\tcomponent = component._row;\n\t\t}\n\t\t\n\t\tmenu = typeof menu == \"function\" ? menu.call(this.table, e, component.getComponent()) : menu;\n\t\t\n\t\tthis.loadMenu(e, component, menu);\n\t}\n\t\n\tloadMenu(e, component, menu, parentEl, parentPopup){\n\t\tvar touch = !(e instanceof MouseEvent),\t\t\n\t\tmenuEl = document.createElement(\"div\"),\n\t\tpopup;\n\t\t\n\t\tmenuEl.classList.add(\"tabulator-menu\");\n\t\t\n\t\tif(!touch){\n\t\t\te.preventDefault();\n\t\t}\n\t\t\n\t\t//abort if no menu set\n\t\tif(!menu || !menu.length){\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif(!parentEl){\n\t\t\tif(this.nestedMenuBlock){\n\t\t\t\t//abort if child menu already open\n\t\t\t\tif(this.rootPopup){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tthis.nestedMenuBlock = setTimeout(() => {\n\t\t\t\t\tthis.nestedMenuBlock = false;\n\t\t\t\t}, 100);\n\t\t\t}\n\t\t\t\n\t\t\tif(this.rootPopup){\n\t\t\t\tthis.rootPopup.hide();\t\n\t\t\t}\n\t\t\t\n\t\t\tthis.rootPopup = popup = this.popup(menuEl);\n\t\t\t\n\t\t}else {\n\t\t\tpopup = parentPopup.child(menuEl);\n\t\t}\n\t\t\n\t\tmenu.forEach((item) => {\n\t\t\tvar itemEl = document.createElement(\"div\"),\n\t\t\tlabel = item.label,\n\t\t\tdisabled = item.disabled;\n\t\t\t\n\t\t\tif(item.separator){\n\t\t\t\titemEl.classList.add(\"tabulator-menu-separator\");\n\t\t\t}else {\n\t\t\t\titemEl.classList.add(\"tabulator-menu-item\");\n\t\t\t\t\n\t\t\t\tif(typeof label == \"function\"){\n\t\t\t\t\tlabel = label.call(this.table, component.getComponent());\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(label instanceof Node){\n\t\t\t\t\titemEl.appendChild(label);\n\t\t\t\t}else {\n\t\t\t\t\titemEl.innerHTML = label;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(typeof disabled == \"function\"){\n\t\t\t\t\tdisabled = disabled.call(this.table, component.getComponent());\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(disabled){\n\t\t\t\t\titemEl.classList.add(\"tabulator-menu-item-disabled\");\n\t\t\t\t\titemEl.addEventListener(\"click\", (e) => {\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t});\n\t\t\t\t}else {\n\t\t\t\t\tif(item.menu && item.menu.length){\n\t\t\t\t\t\titemEl.addEventListener(\"click\", (e) => {\n\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\tthis.loadMenu(e, component, item.menu, itemEl, popup);\n\t\t\t\t\t\t});\n\t\t\t\t\t}else {\n\t\t\t\t\t\tif(item.action){\n\t\t\t\t\t\t\titemEl.addEventListener(\"click\", (e) => {\n\t\t\t\t\t\t\t\titem.action(e, component.getComponent());\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(item.menu && item.menu.length){\n\t\t\t\t\titemEl.classList.add(\"tabulator-menu-item-submenu\");\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tmenuEl.appendChild(itemEl);\n\t\t});\n\t\t\n\t\tmenuEl.addEventListener(\"click\", (e) => {\n\t\t\tif(this.rootPopup){\n\t\t\t\tthis.rootPopup.hide();\n\t\t\t}\n\t\t});\n\t\t\n\t\tpopup.show(parentEl || e);\n\t\t\n\t\tif(popup === this.rootPopup){\n\t\t\tthis.rootPopup.hideOnBlur(() => {\n\t\t\t\tthis.rootPopup = null;\n\t\t\t\t\n\t\t\t\tif(this.currentComponent){\n\t\t\t\t\tthis.dispatch(\"menu-closed\", menu, popup);\n\t\t\t\t\tthis.dispatchExternal(\"menuClosed\", this.currentComponent.getComponent());\n\t\t\t\t\tthis.currentComponent = null;\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tthis.currentComponent = component;\n\t\t\t\n\t\t\tthis.dispatch(\"menu-opened\", menu, popup);\n\t\t\tthis.dispatchExternal(\"menuOpened\", component.getComponent());\n\t\t}\n\t}\n}\n\nclass MoveColumns extends Module{\n\n\tstatic moduleName = \"moveColumn\";\n\t\n\tconstructor(table){\n\t\tsuper(table);\n\t\t\n\t\tthis.placeholderElement = this.createPlaceholderElement();\n\t\tthis.hoverElement = false; //floating column header element\n\t\tthis.checkTimeout = false; //click check timeout holder\n\t\tthis.checkPeriod = 250; //period to wait on mousedown to consider this a move and not a click\n\t\tthis.moving = false; //currently moving column\n\t\tthis.toCol = false; //destination column\n\t\tthis.toColAfter = false; //position of moving column relative to the destination column\n\t\tthis.startX = 0; //starting position within header element\n\t\tthis.autoScrollMargin = 40; //auto scroll on edge when within margin\n\t\tthis.autoScrollStep = 5; //auto scroll distance in pixels\n\t\tthis.autoScrollTimeout = false; //auto scroll timeout\n\t\tthis.touchMove = false;\n\t\t\n\t\tthis.moveHover = this.moveHover.bind(this);\n\t\tthis.endMove = this.endMove.bind(this);\n\t\t\n\t\tthis.registerTableOption(\"movableColumns\", false); //enable movable columns\n\t}\n\t\n\tcreatePlaceholderElement(){\n\t\tvar el = document.createElement(\"div\");\n\t\t\n\t\tel.classList.add(\"tabulator-col\");\n\t\tel.classList.add(\"tabulator-col-placeholder\");\n\t\t\n\t\treturn el;\n\t}\n\t\n\tinitialize(){\n\t\tif(this.table.options.movableColumns){\n\t\t\tthis.subscribe(\"column-init\", this.initializeColumn.bind(this));\n\t\t\tthis.subscribe(\"alert-show\", this.abortMove.bind(this));\n\t\t}\n\t}\n\n\tabortMove(){\n\t\tclearTimeout(this.checkTimeout);\n\t}\n\t\n\tinitializeColumn(column){\n\t\tvar self = this,\n\t\tconfig = {},\n\t\tcolEl;\n\n\t\tif(!column.modules.frozen && !column.isGroup && !column.isRowHeader){\n\t\t\tcolEl = column.getElement();\n\t\t\t\n\t\t\tconfig.mousemove = function(e){\n\t\t\t\tif(column.parent === self.moving.parent){\n\t\t\t\t\tif((((self.touchMove ? e.touches[0].pageX : e.pageX) - Helpers.elOffset(colEl).left) + self.table.columnManager.contentsElement.scrollLeft) > (column.getWidth() / 2)){\n\t\t\t\t\t\tif(self.toCol !== column || !self.toColAfter){\n\t\t\t\t\t\t\tcolEl.parentNode.insertBefore(self.placeholderElement, colEl.nextSibling);\n\t\t\t\t\t\t\tself.moveColumn(column, true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}else {\n\t\t\t\t\t\tif(self.toCol !== column || self.toColAfter){\n\t\t\t\t\t\t\tcolEl.parentNode.insertBefore(self.placeholderElement, colEl);\n\t\t\t\t\t\t\tself.moveColumn(column, false);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}.bind(self);\n\t\t\t\n\t\t\tcolEl.addEventListener(\"mousedown\", function(e){\n\t\t\t\tself.touchMove = false;\n\t\t\t\tif(e.which === 1){\n\t\t\t\t\tself.checkTimeout = setTimeout(function(){\n\t\t\t\t\t\tself.startMove(e, column);\n\t\t\t\t\t}, self.checkPeriod);\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tcolEl.addEventListener(\"mouseup\", function(e){\n\t\t\t\tif(e.which === 1){\n\t\t\t\t\tif(self.checkTimeout){\n\t\t\t\t\t\tclearTimeout(self.checkTimeout);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tself.bindTouchEvents(column);\n\t\t}\n\t\t\n\t\tcolumn.modules.moveColumn = config;\n\t}\n\t\n\tbindTouchEvents(column){\n\t\tvar colEl = column.getElement(),\n\t\tstartXMove = false, //shifting center position of the cell\n\t\tnextCol, prevCol, nextColWidth, prevColWidth, nextColWidthLast, prevColWidthLast;\n\t\t\n\t\tcolEl.addEventListener(\"touchstart\", (e) => {\n\t\t\tthis.checkTimeout = setTimeout(() => {\n\t\t\t\tthis.touchMove = true;\n\t\t\t\tnextCol = column.nextColumn();\n\t\t\t\tnextColWidth = nextCol ? nextCol.getWidth()/2 : 0;\n\t\t\t\tprevCol = column.prevColumn();\n\t\t\t\tprevColWidth = prevCol ? prevCol.getWidth()/2 : 0;\n\t\t\t\tnextColWidthLast = 0;\n\t\t\t\tprevColWidthLast = 0;\n\t\t\t\tstartXMove = false;\n\t\t\t\t\n\t\t\t\tthis.startMove(e, column);\n\t\t\t}, this.checkPeriod);\n\t\t}, {passive: true});\n\t\t\n\t\tcolEl.addEventListener(\"touchmove\", (e) => {\n\t\t\tvar diff, moveToCol;\n\t\t\t\n\t\t\tif(this.moving){\n\t\t\t\tthis.moveHover(e);\n\t\t\t\t\n\t\t\t\tif(!startXMove){\n\t\t\t\t\tstartXMove = e.touches[0].pageX;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tdiff = e.touches[0].pageX - startXMove;\n\t\t\t\t\n\t\t\t\tif(diff > 0){\n\t\t\t\t\tif(nextCol && diff - nextColWidthLast > nextColWidth){\n\t\t\t\t\t\tmoveToCol = nextCol;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(moveToCol !== column){\n\t\t\t\t\t\t\tstartXMove = e.touches[0].pageX;\n\t\t\t\t\t\t\tmoveToCol.getElement().parentNode.insertBefore(this.placeholderElement, moveToCol.getElement().nextSibling);\n\t\t\t\t\t\t\tthis.moveColumn(moveToCol, true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}else {\n\t\t\t\t\tif(prevCol && -diff - prevColWidthLast > prevColWidth){\n\t\t\t\t\t\tmoveToCol = prevCol;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(moveToCol !== column){\n\t\t\t\t\t\t\tstartXMove = e.touches[0].pageX;\n\t\t\t\t\t\t\tmoveToCol.getElement().parentNode.insertBefore(this.placeholderElement, moveToCol.getElement());\n\t\t\t\t\t\t\tthis.moveColumn(moveToCol, false);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(moveToCol){\n\t\t\t\t\tnextCol = moveToCol.nextColumn();\n\t\t\t\t\tnextColWidthLast = nextColWidth;\n\t\t\t\t\tnextColWidth = nextCol ? nextCol.getWidth() / 2 : 0;\n\t\t\t\t\tprevCol = moveToCol.prevColumn();\n\t\t\t\t\tprevColWidthLast = prevColWidth;\n\t\t\t\t\tprevColWidth = prevCol ? prevCol.getWidth() / 2 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}, {passive: true});\n\t\t\n\t\tcolEl.addEventListener(\"touchend\", (e) => {\n\t\t\tif(this.checkTimeout){\n\t\t\t\tclearTimeout(this.checkTimeout);\n\t\t\t}\n\t\t\tif(this.moving){\n\t\t\t\tthis.endMove(e);\n\t\t\t}\n\t\t});\n\t}\n\t\n\tstartMove(e, column){\n\t\tvar element = column.getElement(),\n\t\theaderElement = this.table.columnManager.getContentsElement(),\n\t\theadersElement = this.table.columnManager.getHeadersElement();\n\t\t\n\t\t//Prevent moving columns when range selection is active\n\t\tif(this.table.modules.selectRange && this.table.modules.selectRange.columnSelection){\n\t\t\tif(this.table.modules.selectRange.mousedown && this.table.modules.selectRange.selecting === \"column\"){\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tthis.moving = column;\n\t\tthis.startX = (this.touchMove ? e.touches[0].pageX : e.pageX) - Helpers.elOffset(element).left;\n\t\t\n\t\tthis.table.element.classList.add(\"tabulator-block-select\");\n\t\t\n\t\t//create placeholder\n\t\tthis.placeholderElement.style.width = column.getWidth() + \"px\";\n\t\tthis.placeholderElement.style.height = column.getHeight() + \"px\";\n\t\t\n\t\telement.parentNode.insertBefore(this.placeholderElement, element);\n\t\telement.parentNode.removeChild(element);\n\t\t\n\t\t//create hover element\n\t\tthis.hoverElement = element.cloneNode(true);\n\t\tthis.hoverElement.classList.add(\"tabulator-moving\");\n\t\t\n\t\theaderElement.appendChild(this.hoverElement);\n\t\t\n\t\tthis.hoverElement.style.left = \"0\";\n\t\tthis.hoverElement.style.bottom = (headerElement.clientHeight - headersElement.offsetHeight) + \"px\";\n\t\t\n\t\tif(!this.touchMove){\n\t\t\tthis._bindMouseMove();\n\t\t\t\n\t\t\tdocument.body.addEventListener(\"mousemove\", this.moveHover);\n\t\t\tdocument.body.addEventListener(\"mouseup\", this.endMove);\n\t\t}\n\t\t\n\t\tthis.moveHover(e);\n\n\t\tthis.dispatch(\"column-moving\", e, this.moving);\n\t}\n\t\n\t_bindMouseMove(){\n\t\tthis.table.columnManager.columnsByIndex.forEach(function(column){\n\t\t\tif(column.modules.moveColumn.mousemove){\n\t\t\t\tcolumn.getElement().addEventListener(\"mousemove\", column.modules.moveColumn.mousemove);\n\t\t\t}\n\t\t});\n\t}\n\t\n\t_unbindMouseMove(){\n\t\tthis.table.columnManager.columnsByIndex.forEach(function(column){\n\t\t\tif(column.modules.moveColumn.mousemove){\n\t\t\t\tcolumn.getElement().removeEventListener(\"mousemove\", column.modules.moveColumn.mousemove);\n\t\t\t}\n\t\t});\n\t}\n\t\n\tmoveColumn(column, after){\n\t\tvar movingCells = this.moving.getCells();\n\t\t\n\t\tthis.toCol = column;\n\t\tthis.toColAfter = after;\n\t\t\n\t\tif(after){\n\t\t\tcolumn.getCells().forEach(function(cell, i){\n\t\t\t\tvar cellEl = cell.getElement(true);\n\t\t\t\t\n\t\t\t\tif(cellEl.parentNode && movingCells[i]){\n\t\t\t\t\tcellEl.parentNode.insertBefore(movingCells[i].getElement(), cellEl.nextSibling);\n\t\t\t\t}\n\t\t\t});\n\t\t}else {\n\t\t\tcolumn.getCells().forEach(function(cell, i){\n\t\t\t\tvar cellEl = cell.getElement(true);\n\t\t\t\t\n\t\t\t\tif(cellEl.parentNode && movingCells[i]){\n\t\t\t\t\tcellEl.parentNode.insertBefore(movingCells[i].getElement(), cellEl);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\t\n\tendMove(e){\n\t\tif(e.which === 1 || this.touchMove){\n\t\t\tthis._unbindMouseMove();\n\t\t\t\n\t\t\tthis.placeholderElement.parentNode.insertBefore(this.moving.getElement(), this.placeholderElement.nextSibling);\n\t\t\tthis.placeholderElement.parentNode.removeChild(this.placeholderElement);\n\t\t\tthis.hoverElement.parentNode.removeChild(this.hoverElement);\n\t\t\t\n\t\t\tthis.table.element.classList.remove(\"tabulator-block-select\");\n\t\t\t\n\t\t\tif(this.toCol){\n\t\t\t\tthis.table.columnManager.moveColumnActual(this.moving, this.toCol, this.toColAfter);\n\t\t\t}\n\n\t\t\tthis.moving = false;\n\t\t\tthis.toCol = false;\n\t\t\tthis.toColAfter = false;\n\t\t\t\n\t\t\tif(!this.touchMove){\n\t\t\t\tdocument.body.removeEventListener(\"mousemove\", this.moveHover);\n\t\t\t\tdocument.body.removeEventListener(\"mouseup\", this.endMove);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tmoveHover(e){\n\t\tvar columnHolder = this.table.columnManager.getContentsElement(),\n\t\tscrollLeft = columnHolder.scrollLeft,\n\t\txPos = ((this.touchMove ? e.touches[0].pageX : e.pageX) - Helpers.elOffset(columnHolder).left) + scrollLeft,\n\t\tscrollPos;\n\t\t\n\t\tthis.hoverElement.style.left = (xPos - this.startX) + \"px\";\n\t\t\n\t\tif(xPos - scrollLeft < this.autoScrollMargin){\n\t\t\tif(!this.autoScrollTimeout){\n\t\t\t\tthis.autoScrollTimeout = setTimeout(() => {\n\t\t\t\t\tscrollPos = Math.max(0,scrollLeft-5);\n\t\t\t\t\tthis.table.rowManager.getElement().scrollLeft = scrollPos;\n\t\t\t\t\tthis.autoScrollTimeout = false;\n\t\t\t\t}, 1);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif(scrollLeft + columnHolder.clientWidth - xPos < this.autoScrollMargin){\n\t\t\tif(!this.autoScrollTimeout){\n\t\t\t\tthis.autoScrollTimeout = setTimeout(() => {\n\t\t\t\t\tscrollPos = Math.min(columnHolder.clientWidth, scrollLeft+5);\n\t\t\t\t\tthis.table.rowManager.getElement().scrollLeft = scrollPos;\n\t\t\t\t\tthis.autoScrollTimeout = false;\n\t\t\t\t}, 1);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvar defaultSenders = {\r\n\tdelete:function(fromRow, toRow, toTable){\r\n\t\tfromRow.delete();\r\n\t}\r\n};\n\nvar defaultReceivers = {\r\n\tinsert:function(fromRow, toRow, fromTable){\r\n\t\tthis.table.addRow(fromRow.getData(), undefined, toRow);\r\n\t\treturn true;\r\n\t},\r\n\r\n\tadd:function(fromRow, toRow, fromTable){\r\n\t\tthis.table.addRow(fromRow.getData());\r\n\t\treturn true;\r\n\t},\r\n\r\n\tupdate:function(fromRow, toRow, fromTable){\r\n\t\tif(toRow){\r\n\t\t\ttoRow.update(fromRow.getData());\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t},\r\n\r\n\treplace:function(fromRow, toRow, fromTable){\r\n\t\tif(toRow){\r\n\t\t\tthis.table.addRow(fromRow.getData(), undefined, toRow);\r\n\t\t\ttoRow.delete();\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t},\r\n};\n\nclass MoveRows extends Module{\n\n\tstatic moduleName = \"moveRow\";\n\n\t//load defaults\n\tstatic senders = defaultSenders;\n\tstatic receivers = defaultReceivers;\n\n\tconstructor(table){\n\t\tsuper(table);\n\n\t\tthis.placeholderElement = this.createPlaceholderElement();\n\t\tthis.hoverElement = false; //floating row header element\n\t\tthis.checkTimeout = false; //click check timeout holder\n\t\tthis.checkPeriod = 150; //period to wait on mousedown to consider this a move and not a click\n\t\tthis.moving = false; //currently moving row\n\t\tthis.toRow = false; //destination row\n\t\tthis.toRowAfter = false; //position of moving row relative to the destination row\n\t\tthis.hasHandle = false; //row has handle instead of fully movable row\n\t\tthis.startY = 0; //starting Y position within header element\n\t\tthis.startX = 0; //starting X position within header element\n\n\t\tthis.moveHover = this.moveHover.bind(this);\n\t\tthis.endMove = this.endMove.bind(this);\n\t\tthis.tableRowDropEvent = false;\n\n\t\tthis.touchMove = false;\n\n\t\tthis.connection = false;\n\t\tthis.connectionSelectorsTables = false;\n\t\tthis.connectionSelectorsElements = false;\n\t\tthis.connectionElements = [];\n\t\tthis.connections = [];\n\n\t\tthis.connectedTable = false;\n\t\tthis.connectedRow = false;\n\n\t\tthis.registerTableOption(\"movableRows\", false); //enable movable rows\n\t\tthis.registerTableOption(\"movableRowsConnectedTables\", false); //tables for movable rows to be connected to\n\t\tthis.registerTableOption(\"movableRowsConnectedElements\", false); //other elements for movable rows to be connected to\n\t\tthis.registerTableOption(\"movableRowsSender\", false);\n\t\tthis.registerTableOption(\"movableRowsReceiver\", \"insert\");\n\n\t\tthis.registerColumnOption(\"rowHandle\");\n\t}\n\n\tcreatePlaceholderElement(){\n\t\tvar el = document.createElement(\"div\");\n\n\t\tel.classList.add(\"tabulator-row\");\n\t\tel.classList.add(\"tabulator-row-placeholder\");\n\n\t\treturn el;\n\t}\n\n\tinitialize(){\n\t\tif(this.table.options.movableRows){\n\t\t\tthis.connectionSelectorsTables = this.table.options.movableRowsConnectedTables;\n\t\t\tthis.connectionSelectorsElements = this.table.options.movableRowsConnectedElements;\n\n\t\t\tthis.connection = this.connectionSelectorsTables || this.connectionSelectorsElements;\n\n\t\t\tthis.subscribe(\"cell-init\", this.initializeCell.bind(this));\n\t\t\tthis.subscribe(\"column-init\", this.initializeColumn.bind(this));\n\t\t\tthis.subscribe(\"row-init\", this.initializeRow.bind(this));\n\t\t}\n\t}\n\n\tinitializeGroupHeader(group){\n\t\tvar self = this,\n\t\tconfig = {};\n\n\t\t//inter table drag drop\n\t\tconfig.mouseup = function(e){\n\t\t\tself.tableRowDrop(e, group);\n\t\t}.bind(self);\n\n\t\t//same table drag drop\n\t\tconfig.mousemove = function(e){\n\t\t\tvar rowEl;\n\n\t\t\tif(((e.pageY - Helpers.elOffset(group.element).top) + self.table.rowManager.element.scrollTop) > (group.getHeight() / 2)){\n\t\t\t\tif(self.toRow !== group || !self.toRowAfter){\n\t\t\t\t\trowEl = group.getElement();\n\t\t\t\t\trowEl.parentNode.insertBefore(self.placeholderElement, rowEl.nextSibling);\n\t\t\t\t\tself.moveRow(group, true);\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tif(self.toRow !== group || self.toRowAfter){\n\t\t\t\t\trowEl = group.getElement();\n\t\t\t\t\tif(rowEl.previousSibling){\n\t\t\t\t\t\trowEl.parentNode.insertBefore(self.placeholderElement, rowEl);\n\t\t\t\t\t\tself.moveRow(group, false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}.bind(self);\n\n\t\tgroup.modules.moveRow = config;\n\t}\n\n\tinitializeRow(row){\n\t\tvar self = this,\n\t\tconfig = {},\n\t\trowEl;\n\n\t\t//inter table drag drop\n\t\tconfig.mouseup = function(e){\n\t\t\tself.tableRowDrop(e, row);\n\t\t}.bind(self);\n\n\t\t//same table drag drop\n\t\tconfig.mousemove = function(e){\n\t\t\tvar rowEl = row.getElement();\n\n\t\t\tif(((e.pageY - Helpers.elOffset(rowEl).top) + self.table.rowManager.element.scrollTop) > (row.getHeight() / 2)){\n\t\t\t\tif(self.toRow !== row || !self.toRowAfter){\n\t\t\t\t\trowEl.parentNode.insertBefore(self.placeholderElement, rowEl.nextSibling);\n\t\t\t\t\tself.moveRow(row, true);\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tif(self.toRow !== row || self.toRowAfter){\n\t\t\t\t\trowEl.parentNode.insertBefore(self.placeholderElement, rowEl);\n\t\t\t\t\tself.moveRow(row, false);\n\t\t\t\t}\n\t\t\t}\n\t\t}.bind(self);\n\n\n\t\tif(!this.hasHandle){\n\n\t\t\trowEl = row.getElement();\n\n\t\t\trowEl.addEventListener(\"mousedown\", function(e){\n\t\t\t\tif(e.which === 1){\n\t\t\t\t\tself.checkTimeout = setTimeout(function(){\n\t\t\t\t\t\tself.startMove(e, row);\n\t\t\t\t\t}, self.checkPeriod);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\trowEl.addEventListener(\"mouseup\", function(e){\n\t\t\t\tif(e.which === 1){\n\t\t\t\t\tif(self.checkTimeout){\n\t\t\t\t\t\tclearTimeout(self.checkTimeout);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.bindTouchEvents(row, row.getElement());\n\t\t}\n\n\t\trow.modules.moveRow = config;\n\t}\n\n\tinitializeColumn(column){\n\t\tif(column.definition.rowHandle && this.table.options.movableRows !== false){\n\t\t\tthis.hasHandle = true;\n\t\t}\n\t}\n\n\tinitializeCell(cell){\n\t\tif(cell.column.definition.rowHandle && this.table.options.movableRows !== false){\n\t\t\tvar self = this,\n\t\t\tcellEl = cell.getElement(true);\n\n\t\t\tcellEl.addEventListener(\"mousedown\", function(e){\n\t\t\t\tif(e.which === 1){\n\t\t\t\t\tself.checkTimeout = setTimeout(function(){\n\t\t\t\t\t\tself.startMove(e, cell.row);\n\t\t\t\t\t}, self.checkPeriod);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tcellEl.addEventListener(\"mouseup\", function(e){\n\t\t\t\tif(e.which === 1){\n\t\t\t\t\tif(self.checkTimeout){\n\t\t\t\t\t\tclearTimeout(self.checkTimeout);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.bindTouchEvents(cell.row, cellEl);\n\t\t}\n\t}\n\n\tbindTouchEvents(row, element){\n\t\tvar startYMove = false, //shifting center position of the cell\n\t\tnextRow, prevRow, nextRowHeight, prevRowHeight, nextRowHeightLast, prevRowHeightLast;\n\n\t\telement.addEventListener(\"touchstart\", (e) => {\n\t\t\tthis.checkTimeout = setTimeout(() => {\n\t\t\t\tthis.touchMove = true;\n\t\t\t\tnextRow = row.nextRow();\n\t\t\t\tnextRowHeight = nextRow ? nextRow.getHeight()/2 : 0;\n\t\t\t\tprevRow = row.prevRow();\n\t\t\t\tprevRowHeight = prevRow ? prevRow.getHeight()/2 : 0;\n\t\t\t\tnextRowHeightLast = 0;\n\t\t\t\tprevRowHeightLast = 0;\n\t\t\t\tstartYMove = false;\n\n\t\t\t\tthis.startMove(e, row);\n\t\t\t}, this.checkPeriod);\n\t\t}, {passive: true});\n\t\tthis.moving, this.toRow, this.toRowAfter;\n\t\telement.addEventListener(\"touchmove\", (e) => {\n\n\t\t\tvar diff, moveToRow;\n\n\t\t\tif(this.moving){\n\t\t\t\te.preventDefault();\n\n\t\t\t\tthis.moveHover(e);\n\n\t\t\t\tif(!startYMove){\n\t\t\t\t\tstartYMove = e.touches[0].pageY;\n\t\t\t\t}\n\n\t\t\t\tdiff = e.touches[0].pageY - startYMove;\n\n\t\t\t\tif(diff > 0){\n\t\t\t\t\tif(nextRow && diff - nextRowHeightLast > nextRowHeight){\n\t\t\t\t\t\tmoveToRow = nextRow;\n\n\t\t\t\t\t\tif(moveToRow !== row){\n\t\t\t\t\t\t\tstartYMove = e.touches[0].pageY;\n\t\t\t\t\t\t\tmoveToRow.getElement().parentNode.insertBefore(this.placeholderElement, moveToRow.getElement().nextSibling);\n\t\t\t\t\t\t\tthis.moveRow(moveToRow, true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}else {\n\t\t\t\t\tif(prevRow && -diff - prevRowHeightLast > prevRowHeight){\n\t\t\t\t\t\tmoveToRow = prevRow;\n\n\t\t\t\t\t\tif(moveToRow !== row){\n\t\t\t\t\t\t\tstartYMove = e.touches[0].pageY;\n\t\t\t\t\t\t\tmoveToRow.getElement().parentNode.insertBefore(this.placeholderElement, moveToRow.getElement());\n\t\t\t\t\t\t\tthis.moveRow(moveToRow, false);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(moveToRow){\n\t\t\t\t\tnextRow = moveToRow.nextRow();\n\t\t\t\t\tnextRowHeightLast = nextRowHeight;\n\t\t\t\t\tnextRowHeight = nextRow ? nextRow.getHeight() / 2 : 0;\n\t\t\t\t\tprevRow = moveToRow.prevRow();\n\t\t\t\t\tprevRowHeightLast = prevRowHeight;\n\t\t\t\t\tprevRowHeight = prevRow ? prevRow.getHeight() / 2 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\telement.addEventListener(\"touchend\", (e) => {\n\t\t\tif(this.checkTimeout){\n\t\t\t\tclearTimeout(this.checkTimeout);\n\t\t\t}\n\t\t\tif(this.moving){\n\t\t\t\tthis.endMove(e);\n\t\t\t\tthis.touchMove = false;\n\t\t\t}\n\t\t});\n\t}\n\n\t_bindMouseMove(){\n\t\tthis.table.rowManager.getDisplayRows().forEach((row) => {\n\t\t\tif((row.type === \"row\" || row.type === \"group\") && row.modules.moveRow && row.modules.moveRow.mousemove){\n\t\t\t\trow.getElement().addEventListener(\"mousemove\", row.modules.moveRow.mousemove);\n\t\t\t}\n\t\t});\n\t}\n\n\t_unbindMouseMove(){\n\t\tthis.table.rowManager.getDisplayRows().forEach((row) => {\n\t\t\tif((row.type === \"row\" || row.type === \"group\") && row.modules.moveRow && row.modules.moveRow.mousemove){\n\t\t\t\trow.getElement().removeEventListener(\"mousemove\", row.modules.moveRow.mousemove);\n\t\t\t}\n\t\t});\n\t}\n\n\tstartMove(e, row){\n\t\tvar element = row.getElement();\n\n\t\tthis.setStartPosition(e, row);\n\n\t\tthis.moving = row;\n\n\t\tthis.table.element.classList.add(\"tabulator-block-select\");\n\n\t\t//create placeholder\n\t\tthis.placeholderElement.style.width = row.getWidth() + \"px\";\n\t\tthis.placeholderElement.style.height = row.getHeight() + \"px\";\n\n\t\tif(!this.connection){\n\t\t\telement.parentNode.insertBefore(this.placeholderElement, element);\n\t\t\telement.parentNode.removeChild(element);\n\t\t}else {\n\t\t\tthis.table.element.classList.add(\"tabulator-movingrow-sending\");\n\t\t\tthis.connectToTables(row);\n\t\t}\n\n\t\t//create hover element\n\t\tthis.hoverElement = element.cloneNode(true);\n\t\tthis.hoverElement.classList.add(\"tabulator-moving\");\n\n\t\tif(this.connection){\n\t\t\tdocument.body.appendChild(this.hoverElement);\n\t\t\tthis.hoverElement.style.left = \"0\";\n\t\t\tthis.hoverElement.style.top = \"0\";\n\t\t\tthis.hoverElement.style.width = this.table.element.clientWidth + \"px\";\n\t\t\tthis.hoverElement.style.whiteSpace = \"nowrap\";\n\t\t\tthis.hoverElement.style.overflow = \"hidden\";\n\t\t\tthis.hoverElement.style.pointerEvents = \"none\";\n\t\t}else {\n\t\t\tthis.table.rowManager.getTableElement().appendChild(this.hoverElement);\n\n\t\t\tthis.hoverElement.style.left = \"0\";\n\t\t\tthis.hoverElement.style.top = \"0\";\n\n\t\t\tthis._bindMouseMove();\n\t\t}\n\n\t\tdocument.body.addEventListener(\"mousemove\", this.moveHover);\n\t\tdocument.body.addEventListener(\"mouseup\", this.endMove);\n\n\t\tthis.dispatchExternal(\"rowMoving\", row.getComponent());\n\n\t\tthis.moveHover(e);\n\t}\n\n\tsetStartPosition(e, row){\n\t\tvar pageX = this.touchMove ? e.touches[0].pageX : e.pageX,\n\t\tpageY = this.touchMove ? e.touches[0].pageY : e.pageY,\n\t\telement, position;\n\n\t\telement = row.getElement();\n\t\tif(this.connection){\n\t\t\tposition = element.getBoundingClientRect();\n\n\t\t\tthis.startX = position.left - pageX + window.pageXOffset;\n\t\t\tthis.startY = position.top - pageY + window.pageYOffset;\n\t\t}else {\n\t\t\tthis.startY = (pageY - element.getBoundingClientRect().top);\n\t\t}\n\t}\n\n\tendMove(e){\n\t\tif(!e || e.which === 1 || this.touchMove){\n\t\t\tthis._unbindMouseMove();\n\n\t\t\tif(!this.connection){\n\t\t\t\tthis.placeholderElement.parentNode.insertBefore(this.moving.getElement(), this.placeholderElement.nextSibling);\n\t\t\t\tthis.placeholderElement.parentNode.removeChild(this.placeholderElement);\n\t\t\t}\n\n\t\t\tthis.hoverElement.parentNode.removeChild(this.hoverElement);\n\n\t\t\tthis.table.element.classList.remove(\"tabulator-block-select\");\n\n\t\t\tif(this.toRow){\n\t\t\t\tthis.table.rowManager.moveRow(this.moving, this.toRow, this.toRowAfter);\n\t\t\t}else {\n\t\t\t\tthis.dispatchExternal(\"rowMoveCancelled\", this.moving.getComponent());\n\t\t\t}\n\n\t\t\tthis.moving = false;\n\t\t\tthis.toRow = false;\n\t\t\tthis.toRowAfter = false;\n\n\t\t\tdocument.body.removeEventListener(\"mousemove\", this.moveHover);\n\t\t\tdocument.body.removeEventListener(\"mouseup\", this.endMove);\n\n\t\t\tif(this.connection){\n\t\t\t\tthis.table.element.classList.remove(\"tabulator-movingrow-sending\");\n\t\t\t\tthis.disconnectFromTables();\n\t\t\t}\n\t\t}\n\t}\n\n\tmoveRow(row, after){\n\t\tthis.toRow = row;\n\t\tthis.toRowAfter = after;\n\t}\n\n\tmoveHover(e){\n\t\tif(this.connection){\n\t\t\tthis.moveHoverConnections.call(this, e);\n\t\t}else {\n\t\t\tthis.moveHoverTable.call(this, e);\n\t\t}\n\t}\n\n\tmoveHoverTable(e){\n\t\tvar rowHolder = this.table.rowManager.getElement(),\n\t\tscrollTop = rowHolder.scrollTop,\n\t\tyPos = ((this.touchMove ? e.touches[0].pageY : e.pageY) - rowHolder.getBoundingClientRect().top) + scrollTop;\n\t\t\n\t\tthis.hoverElement.style.top = Math.min(yPos - this.startY, this.table.rowManager.element.scrollHeight - this.hoverElement.offsetHeight) + \"px\";\n\t}\n\n\tmoveHoverConnections(e){\n\t\tthis.hoverElement.style.left = (this.startX + (this.touchMove ? e.touches[0].pageX : e.pageX)) + \"px\";\n\t\tthis.hoverElement.style.top = (this.startY + (this.touchMove ? e.touches[0].pageY : e.pageY)) + \"px\";\n\t}\n\n\telementRowDrop(e, element, row){\n\t\tthis.dispatchExternal(\"movableRowsElementDrop\", e, element, row ? row.getComponent() : false);\n\t}\n\n\t//establish connection with other tables\n\tconnectToTables(row){\n\t\tvar connectionTables;\n\n\t\tif(this.connectionSelectorsTables){\n\t\t\tconnectionTables = this.commsConnections(this.connectionSelectorsTables);\n\n\t\t\tthis.dispatchExternal(\"movableRowsSendingStart\", connectionTables);\n\n\t\t\tthis.commsSend(this.connectionSelectorsTables, \"moveRow\", \"connect\", {\n\t\t\t\trow:row,\n\t\t\t});\n\t\t}\n\n\t\tif(this.connectionSelectorsElements){\n\n\t\t\tthis.connectionElements = [];\n\n\t\t\tif(!Array.isArray(this.connectionSelectorsElements)){\n\t\t\t\tthis.connectionSelectorsElements = [this.connectionSelectorsElements];\n\t\t\t}\n\n\t\t\tthis.connectionSelectorsElements.forEach((query) => {\n\t\t\t\tif(typeof query === \"string\"){\n\t\t\t\t\tthis.connectionElements = this.connectionElements.concat(Array.prototype.slice.call(document.querySelectorAll(query)));\n\t\t\t\t}else {\n\t\t\t\t\tthis.connectionElements.push(query);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.connectionElements.forEach((element) => {\n\t\t\t\tvar dropEvent = (e) => {\n\t\t\t\t\tthis.elementRowDrop(e, element, this.moving);\n\t\t\t\t};\n\n\t\t\t\telement.addEventListener(\"mouseup\", dropEvent);\n\t\t\t\telement.tabulatorElementDropEvent = dropEvent;\n\n\t\t\t\telement.classList.add(\"tabulator-movingrow-receiving\");\n\t\t\t});\n\t\t}\n\t}\n\n\t//disconnect from other tables\n\tdisconnectFromTables(){\n\t\tvar connectionTables;\n\n\t\tif(this.connectionSelectorsTables){\n\t\t\tconnectionTables = this.commsConnections(this.connectionSelectorsTables);\n\n\t\t\tthis.dispatchExternal(\"movableRowsSendingStop\", connectionTables);\n\n\t\t\tthis.commsSend(this.connectionSelectorsTables, \"moveRow\", \"disconnect\");\n\t\t}\n\n\t\tthis.connectionElements.forEach((element) => {\n\t\t\telement.classList.remove(\"tabulator-movingrow-receiving\");\n\t\t\telement.removeEventListener(\"mouseup\", element.tabulatorElementDropEvent);\n\t\t\tdelete element.tabulatorElementDropEvent;\n\t\t});\n\t}\n\n\t//accept incomming connection\n\tconnect(table, row){\n\t\tif(!this.connectedTable){\n\t\t\tthis.connectedTable = table;\n\t\t\tthis.connectedRow = row;\n\n\t\t\tthis.table.element.classList.add(\"tabulator-movingrow-receiving\");\n\n\t\t\tthis.table.rowManager.getDisplayRows().forEach((row) => {\n\t\t\t\tif(row.type === \"row\" && row.modules.moveRow && row.modules.moveRow.mouseup){\n\t\t\t\t\trow.getElement().addEventListener(\"mouseup\", row.modules.moveRow.mouseup);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.tableRowDropEvent = this.tableRowDrop.bind(this);\n\n\t\t\tthis.table.element.addEventListener(\"mouseup\", this.tableRowDropEvent);\n\n\t\t\tthis.dispatchExternal(\"movableRowsReceivingStart\", row, table);\n\n\t\t\treturn true;\n\t\t}else {\n\t\t\tconsole.warn(\"Move Row Error - Table cannot accept connection, already connected to table:\", this.connectedTable);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t//close incoming connection\n\tdisconnect(table){\n\t\tif(table === this.connectedTable){\n\t\t\tthis.connectedTable = false;\n\t\t\tthis.connectedRow = false;\n\n\t\t\tthis.table.element.classList.remove(\"tabulator-movingrow-receiving\");\n\n\t\t\tthis.table.rowManager.getDisplayRows().forEach((row) =>{\n\t\t\t\tif(row.type === \"row\" && row.modules.moveRow && row.modules.moveRow.mouseup){\n\t\t\t\t\trow.getElement().removeEventListener(\"mouseup\", row.modules.moveRow.mouseup);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.table.element.removeEventListener(\"mouseup\", this.tableRowDropEvent);\n\n\t\t\tthis.dispatchExternal(\"movableRowsReceivingStop\", table);\n\t\t}else {\n\t\t\tconsole.warn(\"Move Row Error - trying to disconnect from non connected table\");\n\t\t}\n\t}\n\n\tdropComplete(table, row, success){\n\t\tvar sender = false;\n\n\t\tif(success){\n\n\t\t\tswitch(typeof this.table.options.movableRowsSender){\n\t\t\t\tcase \"string\":\n\t\t\t\t\tsender = MoveRows.senders[this.table.options.movableRowsSender];\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"function\":\n\t\t\t\t\tsender = this.table.options.movableRowsSender;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif(sender){\n\t\t\t\tsender.call(this, this.moving ? this.moving.getComponent() : undefined, row ? row.getComponent() : undefined, table);\n\t\t\t}else {\n\t\t\t\tif(this.table.options.movableRowsSender){\n\t\t\t\t\tconsole.warn(\"Mover Row Error - no matching sender found:\", this.table.options.movableRowsSender);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.dispatchExternal(\"movableRowsSent\", this.moving.getComponent(), row ? row.getComponent() : undefined, table);\n\t\t}else {\n\t\t\tthis.dispatchExternal(\"movableRowsSentFailed\", this.moving.getComponent(), row ? row.getComponent() : undefined, table);\n\t\t}\n\n\t\tthis.endMove();\n\t}\n\n\ttableRowDrop(e, row){\n\t\tvar receiver = false,\n\t\tsuccess = false;\n\n\t\te.stopImmediatePropagation();\n\n\t\tswitch(typeof this.table.options.movableRowsReceiver){\n\t\t\tcase \"string\":\n\t\t\t\treceiver = MoveRows.receivers[this.table.options.movableRowsReceiver];\n\t\t\t\tbreak;\n\n\t\t\tcase \"function\":\n\t\t\t\treceiver = this.table.options.movableRowsReceiver;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif(receiver){\n\t\t\tsuccess = receiver.call(this, this.connectedRow.getComponent(), row ? row.getComponent() : undefined, this.connectedTable);\n\t\t}else {\n\t\t\tconsole.warn(\"Mover Row Error - no matching receiver found:\", this.table.options.movableRowsReceiver);\n\t\t}\n\n\t\tif(success){\n\t\t\tthis.dispatchExternal(\"movableRowsReceived\", this.connectedRow.getComponent(), row ? row.getComponent() : undefined, this.connectedTable);\n\t\t}else {\n\t\t\tthis.dispatchExternal(\"movableRowsReceivedFailed\", this.connectedRow.getComponent(), row ? row.getComponent() : undefined, this.connectedTable);\n\t\t}\n\n\t\tthis.commsSend(this.connectedTable, \"moveRow\", \"dropcomplete\", {\n\t\t\trow:row,\n\t\t\tsuccess:success,\n\t\t});\n\t}\n\n\tcommsReceived(table, action, data){\n\t\tswitch(action){\n\t\t\tcase \"connect\":\n\t\t\t\treturn this.connect(table, data.row);\n\n\t\t\tcase \"disconnect\":\n\t\t\t\treturn this.disconnect(table);\n\n\t\t\tcase \"dropcomplete\":\n\t\t\t\treturn this.dropComplete(table, data.row, data.success);\n\t\t}\n\t}\n}\n\nvar defaultMutators = {};\n\nclass Mutator extends Module{\n\n\tstatic moduleName = \"mutator\";\n\n\t//load defaults\n\tstatic mutators = defaultMutators;\n\n\tconstructor(table){\n\t\tsuper(table);\n\n\t\tthis.allowedTypes = [\"\", \"data\", \"edit\", \"clipboard\", \"import\"]; //list of mutation types\n\t\tthis.enabled = true;\n\n\t\tthis.registerColumnOption(\"mutator\");\n\t\tthis.registerColumnOption(\"mutatorParams\");\n\t\tthis.registerColumnOption(\"mutatorData\");\n\t\tthis.registerColumnOption(\"mutatorDataParams\");\n\t\tthis.registerColumnOption(\"mutatorEdit\");\n\t\tthis.registerColumnOption(\"mutatorEditParams\");\n\t\tthis.registerColumnOption(\"mutatorClipboard\");\n\t\tthis.registerColumnOption(\"mutatorClipboardParams\");\n\t\tthis.registerColumnOption(\"mutatorImport\");\n\t\tthis.registerColumnOption(\"mutatorImportParams\");\n\t\tthis.registerColumnOption(\"mutateLink\");\n\t}\n\n\tinitialize(){\n\t\tthis.subscribe(\"cell-value-changing\", this.transformCell.bind(this));\n\t\tthis.subscribe(\"cell-value-changed\", this.mutateLink.bind(this));\n\t\tthis.subscribe(\"column-layout\", this.initializeColumn.bind(this));\n\t\tthis.subscribe(\"row-data-init-before\", this.rowDataChanged.bind(this));\n\t\tthis.subscribe(\"row-data-changing\", this.rowDataChanged.bind(this));\n\t}\n\n\trowDataChanged(row, tempData, updatedData){\n\t\treturn this.transformRow(tempData, \"data\", updatedData);\n\t}\n\n\t//initialize column mutator\n\tinitializeColumn(column){\n\t\tvar match = false,\n\t\tconfig = {};\n\n\t\tthis.allowedTypes.forEach((type) => {\n\t\t\tvar key = \"mutator\" + (type.charAt(0).toUpperCase() + type.slice(1)),\n\t\t\tmutator;\n\n\t\t\tif(column.definition[key]){\n\t\t\t\tmutator = this.lookupMutator(column.definition[key]);\n\n\t\t\t\tif(mutator){\n\t\t\t\t\tmatch = true;\n\n\t\t\t\t\tconfig[key] = {\n\t\t\t\t\t\tmutator:mutator,\n\t\t\t\t\t\tparams: column.definition[key + \"Params\"] || {},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tif(match){\n\t\t\tcolumn.modules.mutate = config;\n\t\t}\n\t}\n\n\tlookupMutator(value){\n\t\tvar mutator = false;\n\n\t\t//set column mutator\n\t\tswitch(typeof value){\n\t\t\tcase \"string\":\n\t\t\t\tif(Mutator.mutators[value]){\n\t\t\t\t\tmutator = Mutator.mutators[value];\n\t\t\t\t}else {\n\t\t\t\t\tconsole.warn(\"Mutator Error - No such mutator found, ignoring: \", value);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"function\":\n\t\t\t\tmutator = value;\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn mutator;\n\t}\n\n\t//apply mutator to row\n\ttransformRow(data, type, updatedData){\n\t\tvar key = \"mutator\" + (type.charAt(0).toUpperCase() + type.slice(1)),\n\t\tvalue;\n\n\t\t// console.log(\"key\", key)\n\n\t\tif(this.enabled){\n\n\t\t\tthis.table.columnManager.traverse((column) => {\n\t\t\t\tvar mutator, params, component;\n\n\t\t\t\tif(column.modules.mutate){\n\t\t\t\t\tmutator = column.modules.mutate[key] || column.modules.mutate.mutator || false;\n\n\t\t\t\t\tif(mutator){\n\t\t\t\t\t\tvalue = column.getFieldValue(typeof updatedData !== \"undefined\" ? updatedData : data);\n\n\t\t\t\t\t\tif((type == \"data\" && !updatedData)|| typeof value !== \"undefined\"){\n\t\t\t\t\t\t\tcomponent = column.getComponent();\n\t\t\t\t\t\t\tparams = typeof mutator.params === \"function\" ? mutator.params(value, data, type, component) : mutator.params;\n\t\t\t\t\t\t\tcolumn.setFieldValue(data, mutator.mutator(value, data, type, params, component));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn data;\n\t}\n\n\t//apply mutator to new cell value\n\ttransformCell(cell, value){\n\t\tif(cell.column.modules.mutate){\n\t\t\tvar mutator = cell.column.modules.mutate.mutatorEdit || cell.column.modules.mutate.mutator || false,\n\t\t\ttempData = {};\n\n\t\t\tif(mutator){\n\t\t\t\ttempData = Object.assign(tempData, cell.row.getData());\n\t\t\t\tcell.column.setFieldValue(tempData, value);\n\t\t\t\treturn mutator.mutator(value, tempData, \"edit\", mutator.params, cell.getComponent());\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tmutateLink(cell){\n\t\tvar links = cell.column.definition.mutateLink;\n\n\t\tif(links){\n\t\t\tif(!Array.isArray(links)){\n\t\t\t\tlinks = [links];\n\t\t\t}\n\n\t\t\tlinks.forEach((link) => {\n\t\t\t\tvar linkCell = cell.row.getCell(link);\n\n\t\t\t\tif(linkCell){\n\t\t\t\t\tlinkCell.setValue(linkCell.getValue(), true, true);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tenable(){\n\t\tthis.enabled = true;\n\t}\n\n\tdisable(){\n\t\tthis.enabled = false;\n\t}\n}\n\nfunction rows(pageSize, currentRow, currentPage, totalRows, totalPages){\n\tvar el = document.createElement(\"span\"),\n\tshowingEl = document.createElement(\"span\"),\n\tvalueEl = document.createElement(\"span\"),\n\tofEl = document.createElement(\"span\"),\n\ttotalEl = document.createElement(\"span\"),\n\trowsEl = document.createElement(\"span\");\n\n\tthis.table.modules.localize.langBind(\"pagination|counter|showing\", (value) => {\n\t\tshowingEl.innerHTML = value;\n\t});\n\n\tthis.table.modules.localize.langBind(\"pagination|counter|of\", (value) => {\n\t\tofEl.innerHTML = value;\n\t});\n\n\tthis.table.modules.localize.langBind(\"pagination|counter|rows\", (value) => {\n\t\trowsEl.innerHTML = value;\n\t});\n\n\tif(totalRows){\n\t\tvalueEl.innerHTML = \" \" + currentRow + \"-\" + Math.min((currentRow + pageSize - 1), totalRows) + \" \";\n\t\t\n\t\ttotalEl.innerHTML = \" \" + totalRows + \" \";\n\t\t\n\t\tel.appendChild(showingEl);\n\t\tel.appendChild(valueEl);\n\t\tel.appendChild(ofEl);\n\t\tel.appendChild(totalEl);\n\t\tel.appendChild(rowsEl);\n\t}else {\n\t\tvalueEl.innerHTML = \" 0 \";\n\n\t\tel.appendChild(showingEl);\n\t\tel.appendChild(valueEl);\n\t\tel.appendChild(rowsEl);\n\t}\n\t\n\treturn el;\n}\n\nfunction pages(pageSize, currentRow, currentPage, totalRows, totalPages){\n\n\tvar el = document.createElement(\"span\"),\n\tshowingEl = document.createElement(\"span\"),\n\tvalueEl = document.createElement(\"span\"),\n\tofEl = document.createElement(\"span\"),\n\ttotalEl = document.createElement(\"span\"),\n\trowsEl = document.createElement(\"span\");\n\t\n\tthis.table.modules.localize.langBind(\"pagination|counter|showing\", (value) => {\n\t\tshowingEl.innerHTML = value;\n\t});\n\t\n\tvalueEl.innerHTML = \" \" + currentPage + \" \";\n\t\n\tthis.table.modules.localize.langBind(\"pagination|counter|of\", (value) => {\n\t\tofEl.innerHTML = value;\n\t});\n\t\n\ttotalEl.innerHTML = \" \" + totalPages + \" \";\n\t\n\tthis.table.modules.localize.langBind(\"pagination|counter|pages\", (value) => {\n\t\trowsEl.innerHTML = value;\n\t});\n\t\n\tel.appendChild(showingEl);\n\tel.appendChild(valueEl);\n\tel.appendChild(ofEl);\n\tel.appendChild(totalEl);\n\tel.appendChild(rowsEl);\n\t\n\treturn el;\n}\n\nvar defaultPageCounters = {\n\trows:rows,\n\tpages:pages,\n};\n\nclass Page extends Module{\n\n\tstatic moduleName = \"page\";\n\n\t//load defaults\n\tstatic pageCounters = defaultPageCounters;\n\t\n\tconstructor(table){\n\t\tsuper(table);\n\t\t\n\t\tthis.mode = \"local\";\n\t\tthis.progressiveLoad = false;\n\t\t\n\t\tthis.element = null;\n\t\tthis.pageCounterElement = null;\n\t\tthis.pageCounter = null;\n\t\t\n\t\tthis.size = 0;\n\t\tthis.page = 1;\n\t\tthis.count = 5;\n\t\tthis.max = 1;\n\n\t\tthis.remoteRowCountEstimate = null;\n\t\t\n\t\tthis.initialLoad = true;\n\t\tthis.dataChanging = false; //flag to check if data is being changed by this module\n\t\t\n\t\tthis.pageSizes = [];\n\t\t\n\t\tthis.registerTableOption(\"pagination\", false); //set pagination type\n\t\tthis.registerTableOption(\"paginationMode\", \"local\"); //local or remote pagination\n\t\tthis.registerTableOption(\"paginationSize\", false); //set number of rows to a page\n\t\tthis.registerTableOption(\"paginationInitialPage\", 1); //initial page to show on load\n\t\tthis.registerTableOption(\"paginationCounter\", false); // set pagination counter\n\t\tthis.registerTableOption(\"paginationCounterElement\", false); // set pagination counter\n\t\tthis.registerTableOption(\"paginationButtonCount\", 5); // set count of page button\n\t\tthis.registerTableOption(\"paginationSizeSelector\", false); //add pagination size selector element\n\t\tthis.registerTableOption(\"paginationElement\", false); //element to hold pagination numbers\n\t\t// this.registerTableOption(\"paginationDataSent\", {}); //pagination data sent to the server\n\t\t// this.registerTableOption(\"paginationDataReceived\", {}); //pagination data received from the server\n\t\tthis.registerTableOption(\"paginationAddRow\", \"page\"); //add rows on table or page\n\t\tthis.registerTableOption(\"paginationOutOfRange\", false); //reset the current page when the last page < this.page, values: false|function|any value accepted by setPage()\n\t\t\n\t\tthis.registerTableOption(\"progressiveLoad\", false); //progressive loading\n\t\tthis.registerTableOption(\"progressiveLoadDelay\", 0); //delay between requests\n\t\tthis.registerTableOption(\"progressiveLoadScrollMargin\", 0); //margin before scroll begins\n\t\t\n\t\tthis.registerTableFunction(\"setMaxPage\", this.setMaxPage.bind(this));\n\t\tthis.registerTableFunction(\"setPage\", this.setPage.bind(this));\n\t\tthis.registerTableFunction(\"setPageToRow\", this.userSetPageToRow.bind(this));\n\t\tthis.registerTableFunction(\"setPageSize\", this.userSetPageSize.bind(this));\n\t\tthis.registerTableFunction(\"getPageSize\", this.getPageSize.bind(this));\n\t\tthis.registerTableFunction(\"previousPage\", this.previousPage.bind(this));\n\t\tthis.registerTableFunction(\"nextPage\", this.nextPage.bind(this));\n\t\tthis.registerTableFunction(\"getPage\", this.getPage.bind(this));\n\t\tthis.registerTableFunction(\"getPageMax\", this.getPageMax.bind(this));\n\t\t\n\t\t//register component functions\n\t\tthis.registerComponentFunction(\"row\", \"pageTo\", this.setPageToRow.bind(this));\n\t}\n\t\n\tinitialize(){\n\t\tif(this.table.options.pagination){\n\t\t\tthis.subscribe(\"row-deleted\", this.rowsUpdated.bind(this));\n\t\t\tthis.subscribe(\"row-added\", this.rowsUpdated.bind(this));\n\t\t\tthis.subscribe(\"data-processed\", this.initialLoadComplete.bind(this));\n\t\t\tthis.subscribe(\"table-built\", this.calculatePageSizes.bind(this));\n\t\t\tthis.subscribe(\"footer-redraw\", this.footerRedraw.bind(this));\n\n\t\t\tif(this.table.options.paginationAddRow == \"page\"){\n\t\t\t\tthis.subscribe(\"row-adding-position\", this.rowAddingPosition.bind(this));\n\t\t\t}\n\t\t\t\n\t\t\tif(this.table.options.paginationMode === \"remote\"){\n\t\t\t\tthis.subscribe(\"data-params\", this.remotePageParams.bind(this));\n\t\t\t\tthis.subscribe(\"data-loaded\", this._parseRemoteData.bind(this));\n\t\t\t}\n\t\t\t\n\t\t\tif(this.table.options.progressiveLoad){\n\t\t\t\tconsole.error(\"Progressive Load Error - Pagination and progressive load cannot be used at the same time\");\n\t\t\t}\n\t\t\t\n\t\t\tthis.registerDisplayHandler(this.restOnRenderBefore.bind(this), 40);\n\t\t\tthis.registerDisplayHandler(this.getRows.bind(this), 50);\n\t\t\t\n\t\t\tthis.createElements();\n\t\t\tthis.initializePageCounter();\n\t\t\tthis.initializePaginator();\n\t\t}else if(this.table.options.progressiveLoad){\n\t\t\tthis.subscribe(\"data-params\", this.remotePageParams.bind(this));\n\t\t\tthis.subscribe(\"data-loaded\", this._parseRemoteData.bind(this));\n\t\t\tthis.subscribe(\"table-built\", this.calculatePageSizes.bind(this));\n\t\t\tthis.subscribe(\"data-processed\", this.initialLoadComplete.bind(this));\n\t\t\t\n\t\t\tthis.initializeProgressive(this.table.options.progressiveLoad);\n\t\t\t\n\t\t\tif(this.table.options.progressiveLoad === \"scroll\"){\n\t\t\t\tthis.subscribe(\"scroll-vertical\", this.scrollVertical.bind(this));\n\t\t\t}\n\t\t}\n\t}\n\t\n\trowAddingPosition(row, top){\n\t\tvar rowManager = this.table.rowManager,\n\t\tdisplayRows = rowManager.getDisplayRows(),\n\t\tindex;\n\t\t\n\t\tif(top){\n\t\t\tif(displayRows.length){\n\t\t\t\tindex = displayRows[0];\n\t\t\t}else {\n\t\t\t\tif(rowManager.activeRows.length){\n\t\t\t\t\tindex = rowManager.activeRows[rowManager.activeRows.length-1];\n\t\t\t\t\ttop = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}else {\n\t\t\tif(displayRows.length){\n\t\t\t\tindex = displayRows[displayRows.length - 1];\n\t\t\t\ttop = displayRows.length < this.size ? false : true;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn {index, top};\n\t}\n\t\n\tcalculatePageSizes(){\n\t\tvar testElRow, testElCell;\n\t\t\n\t\tif(this.table.options.paginationSize){\n\t\t\tthis.size = this.table.options.paginationSize;\n\t\t}else {\n\t\t\ttestElRow = document.createElement(\"div\");\n\t\t\ttestElRow.classList.add(\"tabulator-row\");\n\t\t\ttestElRow.style.visibility = \"hidden\";\n\t\t\t\n\t\t\ttestElCell = document.createElement(\"div\");\n\t\t\ttestElCell.classList.add(\"tabulator-cell\");\n\t\t\ttestElCell.innerHTML = \"Page Row Test\";\n\t\t\t\n\t\t\ttestElRow.appendChild(testElCell);\n\t\t\t\n\t\t\tthis.table.rowManager.getTableElement().appendChild(testElRow);\n\t\t\t\n\t\t\tthis.size = Math.floor(this.table.rowManager.getElement().clientHeight / testElRow.offsetHeight);\n\t\t\t\n\t\t\tthis.table.rowManager.getTableElement().removeChild(testElRow);\n\t\t}\n\n\t\tthis.dispatchExternal(\"pageSizeChanged\", this.size);\n\t\t\n\t\tthis.generatePageSizeSelectList();\n\t}\n\t\n\tinitialLoadComplete(){\n\t\tthis.initialLoad = false;\n\t}\n\t\n\tremotePageParams(data, config, silent, params){\n\t\tif(!this.initialLoad){\n\t\t\tif((this.progressiveLoad && !silent) || (!this.progressiveLoad && !this.dataChanging)){\n\t\t\t\tthis.reset(true);\n\t\t\t}\n\t\t}\n\t\t\n\t\t//configure request params\n\t\tparams.page = this.page;\n\t\t\n\t\t//set page size if defined\n\t\tif(this.size){\n\t\t\tparams.size = this.size;\n\t\t}\n\t\t\n\t\treturn params;\n\t}\n\t\n\t///////////////////////////////////\n\t///////// Table Functions /////////\n\t///////////////////////////////////\n\t\n\tuserSetPageToRow(row){\n\t\tif(this.table.options.pagination){\n\t\t\trow = this.table.rowManager.findRow(row);\n\t\t\t\n\t\t\tif(row){\n\t\t\t\treturn this.setPageToRow(row);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn Promise.reject();\n\t}\n\t\n\tuserSetPageSize(size){\n\t\tif(this.table.options.pagination){\n\t\t\tthis.setPageSize(size);\n\t\t\treturn this.setPage(1);\n\t\t}else {\n\t\t\treturn false;\n\t\t}\n\t}\n\t///////////////////////////////////\n\t///////// Internal Logic //////////\n\t///////////////////////////////////\n\t\n\tscrollVertical(top, dir){\n\t\tvar element, diff, margin;\n\t\tif(!dir && !this.table.dataLoader.loading){\n\t\t\telement = this.table.rowManager.getElement();\n\t\t\tdiff = element.scrollHeight - element.clientHeight - top;\n\t\t\tmargin = this.table.options.progressiveLoadScrollMargin || (element.clientHeight * 2);\n\t\t\t\n\t\t\tif(diff < margin){\n\t\t\t\tthis.nextPage()\n\t\t\t\t\t.catch(() => {}); //consume the exception thrown when on the last page\n\t\t\t}\n\t\t}\n\t}\n\t\n\trestOnRenderBefore(rows, renderInPosition){\n\t\tif(!renderInPosition){\n\t\t\tif(this.mode === \"local\"){\n\t\t\t\tthis.reset();\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn rows;\n\t}\n\t\n\trowsUpdated(){\n\t\tthis.refreshData(true, \"all\");\n\t}\n\t\n\tcreateElements(){\n\t\tvar button;\n\t\t\n\t\tthis.element = document.createElement(\"span\");\n\t\tthis.element.classList.add(\"tabulator-paginator\");\n\t\t\n\t\tthis.pagesElement = document.createElement(\"span\");\n\t\tthis.pagesElement.classList.add(\"tabulator-pages\");\n\t\t\n\t\tbutton = document.createElement(\"button\");\n\t\tbutton.classList.add(\"tabulator-page\");\n\t\tbutton.setAttribute(\"type\", \"button\");\n\t\tbutton.setAttribute(\"role\", \"button\");\n\t\tbutton.setAttribute(\"aria-label\", \"\");\n\t\tbutton.setAttribute(\"title\", \"\");\n\t\t\n\t\tthis.firstBut = button.cloneNode(true);\n\t\tthis.firstBut.setAttribute(\"data-page\", \"first\");\n\t\t\n\t\tthis.prevBut = button.cloneNode(true);\n\t\tthis.prevBut.setAttribute(\"data-page\", \"prev\");\n\t\t\n\t\tthis.nextBut = button.cloneNode(true);\n\t\tthis.nextBut.setAttribute(\"data-page\", \"next\");\n\t\t\n\t\tthis.lastBut = button.cloneNode(true);\n\t\tthis.lastBut.setAttribute(\"data-page\", \"last\");\n\t\t\n\t\tif(this.table.options.paginationSizeSelector){\n\t\t\tthis.pageSizeSelect = document.createElement(\"select\");\n\t\t\tthis.pageSizeSelect.classList.add(\"tabulator-page-size\");\n\t\t}\n\t}\n\t\n\tgeneratePageSizeSelectList(){\n\t\tvar pageSizes = [];\n\t\t\n\t\tif(this.pageSizeSelect){\n\t\t\t\n\t\t\tif(Array.isArray(this.table.options.paginationSizeSelector)){\n\t\t\t\tpageSizes = this.table.options.paginationSizeSelector;\n\t\t\t\tthis.pageSizes = pageSizes;\n\t\t\t\t\n\t\t\t\tif(this.pageSizes.indexOf(this.size) == -1){\n\t\t\t\t\tpageSizes.unshift(this.size);\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\t\n\t\t\t\tif(this.pageSizes.indexOf(this.size) == -1){\n\t\t\t\t\tpageSizes = [];\n\t\t\t\t\t\n\t\t\t\t\tfor (let i = 1; i < 5; i++){\n\t\t\t\t\t\tpageSizes.push(this.size * i);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tthis.pageSizes = pageSizes;\n\t\t\t\t}else {\n\t\t\t\t\tpageSizes = this.pageSizes;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\twhile(this.pageSizeSelect.firstChild) this.pageSizeSelect.removeChild(this.pageSizeSelect.firstChild);\n\t\t\t\n\t\t\tpageSizes.forEach((item) => {\n\t\t\t\tvar itemEl = document.createElement(\"option\");\n\t\t\t\titemEl.value = item;\n\t\t\t\t\n\t\t\t\tif(item === true){\n\t\t\t\t\tthis.langBind(\"pagination|all\", function(value){\n\t\t\t\t\t\titemEl.innerHTML = value;\n\t\t\t\t\t});\n\t\t\t\t}else {\n\t\t\t\t\titemEl.innerHTML = item;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tthis.pageSizeSelect.appendChild(itemEl);\n\t\t\t});\n\t\t\t\n\t\t\tthis.pageSizeSelect.value = this.size;\n\t\t}\n\t}\n\t\n\tinitializePageCounter(){\n\t\tvar counter = this.table.options.paginationCounter,\n\t\tpageCounter = null;\n\t\t\n\t\tif(counter){\n\t\t\tif(typeof counter === \"function\"){\n\t\t\t\tpageCounter = counter;\n\t\t\t}else {\n\t\t\t\tpageCounter = Page.pageCounters[counter];\n\t\t\t}\n\t\t\t\n\t\t\tif(pageCounter){\n\t\t\t\tthis.pageCounter = pageCounter;\n\t\t\t\t\n\t\t\t\tthis.pageCounterElement = document.createElement(\"span\");\n\t\t\t\tthis.pageCounterElement.classList.add(\"tabulator-page-counter\");\n\t\t\t}else {\n\t\t\t\tconsole.warn(\"Pagination Error - No such page counter found: \", counter);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t//setup pagination\n\tinitializePaginator(hidden){\n\t\tvar pageSelectLabel, paginationCounterHolder;\n\t\t\n\t\tif(!hidden){\n\t\t\t//build pagination element\n\t\t\t\n\t\t\t//bind localizations\n\t\t\tthis.langBind(\"pagination|first\", (value) => {\n\t\t\t\tthis.firstBut.innerHTML = value;\n\t\t\t});\n\t\t\t\n\t\t\tthis.langBind(\"pagination|first_title\", (value) => {\n\t\t\t\tthis.firstBut.setAttribute(\"aria-label\", value);\n\t\t\t\tthis.firstBut.setAttribute(\"title\", value);\n\t\t\t});\n\t\t\t\n\t\t\tthis.langBind(\"pagination|prev\", (value) => {\n\t\t\t\tthis.prevBut.innerHTML = value;\n\t\t\t});\n\t\t\t\n\t\t\tthis.langBind(\"pagination|prev_title\", (value) => {\n\t\t\t\tthis.prevBut.setAttribute(\"aria-label\", value);\n\t\t\t\tthis.prevBut.setAttribute(\"title\", value);\n\t\t\t});\n\t\t\t\n\t\t\tthis.langBind(\"pagination|next\", (value) => {\n\t\t\t\tthis.nextBut.innerHTML = value;\n\t\t\t});\n\t\t\t\n\t\t\tthis.langBind(\"pagination|next_title\", (value) => {\n\t\t\t\tthis.nextBut.setAttribute(\"aria-label\", value);\n\t\t\t\tthis.nextBut.setAttribute(\"title\", value);\n\t\t\t});\n\t\t\t\n\t\t\tthis.langBind(\"pagination|last\", (value) => {\n\t\t\t\tthis.lastBut.innerHTML = value;\n\t\t\t});\n\t\t\t\n\t\t\tthis.langBind(\"pagination|last_title\", (value) => {\n\t\t\t\tthis.lastBut.setAttribute(\"aria-label\", value);\n\t\t\t\tthis.lastBut.setAttribute(\"title\", value);\n\t\t\t});\n\t\t\t\n\t\t\t//click bindings\n\t\t\tthis.firstBut.addEventListener(\"click\", () => {\n\t\t\t\tthis.setPage(1);\n\t\t\t});\n\t\t\t\n\t\t\tthis.prevBut.addEventListener(\"click\", () => {\n\t\t\t\tthis.previousPage();\n\t\t\t});\n\t\t\t\n\t\t\tthis.nextBut.addEventListener(\"click\", () => {\n\t\t\t\tthis.nextPage();\n\t\t\t});\n\t\t\t\n\t\t\tthis.lastBut.addEventListener(\"click\", () => {\n\t\t\t\tthis.setPage(this.max);\n\t\t\t});\n\t\t\t\n\t\t\tif(this.table.options.paginationElement){\n\t\t\t\tthis.element = this.table.options.paginationElement;\n\t\t\t}\n\t\t\t\n\t\t\tif(this.pageSizeSelect){\n\t\t\t\tpageSelectLabel = document.createElement(\"label\");\n\t\t\t\t\n\t\t\t\tthis.langBind(\"pagination|page_size\", (value) => {\n\t\t\t\t\tthis.pageSizeSelect.setAttribute(\"aria-label\", value);\n\t\t\t\t\tthis.pageSizeSelect.setAttribute(\"title\", value);\n\t\t\t\t\tpageSelectLabel.innerHTML = value;\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tthis.element.appendChild(pageSelectLabel);\n\t\t\t\tthis.element.appendChild(this.pageSizeSelect);\n\t\t\t\t\n\t\t\t\tthis.pageSizeSelect.addEventListener(\"change\", (e) => {\n\t\t\t\t\tthis.setPageSize(this.pageSizeSelect.value == \"true\" ? true : this.pageSizeSelect.value);\n\t\t\t\t\tthis.setPage(1);\n\t\t\t\t});\n\t\t\t}\n\t\t\t\n\t\t\t//append to DOM\n\t\t\tthis.element.appendChild(this.firstBut);\n\t\t\tthis.element.appendChild(this.prevBut);\n\t\t\tthis.element.appendChild(this.pagesElement);\n\t\t\tthis.element.appendChild(this.nextBut);\n\t\t\tthis.element.appendChild(this.lastBut);\n\t\t\t\n\t\t\tif(!this.table.options.paginationElement){\n\t\t\t\tif(this.table.options.paginationCounter){\n\n\t\t\t\t\tif(this.table.options.paginationCounterElement){\n\t\t\t\t\t\tif(this.table.options.paginationCounterElement instanceof HTMLElement){\n\t\t\t\t\t\t\tthis.table.options.paginationCounterElement.appendChild(this.pageCounterElement);\n\t\t\t\t\t\t}else if(typeof this.table.options.paginationCounterElement === \"string\"){\n\t\t\t\t\t\t\tpaginationCounterHolder = document.querySelector(this.table.options.paginationCounterElement);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(paginationCounterHolder){\n\t\t\t\t\t\t\t\tpaginationCounterHolder.appendChild(this.pageCounterElement);\n\t\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\t\tconsole.warn(\"Pagination Error - Unable to find element matching paginationCounterElement selector:\", this.table.options.paginationCounterElement);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}else {\n\t\t\t\t\t\tthis.footerAppend(this.pageCounterElement);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.footerAppend(this.element);\n\t\t\t}\n\t\t\t\n\t\t\tthis.page = this.table.options.paginationInitialPage;\n\t\t\tthis.count = this.table.options.paginationButtonCount;\n\t\t}\n\t\t\n\t\t//set default values\n\t\tthis.mode = this.table.options.paginationMode;\n\t}\n\t\n\tinitializeProgressive(mode){\n\t\tthis.initializePaginator(true);\n\t\tthis.mode = \"progressive_\" + mode;\n\t\tthis.progressiveLoad = true;\n\t}\n\t\n\ttrackChanges(){\n\t\tthis.dispatch(\"page-changed\");\n\t}\n\t\n\t//calculate maximum page from number of rows\n\tsetMaxRows(rowCount){\n\t\tif(!rowCount){\n\t\t\tthis.max = 1;\n\t\t}else {\n\t\t\tthis.max = this.size === true ? 1 : Math.ceil(rowCount/this.size);\n\t\t}\n\t\t\n\t\tif(this.page > this.max){\n\t\t\tthis.page = this.max;\n\t\t}\n\t}\n\t\n\t//reset to first page without triggering action\n\treset(force){\n\t\tif(!this.initialLoad){\n\t\t\tif(this.mode == \"local\" || force){\n\t\t\t\tthis.page = 1;\n\t\t\t\tthis.trackChanges();\n\t\t\t}\n\t\t}\n\t}\n\t\n\t//set the maximum page\n\tsetMaxPage(max){\n\t\t\n\t\tmax = parseInt(max);\n\t\t\n\t\tthis.max = max || 1;\n\t\t\n\t\tif(this.page > this.max){\n\t\t\tthis.page = this.max;\n\t\t\tthis.trigger();\n\t\t}\n\t}\n\t\n\t//set current page number\n\tsetPage(page){\n\t\tswitch(page){\n\t\t\tcase \"first\":\n\t\t\t\treturn this.setPage(1);\n\t\n\t\t\tcase \"prev\":\n\t\t\t\treturn this.previousPage();\n\t\t\t\n\t\t\tcase \"next\":\n\t\t\t\treturn this.nextPage();\n\t\t\t\n\t\t\tcase \"last\":\n\t\t\t\treturn this.setPage(this.max);\n\t\t}\n\t\t\n\t\tpage = parseInt(page);\n\t\t\n\t\tif((page > 0 && page <= this.max) || this.mode !== \"local\"){\n\t\t\tthis.page = page;\n\t\t\t\n\t\t\tthis.trackChanges();\n\t\t\t\n\t\t\treturn this.trigger();\n\t\t}else {\n\t\t\tconsole.warn(\"Pagination Error - Requested page is out of range of 1 - \" + this.max + \":\", page);\n\t\t\treturn Promise.reject();\n\t\t}\n\t}\n\t\n\tsetPageToRow(row){\n\t\tvar rows = this.displayRows(-1);\n\t\tvar index = rows.indexOf(row);\n\t\n\t\tif(index > -1){\n\t\t\tvar page = this.size === true ? 1 : Math.ceil((index + 1) / this.size);\n\t\t\t\n\t\t\treturn this.setPage(page);\n\t\t}else {\n\t\t\tconsole.warn(\"Pagination Error - Requested row is not visible\");\n\t\t\treturn Promise.reject();\n\t\t}\n\t}\n\t\n\tsetPageSize(size){\n\t\tif(size !== true){\n\t\t\tsize = parseInt(size);\n\t\t}\n\n\t\tif(size > 0){\n\t\t\tthis.size = size;\n\t\t\tthis.dispatchExternal(\"pageSizeChanged\", size);\n\t\t}\n\t\t\n\t\tif(this.pageSizeSelect){\n\t\t\t// this.pageSizeSelect.value = size;\n\t\t\tthis.generatePageSizeSelectList();\n\t\t}\n\t\t\n\t\tthis.trackChanges();\n\t}\n\t\n\t_setPageCounter(totalRows, size, currentRow){\n\t\tvar content;\n\t\t\n\t\tif(this.pageCounter){\n\n\t\t\tif(this.mode === \"remote\"){\n\t\t\t\tsize = this.size;\n\t\t\t\tcurrentRow = ((this.page - 1) * this.size) + 1;\n\t\t\t\ttotalRows = this.remoteRowCountEstimate;\n\t\t\t}\n\n\t\t\tcontent = this.pageCounter.call(this, size, currentRow, this.page, totalRows, this.max);\n\t\t\t\n\t\t\tswitch(typeof content){\n\t\t\t\tcase \"object\":\n\t\t\t\t\tif(content instanceof Node){\n\t\t\t\t\t\n\t\t\t\t\t\t//clear previous cell contents\n\t\t\t\t\t\twhile(this.pageCounterElement.firstChild) this.pageCounterElement.removeChild(this.pageCounterElement.firstChild);\n\t\t\t\t\t\n\t\t\t\t\t\tthis.pageCounterElement.appendChild(content);\n\t\t\t\t\t}else {\n\t\t\t\t\t\tthis.pageCounterElement.innerHTML = \"\";\n\t\t\t\t\t\n\t\t\t\t\t\tif(content != null){\n\t\t\t\t\t\t\tconsole.warn(\"Page Counter Error - Page Counter has returned a type of object, the only valid page counter object return is an instance of Node, the page counter returned:\", content);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"undefined\":\n\t\t\t\t\tthis.pageCounterElement.innerHTML = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthis.pageCounterElement.innerHTML = content;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t//setup the pagination buttons\n\t_setPageButtons(){\n\t\tlet leftSize = Math.floor((this.count-1) / 2);\n\t\tlet rightSize = Math.ceil((this.count-1) / 2);\n\t\tlet min = this.max - this.page + leftSize + 1 < this.count ? this.max-this.count+1: Math.max(this.page-leftSize,1);\n\t\tlet max = this.page <= rightSize? Math.min(this.count, this.max) :Math.min(this.page+rightSize, this.max);\n\t\t\n\t\twhile(this.pagesElement.firstChild) this.pagesElement.removeChild(this.pagesElement.firstChild);\n\t\t\n\t\tif(this.page == 1){\n\t\t\tthis.firstBut.disabled = true;\n\t\t\tthis.prevBut.disabled = true;\n\t\t}else {\n\t\t\tthis.firstBut.disabled = false;\n\t\t\tthis.prevBut.disabled = false;\n\t\t}\n\t\t\n\t\tif(this.page == this.max){\n\t\t\tthis.lastBut.disabled = true;\n\t\t\tthis.nextBut.disabled = true;\n\t\t}else {\n\t\t\tthis.lastBut.disabled = false;\n\t\t\tthis.nextBut.disabled = false;\n\t\t}\n\t\t\n\t\tfor(let i = min; i <= max; i++){\n\t\t\tif(i>0 && i <= this.max){\n\t\t\t\tthis.pagesElement.appendChild(this._generatePageButton(i));\n\t\t\t}\n\t\t}\n\t\t\n\t\tthis.footerRedraw();\n\t}\n\t\n\t_generatePageButton(page){\n\t\tvar button = document.createElement(\"button\");\n\t\t\n\t\tbutton.classList.add(\"tabulator-page\");\n\t\tif(page == this.page){\n\t\t\tbutton.classList.add(\"active\");\n\t\t}\n\t\t\n\t\tbutton.setAttribute(\"type\", \"button\");\n\t\tbutton.setAttribute(\"role\", \"button\");\n\t\t\n\t\tthis.langBind(\"pagination|page_title\", (value) => {\n\t\t\tbutton.setAttribute(\"aria-label\", value + \" \" + page);\n\t\t\tbutton.setAttribute(\"title\", value + \" \" + page);\n\t\t});\n\t\t\n\t\tbutton.setAttribute(\"data-page\", page);\n\t\tbutton.textContent = page;\n\t\t\n\t\tbutton.addEventListener(\"click\", (e) => {\n\t\t\tthis.setPage(page);\n\t\t});\n\t\t\n\t\treturn button;\n\t}\n\t\n\t//previous page\n\tpreviousPage(){\n\t\tif(this.page > 1){\n\t\t\tthis.page--;\n\t\t\t\n\t\t\tthis.trackChanges();\n\t\t\t\n\t\t\treturn this.trigger();\n\t\t\t\n\t\t}else {\n\t\t\tconsole.warn(\"Pagination Error - Previous page would be less than page 1:\", 0);\n\t\t\treturn Promise.reject();\n\t\t}\n\t}\n\t\n\t//next page\n\tnextPage(){\n\t\tif(this.page < this.max){\n\t\t\tthis.page++;\n\t\t\t\n\t\t\tthis.trackChanges();\n\t\t\t\n\t\t\treturn this.trigger();\n\t\t\t\n\t\t}else {\n\t\t\tif(!this.progressiveLoad){\n\t\t\t\tconsole.warn(\"Pagination Error - Next page would be greater than maximum page of \" + this.max + \":\", this.max + 1);\n\t\t\t}\n\t\t\treturn Promise.reject();\n\t\t}\n\t}\n\t\n\t//return current page number\n\tgetPage(){\n\t\treturn this.page;\n\t}\n\t\n\t//return max page number\n\tgetPageMax(){\n\t\treturn this.max;\n\t}\n\t\n\tgetPageSize(size){\n\t\treturn this.size;\n\t}\n\t\n\tgetMode(){\n\t\treturn this.mode;\n\t}\n\t\n\t//return appropriate rows for current page\n\tgetRows(data){\n\t\tvar actualRowPageSize = 0,\n\t\toutput, start, end, actualStartRow;\n\n\t\tvar actualRows = data.filter((row) => {\n\t\t\treturn row.type === \"row\";\n\t\t});\n\t\t\n\t\tif(this.mode == \"local\"){\n\t\t\toutput = [];\n\t\t\t\n\t\t\tthis.setMaxRows(data.length);\n\t\t\t\n\t\t\tif(this.size === true){\n\t\t\t\tstart = 0;\n\t\t\t\tend = data.length;\n\t\t\t}else {\n\t\t\t\tstart = this.size * (this.page - 1);\n\t\t\t\tend = start + parseInt(this.size);\n\t\t\t}\n\t\t\t\n\t\t\tthis._setPageButtons();\n\t\t\t\n\t\t\tfor(let i = start; i < end; i++){\n\t\t\t\tlet row = data[i];\n\n\t\t\t\tif(row){\n\t\t\t\t\toutput.push(row);\n\n\t\t\t\t\tif(row.type === \"row\"){\n\t\t\t\t\t\tif(!actualStartRow){\n\t\t\t\t\t\t\tactualStartRow = row;\n\t\t\t\t\t\t}\t\n\n\t\t\t\t\t\tactualRowPageSize++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tthis._setPageCounter(actualRows.length, actualRowPageSize, actualStartRow ? (actualRows.indexOf(actualStartRow) + 1) : 0);\n\t\t\t\n\t\t\treturn output;\n\t\t}else {\n\t\t\tthis._setPageButtons();\n\t\t\tthis._setPageCounter(actualRows.length);\n\t\t\t\n\t\t\treturn data.slice(0);\n\t\t}\n\t}\n\t\n\ttrigger(){\n\t\tvar left;\n\t\t\n\t\tswitch(this.mode){\n\t\t\tcase \"local\":\n\t\t\t\tleft = this.table.rowManager.scrollLeft;\n\t\t\t\n\t\t\t\tthis.refreshData();\n\t\t\t\tthis.table.rowManager.scrollHorizontal(left);\n\t\t\t\n\t\t\t\tthis.dispatchExternal(\"pageLoaded\", this.getPage());\n\t\t\t\n\t\t\t\treturn Promise.resolve();\n\t\t\t\n\t\t\tcase \"remote\":\n\t\t\t\tthis.dataChanging = true;\n\t\t\t\treturn this.reloadData(null)\n\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\tthis.dataChanging = false;\n\t\t\t\t\t});\n\t\t\t\n\t\t\tcase \"progressive_load\":\n\t\t\tcase \"progressive_scroll\":\n\t\t\t\treturn this.reloadData(null, true);\n\t\t\t\n\t\t\tdefault:\n\t\t\t\tconsole.warn(\"Pagination Error - no such pagination mode:\", this.mode);\n\t\t\t\treturn Promise.reject();\n\t\t}\n\t}\n\t\n\t_parseRemoteData(data){\n\t\tvar margin, paginationOutOfRange;\n\t\t\n\t\tif(typeof data.last_page === \"undefined\"){\n\t\t\tconsole.warn(\"Remote Pagination Error - Server response missing '\" + (this.options(\"dataReceiveParams\").last_page || \"last_page\") + \"' property\");\n\t\t}\n\t\t\n\t\tif(data.data){\n\t\t\tthis.max = parseInt(data.last_page) || 1;\n\n\t\t\tthis.remoteRowCountEstimate = typeof data.last_row !== \"undefined\" ? data.last_row : (data.last_page * this.size - (this.page == data.last_page ? (this.size - data.data.length) : 0));\n\t\t\t\n\t\t\tif(this.progressiveLoad){\n\t\t\t\tswitch(this.mode){\n\t\t\t\t\tcase \"progressive_load\":\n\t\t\t\t\t\n\t\t\t\t\t\tif(this.page == 1){\n\t\t\t\t\t\t\tthis.table.rowManager.setData(data.data, false, this.page == 1);\n\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\tthis.table.rowManager.addRows(data.data);\n\t\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\tif(this.page < this.max){\n\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\tthis.nextPage();\n\t\t\t\t\t\t\t}, this.table.options.progressiveLoadDelay);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"progressive_scroll\":\n\t\t\t\t\t\tdata = this.page === 1 ? data.data : this.table.rowManager.getData().concat(data.data);\n\t\t\t\t\t\n\t\t\t\t\t\tthis.table.rowManager.setData(data, this.page !== 1, this.page == 1);\n\t\t\t\t\t\n\t\t\t\t\t\tmargin = this.table.options.progressiveLoadScrollMargin || (this.table.rowManager.element.clientHeight * 2);\n\t\t\t\t\t\n\t\t\t\t\t\tif(this.table.rowManager.element.scrollHeight <= (this.table.rowManager.element.clientHeight + margin)){\n\t\t\t\t\t\t\tif(this.page < this.max){\n\t\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\t\tthis.nextPage();\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn false;\n\t\t\t}else {\n\n\t\t\t\tif(this.page > this.max){\n\t\t\t\t\tconsole.warn( \"Remote Pagination Error - Server returned last page value lower than the current page\" );\n\n\t\t\t\t\tpaginationOutOfRange = this.options('paginationOutOfRange');\n\n\t\t\t\t\tif(paginationOutOfRange){\n\t\t\t\t\t\treturn this.setPage(typeof paginationOutOfRange === 'function' ? paginationOutOfRange.call(this, this.page, this.max) :\tpaginationOutOfRange);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// left = this.table.rowManager.scrollLeft;\n\t\t\t\tthis.dispatchExternal(\"pageLoaded\", this.getPage());\n\t\t\t\t// this.table.rowManager.scrollHorizontal(left);\n\t\t\t\t// this.table.columnManager.scrollHorizontal(left);\n\t\t\t}\n\t\t\t\n\t\t}else {\n\t\t\tconsole.warn(\"Remote Pagination Error - Server response missing '\" + (this.options(\"dataReceiveParams\").data || \"data\") + \"' property\");\n\t\t}\n\t\t\n\t\treturn data.data;\n\t}\n\t\n\t//handle the footer element being redrawn\n\tfooterRedraw(){\n\t\tvar footer = this.table.footerManager.containerElement;\n\n\t\tif((Math.ceil(footer.clientWidth) - footer.scrollWidth) < 0){\n\t\t\tthis.pagesElement.style.display = 'none';\n\t\t}else {\n\t\t\tthis.pagesElement.style.display = '';\n\t\t\t\n\t\t\tif((Math.ceil(footer.clientWidth) - footer.scrollWidth) < 0){\n\t\t\t\tthis.pagesElement.style.display = 'none';\n\t\t\t}\n\t\t}\n\t}\n}\n\n// read persistance information from storage\nvar defaultReaders = {\n\tlocal:function(id, type){\n\t\tvar data = localStorage.getItem(id + \"-\" + type);\n\n\t\treturn data ? JSON.parse(data) : false;\n\t},\n\tcookie:function(id, type){\n\t\tvar cookie = document.cookie,\n\t\tkey = id + \"-\" + type,\n\t\tcookiePos = cookie.indexOf(key + \"=\"),\n\t\tend, data;\n\n\t\t//if cookie exists, decode and load column data into tabulator\n\t\tif(cookiePos > -1){\n\t\t\tcookie = cookie.slice(cookiePos);\n\n\t\t\tend = cookie.indexOf(\";\");\n\n\t\t\tif(end > -1){\n\t\t\t\tcookie = cookie.slice(0, end);\n\t\t\t}\n\n\t\t\tdata = cookie.replace(key + \"=\", \"\");\n\t\t}\n\n\t\treturn data ? JSON.parse(data) : false;\n\t}\n};\n\n//write persistence information to storage\nvar defaultWriters = {\n\tlocal:function(id, type, data){\n\t\tlocalStorage.setItem(id + \"-\" + type, JSON.stringify(data));\n\t},\n\tcookie:function(id, type, data){\n\t\tvar expireDate = new Date();\n\n\t\texpireDate.setDate(expireDate.getDate() + 10000);\n\n\t\tdocument.cookie = id + \"-\" + type + \"=\" + JSON.stringify(data) + \"; expires=\" + expireDate.toUTCString();\n\t}\n};\n\nclass Persistence extends Module{\n\n\tstatic moduleName = \"persistence\";\n\n\tstatic moduleInitOrder = -10;\n\n\t//load defaults\n\tstatic readers = defaultReaders;\n\tstatic writers = defaultWriters;\n\n\tconstructor(table){\n\t\tsuper(table);\n\n\t\tthis.mode = \"\";\n\t\tthis.id = \"\";\n\t\t// this.persistProps = [\"field\", \"width\", \"visible\"];\n\t\tthis.defWatcherBlock = false;\n\t\tthis.config = {};\n\t\tthis.readFunc = false;\n\t\tthis.writeFunc = false;\n\n\t\tthis.registerTableOption(\"persistence\", false);\n\t\tthis.registerTableOption(\"persistenceID\", \"\"); //key for persistent storage\n\t\tthis.registerTableOption(\"persistenceMode\", true); //mode for storing persistence information\n\t\tthis.registerTableOption(\"persistenceReaderFunc\", false); //function for handling persistence data reading\n\t\tthis.registerTableOption(\"persistenceWriterFunc\", false); //function for handling persistence data writing\n\t}\n\n\t// Test for whether localStorage is available for use.\n\tlocalStorageTest() {\n\t\tvar testKey = \"_tabulator_test\";\n\n\t\ttry {\n\t\t\twindow.localStorage.setItem( testKey, testKey);\n\t\t\twindow.localStorage.removeItem( testKey );\n\t\t\treturn true;\n\t\t} catch(e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t//setup parameters\n\tinitialize(){\n\t\tif(this.table.options.persistence){\n\t\t\t//determine persistent layout storage type\n\t\t\tvar mode = this.table.options.persistenceMode,\n\t\t\tid = this.table.options.persistenceID,\n\t\t\tretrievedData;\n\n\t\t\tthis.mode = mode !== true ? mode : (this.localStorageTest() ? \"local\" : \"cookie\");\n\n\t\t\tif(this.table.options.persistenceReaderFunc){\n\t\t\t\tif(typeof this.table.options.persistenceReaderFunc === \"function\"){\n\t\t\t\t\tthis.readFunc = this.table.options.persistenceReaderFunc;\n\t\t\t\t}else {\n\t\t\t\t\tif(Persistence.readers[this.table.options.persistenceReaderFunc]){\n\t\t\t\t\t\tthis.readFunc = Persistence.readers[this.table.options.persistenceReaderFunc];\n\t\t\t\t\t}else {\n\t\t\t\t\t\tconsole.warn(\"Persistence Read Error - invalid reader set\", this.table.options.persistenceReaderFunc);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tif(Persistence.readers[this.mode]){\n\t\t\t\t\tthis.readFunc = Persistence.readers[this.mode];\n\t\t\t\t}else {\n\t\t\t\t\tconsole.warn(\"Persistence Read Error - invalid reader set\", this.mode);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(this.table.options.persistenceWriterFunc){\n\t\t\t\tif(typeof this.table.options.persistenceWriterFunc === \"function\"){\n\t\t\t\t\tthis.writeFunc = this.table.options.persistenceWriterFunc;\n\t\t\t\t}else {\n\t\t\t\t\tif(Persistence.writers[this.table.options.persistenceWriterFunc]){\n\t\t\t\t\t\tthis.writeFunc = Persistence.writers[this.table.options.persistenceWriterFunc];\n\t\t\t\t\t}else {\n\t\t\t\t\t\tconsole.warn(\"Persistence Write Error - invalid reader set\", this.table.options.persistenceWriterFunc);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tif(Persistence.writers[this.mode]){\n\t\t\t\t\tthis.writeFunc = Persistence.writers[this.mode];\n\t\t\t\t}else {\n\t\t\t\t\tconsole.warn(\"Persistence Write Error - invalid writer set\", this.mode);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//set storage tag\n\t\t\tthis.id = \"tabulator-\" + (id || (this.table.element.getAttribute(\"id\") || \"\"));\n\n\t\t\tthis.config = {\n\t\t\t\tsort:this.table.options.persistence === true || this.table.options.persistence.sort,\n\t\t\t\tfilter:this.table.options.persistence === true || this.table.options.persistence.filter,\n\t\t\t\theaderFilter:this.table.options.persistence === true || this.table.options.persistence.headerFilter,\n\t\t\t\tgroup:this.table.options.persistence === true || this.table.options.persistence.group,\n\t\t\t\tpage:this.table.options.persistence === true || this.table.options.persistence.page,\n\t\t\t\tcolumns:this.table.options.persistence === true ? [\"title\", \"width\", \"visible\"] : this.table.options.persistence.columns,\n\t\t\t};\n\n\t\t\t//load pagination data if needed\n\t\t\tif(this.config.page){\n\t\t\t\tretrievedData = this.retrieveData(\"page\");\n\n\t\t\t\tif(retrievedData){\n\t\t\t\t\tif(typeof retrievedData.paginationSize !== \"undefined\" && (this.config.page === true || this.config.page.size)){\n\t\t\t\t\t\tthis.table.options.paginationSize = retrievedData.paginationSize;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(typeof retrievedData.paginationInitialPage !== \"undefined\" && (this.config.page === true || this.config.page.page)){\n\t\t\t\t\t\tthis.table.options.paginationInitialPage = retrievedData.paginationInitialPage;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//load group data if needed\n\t\t\tif(this.config.group){\n\t\t\t\tretrievedData = this.retrieveData(\"group\");\n\n\t\t\t\tif(retrievedData){\n\t\t\t\t\tif(typeof retrievedData.groupBy !== \"undefined\" && (this.config.group === true || this.config.group.groupBy)){\n\t\t\t\t\t\tthis.table.options.groupBy = retrievedData.groupBy;\n\t\t\t\t\t}\n\t\t\t\t\tif(typeof retrievedData.groupStartOpen !== \"undefined\" && (this.config.group === true || this.config.group.groupStartOpen)){\n\t\t\t\t\t\tthis.table.options.groupStartOpen = retrievedData.groupStartOpen;\n\t\t\t\t\t}\n\t\t\t\t\tif(typeof retrievedData.groupHeader !== \"undefined\" && (this.config.group === true || this.config.group.groupHeader)){\n\t\t\t\t\t\tthis.table.options.groupHeader = retrievedData.groupHeader;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(this.config.columns){\n\t\t\t\tthis.table.options.columns = this.load(\"columns\", this.table.options.columns);\n\t\t\t\tthis.subscribe(\"column-init\", this.initializeColumn.bind(this));\n\t\t\t\tthis.subscribe(\"column-show\", this.save.bind(this, \"columns\"));\n\t\t\t\tthis.subscribe(\"column-hide\", this.save.bind(this, \"columns\"));\n\t\t\t\tthis.subscribe(\"column-moved\", this.save.bind(this, \"columns\"));\n\t\t\t}\n\n\t\t\tthis.subscribe(\"table-built\", this.tableBuilt.bind(this), 0);\n\n\t\t\tthis.subscribe(\"table-redraw\", this.tableRedraw.bind(this));\n\n\t\t\tthis.subscribe(\"filter-changed\", this.eventSave.bind(this, \"filter\"));\n\t\t\tthis.subscribe(\"filter-changed\", this.eventSave.bind(this, \"headerFilter\"));\n\t\t\tthis.subscribe(\"sort-changed\", this.eventSave.bind(this, \"sort\"));\n\t\t\tthis.subscribe(\"group-changed\", this.eventSave.bind(this, \"group\"));\n\t\t\tthis.subscribe(\"page-changed\", this.eventSave.bind(this, \"page\"));\n\t\t\tthis.subscribe(\"column-resized\", this.eventSave.bind(this, \"columns\"));\n\t\t\tthis.subscribe(\"column-width\", this.eventSave.bind(this, \"columns\"));\n\t\t\tthis.subscribe(\"layout-refreshed\", this.eventSave.bind(this, \"columns\"));\n\t\t}\n\n\t\tthis.registerTableFunction(\"getColumnLayout\", this.getColumnLayout.bind(this));\n\t\tthis.registerTableFunction(\"setColumnLayout\", this.setColumnLayout.bind(this));\n\t}\n\n\teventSave(type){\n\t\tif(this.config[type]){\n\t\t\tthis.save(type);\n\t\t}\n\t}\n\n\ttableBuilt(){\n\t\tvar sorters, filters, headerFilters;\n\n\t\tif(this.config.sort){\n\t\t\tsorters = this.load(\"sort\");\n\n\t\t\tif(!sorters === false){\n\t\t\t\tthis.table.options.initialSort = sorters;\n\t\t\t}\n\t\t}\n\n\t\tif(this.config.filter){\n\t\t\tfilters = this.load(\"filter\");\n\n\t\t\tif(!filters === false){\n\t\t\t\tthis.table.options.initialFilter = filters;\n\t\t\t}\n\t\t}\n\t\tif(this.config.headerFilter){\n\t\t\theaderFilters = this.load(\"headerFilter\");\n\n\t\t\tif(!headerFilters === false){\n\t\t\t\tthis.table.options.initialHeaderFilter = headerFilters;\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\n\ttableRedraw(force){\n\t\tif(force && this.config.columns){\n\t\t\tthis.save(\"columns\");\n\t\t}\n\t}\n\n\t///////////////////////////////////\n\t///////// Table Functions /////////\n\t///////////////////////////////////\n\n\tgetColumnLayout(){\n\t\treturn this.parseColumns(this.table.columnManager.getColumns());\n\t}\n\n\tsetColumnLayout(layout){\n\t\tthis.table.columnManager.setColumns(this.mergeDefinition(this.table.options.columns, layout, true));\n\t\treturn true;\n\t}\n\n\t///////////////////////////////////\n\t///////// Internal Logic //////////\n\t///////////////////////////////////\n\n\tinitializeColumn(column){\n\t\tvar def, keys;\n\n\t\tif(this.config.columns){\n\t\t\tthis.defWatcherBlock = true;\n\n\t\t\tdef = column.getDefinition();\n\n\t\t\tkeys = this.config.columns === true ? Object.keys(def) : this.config.columns;\n\n\t\t\tkeys.forEach((key)=>{\n\t\t\t\tvar props = Object.getOwnPropertyDescriptor(def, key);\n\t\t\t\tvar value = def[key];\n\n\t\t\t\tif(props){\n\t\t\t\t\tObject.defineProperty(def, key, {\n\t\t\t\t\t\tset: (newValue) => {\n\t\t\t\t\t\t\tvalue = newValue;\n\n\t\t\t\t\t\t\tif(!this.defWatcherBlock){\n\t\t\t\t\t\t\t\tthis.save(\"columns\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif(props.set){\n\t\t\t\t\t\t\t\tprops.set(newValue);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tget:() => {\n\t\t\t\t\t\t\tif(props.get){\n\t\t\t\t\t\t\t\tprops.get();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.defWatcherBlock = false;\n\t\t}\n\t}\n\n\t//load saved definitions\n\tload(type, current){\n\t\tvar data = this.retrieveData(type);\n\n\t\tif(current){\n\t\t\tdata = data ? this.mergeDefinition(current, data) : current;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\t//retrieve data from memory\n\tretrieveData(type){\n\t\treturn this.readFunc ? this.readFunc(this.id, type) : false;\n\t}\n\n\t//merge old and new column definitions\n\tmergeDefinition(oldCols, newCols, mergeAllNew){\n\t\tvar output = [];\n\n\t\tnewCols = newCols || [];\n\n\t\tnewCols.forEach((column, to) => {\n\t\t\tvar from = this._findColumn(oldCols, column),\n\t\t\tkeys;\n\n\t\t\tif(from){\n\t\t\t\tif(mergeAllNew){\n\t\t\t\t\tkeys = Object.keys(column);\n\t\t\t\t}else if(this.config.columns === true || this.config.columns == undefined){\n\t\t\t\t\tkeys = Object.keys(from);\n\t\t\t\t\tkeys.push(\"width\");\n\t\t\t\t}else {\n\t\t\t\t\tkeys = this.config.columns;\n\t\t\t\t}\n\n\t\t\t\tkeys.forEach((key)=>{\n\t\t\t\t\tif(key !== \"columns\" && typeof column[key] !== \"undefined\"){\n\t\t\t\t\t\tfrom[key] = column[key];\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif(from.columns){\n\t\t\t\t\tfrom.columns = this.mergeDefinition(from.columns, column.columns);\n\t\t\t\t}\n\n\t\t\t\toutput.push(from);\n\t\t\t}\n\t\t});\n\n\t\toldCols.forEach((column, i) => {\n\t\t\tvar from = this._findColumn(newCols, column);\n\n\t\t\tif (!from) {\n\t\t\t\tif(output.length>i){\n\t\t\t\t\toutput.splice(i, 0, column);\n\t\t\t\t}else {\n\t\t\t\t\toutput.push(column);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn output;\n\t}\n\n\t//find matching columns\n\t_findColumn(columns, subject){\n\t\tvar type = subject.columns ? \"group\" : (subject.field ? \"field\" : \"object\");\n\n\t\treturn columns.find(function(col){\n\t\t\tswitch(type){\n\t\t\t\tcase \"group\":\n\t\t\t\t\treturn col.title === subject.title && col.columns.length === subject.columns.length;\n\n\t\t\t\tcase \"field\":\n\t\t\t\t\treturn col.field === subject.field;\n\n\t\t\t\tcase \"object\":\n\t\t\t\t\treturn col === subject;\n\t\t\t}\n\t\t});\n\t}\n\n\t//save data\n\tsave(type){\n\t\tvar data = {};\n\n\t\tswitch(type){\n\t\t\tcase \"columns\":\n\t\t\t\tdata = this.parseColumns(this.table.columnManager.getColumns());\n\t\t\t\tbreak;\n\n\t\t\tcase \"filter\":\n\t\t\t\tdata = this.table.modules.filter.getFilters();\n\t\t\t\tbreak;\n\n\t\t\tcase \"headerFilter\":\n\t\t\t\tdata = this.table.modules.filter.getHeaderFilters();\n\t\t\t\tbreak;\n\n\t\t\tcase \"sort\":\n\t\t\t\tdata = this.validateSorters(this.table.modules.sort.getSort());\n\t\t\t\tbreak;\n\n\t\t\tcase \"group\":\n\t\t\t\tdata = this.getGroupConfig();\n\t\t\t\tbreak;\n\n\t\t\tcase \"page\":\n\t\t\t\tdata = this.getPageConfig();\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif(this.writeFunc){\n\t\t\tthis.writeFunc(this.id, type, data);\n\t\t}\n\n\t}\n\n\t//ensure sorters contain no function data\n\tvalidateSorters(data){\n\t\tdata.forEach(function(item){\n\t\t\titem.column = item.field;\n\t\t\tdelete item.field;\n\t\t});\n\n\t\treturn data;\n\t}\n\n\tgetGroupConfig(){\n\t\tvar data = {};\n\n\t\tif(this.config.group){\n\t\t\tif(this.config.group === true || this.config.group.groupBy){\n\t\t\t\tdata.groupBy = this.table.options.groupBy;\n\t\t\t}\n\n\t\t\tif(this.config.group === true || this.config.group.groupStartOpen){\n\t\t\t\tdata.groupStartOpen = this.table.options.groupStartOpen;\n\t\t\t}\n\n\t\t\tif(this.config.group === true || this.config.group.groupHeader){\n\t\t\t\tdata.groupHeader = this.table.options.groupHeader;\n\t\t\t}\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tgetPageConfig(){\n\t\tvar data = {};\n\n\t\tif(this.config.page){\n\t\t\tif(this.config.page === true || this.config.page.size){\n\t\t\t\tdata.paginationSize = this.table.modules.page.getPageSize();\n\t\t\t}\n\n\t\t\tif(this.config.page === true || this.config.page.page){\n\t\t\t\tdata.paginationInitialPage = this.table.modules.page.getPage();\n\t\t\t}\n\t\t}\n\n\t\treturn data;\n\t}\n\n\n\t//parse columns for data to store\n\tparseColumns(columns){\n\t\tvar definitions = [],\n\t\texcludedKeys = [\"headerContextMenu\", \"headerMenu\", \"contextMenu\", \"clickMenu\"];\n\n\t\tcolumns.forEach((column) => {\n\t\t\tvar defStore = {},\n\t\t\tcolDef = column.getDefinition(),\n\t\t\tkeys;\n\n\t\t\tif(column.isGroup){\n\t\t\t\tdefStore.title = colDef.title;\n\t\t\t\tdefStore.columns = this.parseColumns(column.getColumns());\n\t\t\t}else {\n\t\t\t\tdefStore.field = column.getField();\n\n\t\t\t\tif(this.config.columns === true || this.config.columns == undefined){\n\t\t\t\t\tkeys = Object.keys(colDef);\n\t\t\t\t\tkeys.push(\"width\");\n\t\t\t\t\tkeys.push(\"visible\");\n\t\t\t\t}else {\n\t\t\t\t\tkeys = this.config.columns;\n\t\t\t\t}\n\n\t\t\t\tkeys.forEach((key)=>{\n\t\t\t\t\tswitch(key){\n\t\t\t\t\t\tcase \"width\":\n\t\t\t\t\t\t\tdefStore.width = column.getWidth();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"visible\":\n\t\t\t\t\t\t\tdefStore.visible = column.visible;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tif(typeof colDef[key] !== \"function\" && excludedKeys.indexOf(key) === -1){\n\t\t\t\t\t\t\t\tdefStore[key] = colDef[key];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tdefinitions.push(defStore);\n\t\t});\n\n\t\treturn definitions;\n\t}\n}\n\nclass Popup extends Module{\n\t\n\tstatic moduleName = \"popup\";\n\t\n\tconstructor(table){\n\t\tsuper(table);\n\t\t\n\t\tthis.columnSubscribers = {};\n\t\t\n\t\tthis.registerTableOption(\"rowContextPopup\", false);\n\t\tthis.registerTableOption(\"rowClickPopup\", false);\n\t\tthis.registerTableOption(\"rowDblClickPopup\", false);\n\t\tthis.registerTableOption(\"groupContextPopup\", false);\n\t\tthis.registerTableOption(\"groupClickPopup\", false);\n\t\tthis.registerTableOption(\"groupDblClickPopup\", false);\n\t\t\n\t\tthis.registerColumnOption(\"headerContextPopup\");\n\t\tthis.registerColumnOption(\"headerClickPopup\");\n\t\tthis.registerColumnOption(\"headerDblClickPopup\");\n\t\tthis.registerColumnOption(\"headerPopup\");\n\t\tthis.registerColumnOption(\"headerPopupIcon\");\n\t\tthis.registerColumnOption(\"contextPopup\");\n\t\tthis.registerColumnOption(\"clickPopup\");\n\t\tthis.registerColumnOption(\"dblClickPopup\");\n\n\t\tthis.registerComponentFunction(\"cell\", \"popup\", this._componentPopupCall.bind(this));\n\t\tthis.registerComponentFunction(\"column\", \"popup\", this._componentPopupCall.bind(this));\n\t\tthis.registerComponentFunction(\"row\", \"popup\", this._componentPopupCall.bind(this));\n\t\tthis.registerComponentFunction(\"group\", \"popup\", this._componentPopupCall.bind(this));\n\t\t\n\t}\n\t\n\tinitialize(){\n\t\tthis.initializeRowWatchers();\n\t\tthis.initializeGroupWatchers();\n\t\t\n\t\tthis.subscribe(\"column-init\", this.initializeColumn.bind(this));\n\t}\n\n\t_componentPopupCall(component, contents, position){\n\t\tthis.loadPopupEvent(contents, null, component, position);\n\t}\n\t\n\tinitializeRowWatchers(){\n\t\tif(this.table.options.rowContextPopup){\n\t\t\tthis.subscribe(\"row-contextmenu\", this.loadPopupEvent.bind(this, this.table.options.rowContextPopup));\n\t\t\tthis.table.on(\"rowTapHold\", this.loadPopupEvent.bind(this, this.table.options.rowContextPopup));\n\t\t}\n\t\t\n\t\tif(this.table.options.rowClickPopup){\n\t\t\tthis.subscribe(\"row-click\", this.loadPopupEvent.bind(this, this.table.options.rowClickPopup));\n\t\t}\n\n\t\tif(this.table.options.rowDblClickPopup){\n\t\t\tthis.subscribe(\"row-dblclick\", this.loadPopupEvent.bind(this, this.table.options.rowDblClickPopup));\n\t\t}\n\t}\n\t\n\tinitializeGroupWatchers(){\n\t\tif(this.table.options.groupContextPopup){\n\t\t\tthis.subscribe(\"group-contextmenu\", this.loadPopupEvent.bind(this, this.table.options.groupContextPopup));\n\t\t\tthis.table.on(\"groupTapHold\", this.loadPopupEvent.bind(this, this.table.options.groupContextPopup));\n\t\t}\n\t\t\n\t\tif(this.table.options.groupClickPopup){\n\t\t\tthis.subscribe(\"group-click\", this.loadPopupEvent.bind(this, this.table.options.groupClickPopup));\n\t\t}\n\n\t\tif(this.table.options.groupDblClickPopup){\n\t\t\tthis.subscribe(\"group-dblclick\", this.loadPopupEvent.bind(this, this.table.options.groupDblClickPopup));\n\t\t}\n\t}\n\n\tinitializeColumn(column){\n\t\tvar def = column.definition;\n\t\t\n\t\t//handle column events\n\t\tif(def.headerContextPopup && !this.columnSubscribers.headerContextPopup){\n\t\t\tthis.columnSubscribers.headerContextPopup = this.loadPopupTableColumnEvent.bind(this, \"headerContextPopup\");\n\t\t\tthis.subscribe(\"column-contextmenu\", this.columnSubscribers.headerContextPopup);\n\t\t\tthis.table.on(\"headerTapHold\", this.loadPopupTableColumnEvent.bind(this, \"headerContextPopup\"));\n\t\t}\n\t\t\n\t\tif(def.headerClickPopup && !this.columnSubscribers.headerClickPopup){\n\t\t\tthis.columnSubscribers.headerClickPopup = this.loadPopupTableColumnEvent.bind(this, \"headerClickPopup\");\n\t\t\tthis.subscribe(\"column-click\", this.columnSubscribers.headerClickPopup);\n\t\t\n\t\t\n\t\t}if(def.headerDblClickPopup && !this.columnSubscribers.headerDblClickPopup){\n\t\t\tthis.columnSubscribers.headerDblClickPopup = this.loadPopupTableColumnEvent.bind(this, \"headerDblClickPopup\");\n\t\t\tthis.subscribe(\"column-dblclick\", this.columnSubscribers.headerDblClickPopup);\n\t\t}\n\t\t\n\t\tif(def.headerPopup){\n\t\t\tthis.initializeColumnHeaderPopup(column);\n\t\t}\n\t\t\n\t\t//handle cell events\n\t\tif(def.contextPopup && !this.columnSubscribers.contextPopup){\n\t\t\tthis.columnSubscribers.contextPopup = this.loadPopupTableCellEvent.bind(this, \"contextPopup\");\n\t\t\tthis.subscribe(\"cell-contextmenu\", this.columnSubscribers.contextPopup);\n\t\t\tthis.table.on(\"cellTapHold\", this.loadPopupTableCellEvent.bind(this, \"contextPopup\"));\n\t\t}\n\t\t\n\t\tif(def.clickPopup && !this.columnSubscribers.clickPopup){\n\t\t\tthis.columnSubscribers.clickPopup = this.loadPopupTableCellEvent.bind(this, \"clickPopup\");\n\t\t\tthis.subscribe(\"cell-click\", this.columnSubscribers.clickPopup);\n\t\t}\n\n\t\tif(def.dblClickPopup && !this.columnSubscribers.dblClickPopup){\n\t\t\tthis.columnSubscribers.dblClickPopup = this.loadPopupTableCellEvent.bind(this, \"dblClickPopup\");\n\t\t\tthis.subscribe(\"cell-click\", this.columnSubscribers.dblClickPopup);\n\t\t}\n\t}\n\t\n\tinitializeColumnHeaderPopup(column){\n\t\tvar icon = column.definition.headerPopupIcon,\n\t\theaderPopupEl;\n\t\t\n\t\theaderPopupEl = document.createElement(\"span\");\n\t\theaderPopupEl.classList.add(\"tabulator-header-popup-button\");\n\n\t\tif(icon){\n\t\t\tif(typeof icon === \"function\"){\n\t\t\t\ticon = icon(column.getComponent());\n\t\t\t}\n\n\t\t\tif(icon instanceof HTMLElement){\n\t\t\t\theaderPopupEl.appendChild(icon);\n\t\t\t}else {\n\t\t\t\theaderPopupEl.innerHTML = icon;\n\t\t\t}\n\t\t}else {\n\t\t\theaderPopupEl.innerHTML = \"&vellip;\";\n\t\t}\n\t\t\n\t\theaderPopupEl.addEventListener(\"click\", (e) => {\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\t\n\t\t\tthis.loadPopupEvent(column.definition.headerPopup, e, column);\n\t\t});\n\t\t\n\t\tcolumn.titleElement.insertBefore(headerPopupEl, column.titleElement.firstChild);\n\t}\n\t\n\tloadPopupTableCellEvent(option, e, cell){\n\t\tif(cell._cell){\n\t\t\tcell = cell._cell;\n\t\t}\n\t\t\n\t\tif(cell.column.definition[option]){\n\t\t\tthis.loadPopupEvent(cell.column.definition[option], e, cell);\n\t\t}\n\t}\n\t\n\tloadPopupTableColumnEvent(option, e, column){\n\t\tif(column._column){\n\t\t\tcolumn = column._column;\n\t\t}\n\t\t\n\t\tif(column.definition[option]){\n\t\t\tthis.loadPopupEvent(column.definition[option], e, column);\n\t\t}\n\t}\n\t\n\tloadPopupEvent(contents, e, component, position){\n\t\tvar renderedCallback;\n\n\t\tfunction onRendered(callback){\n\t\t\trenderedCallback = callback;\n\t\t}\n\t\t\n\t\tif(component._group){\n\t\t\tcomponent = component._group;\n\t\t}else if(component._row){\n\t\t\tcomponent = component._row;\n\t\t}\n\t\t\n\t\tcontents = typeof contents == \"function\" ? contents.call(this.table, e, component.getComponent(), onRendered) : contents;\n\t\t\n\t\tthis.loadPopup(e, component, contents, renderedCallback, position);\n\t}\n\t\n\tloadPopup(e, component, contents, renderedCallback, position){\n\t\tvar touch = !(e instanceof MouseEvent),\n\t\tcontentsEl, popup;\n\t\t\n\t\tif(contents instanceof HTMLElement){\n\t\t\tcontentsEl = contents;\n\t\t}else {\n\t\t\tcontentsEl = document.createElement(\"div\");\n\t\t\tcontentsEl.innerHTML = contents;\n\t\t}\n\t\t\n\t\tcontentsEl.classList.add(\"tabulator-popup\");\n\n\t\tcontentsEl.addEventListener(\"click\", (e) =>{\n\t\t\te.stopPropagation();\n\t\t});\n\n\t\tif(!touch){\n\t\t\te.preventDefault();\n\t\t}\n\t\t\n\t\tpopup = this.popup(contentsEl);\n\n\t\tif(typeof renderedCallback === \"function\"){\n\t\t\tpopup.renderCallback(renderedCallback);\n\t\t}\n\n\t\tif(e){\n\t\t\tpopup.show(e);\n\t\t}else {\n\t\t\tpopup.show(component.getElement(), position || \"center\");\n\t\t}\n\n\t\t\n\t\tpopup.hideOnBlur(() => {\n\t\t\tthis.dispatchExternal(\"popupClosed\", component.getComponent());\n\t\t});\n\n\t\tthis.dispatchExternal(\"popupOpened\", component.getComponent());\n\t}\n}\n\nclass Print extends Module{\n\n\tstatic moduleName = \"print\";\n\n\tconstructor(table){\n\t\tsuper(table);\n\n\t\tthis.element = false;\n\t\tthis.manualBlock = false;\n\t\tthis.beforeprintEventHandler = null;\n\t\tthis.afterprintEventHandler = null;\n\n\t\tthis.registerTableOption(\"printAsHtml\", false); //enable print as html\n\t\tthis.registerTableOption(\"printFormatter\", false); //printing page formatter\n\t\tthis.registerTableOption(\"printHeader\", false); //page header contents\n\t\tthis.registerTableOption(\"printFooter\", false); //page footer contents\n\t\tthis.registerTableOption(\"printStyled\", true); //enable print as html styling\n\t\tthis.registerTableOption(\"printRowRange\", \"visible\"); //restrict print to visible rows only\n\t\tthis.registerTableOption(\"printConfig\", {}); //print config options\n\n\t\tthis.registerColumnOption(\"print\");\n\t\tthis.registerColumnOption(\"titlePrint\");\n\t}\n\n\tinitialize(){\n\t\tif(this.table.options.printAsHtml){\n\t\t\tthis.beforeprintEventHandler = this.replaceTable.bind(this);\n\t\t\tthis.afterprintEventHandler = this.cleanup.bind(this);\n\n\t\t\twindow.addEventListener(\"beforeprint\", this.beforeprintEventHandler );\n\t\t\twindow.addEventListener(\"afterprint\", this.afterprintEventHandler);\n\t\t\tthis.subscribe(\"table-destroy\", this.destroy.bind(this));\n\t\t}\n\n\t\tthis.registerTableFunction(\"print\", this.printFullscreen.bind(this));\n\t}\n\n\tdestroy(){\n\t\tif(this.table.options.printAsHtml){\n\t\t\twindow.removeEventListener( \"beforeprint\", this.beforeprintEventHandler );\n\t\t\twindow.removeEventListener( \"afterprint\", this.afterprintEventHandler );\n\t\t}\n\t}\n\n\t///////////////////////////////////\n\t///////// Table Functions /////////\n\t///////////////////////////////////\n\n\t///////////////////////////////////\n\t///////// Internal Logic //////////\n\t///////////////////////////////////\n\n\treplaceTable(){\n\t\tif(!this.manualBlock){\n\t\t\tthis.element = document.createElement(\"div\");\n\t\t\tthis.element.classList.add(\"tabulator-print-table\");\n\n\t\t\tthis.element.appendChild(this.table.modules.export.generateTable(this.table.options.printConfig, this.table.options.printStyled, this.table.options.printRowRange, \"print\"));\n\n\t\t\tthis.table.element.style.display = \"none\";\n\n\t\t\tthis.table.element.parentNode.insertBefore(this.element, this.table.element);\n\t\t}\n\t}\n\n\tcleanup(){\n\t\tdocument.body.classList.remove(\"tabulator-print-fullscreen-hide\");\n\n\t\tif(this.element && this.element.parentNode){\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t\tthis.table.element.style.display = \"\";\n\t\t}\n\t}\n\n\tprintFullscreen(visible, style, config){\n\t\tvar scrollX = window.scrollX,\n\t\tscrollY = window.scrollY,\n\t\theaderEl = document.createElement(\"div\"),\n\t\tfooterEl = document.createElement(\"div\"),\n\t\ttableEl = this.table.modules.export.generateTable(typeof config != \"undefined\" ? config : this.table.options.printConfig, typeof style != \"undefined\" ? style : this.table.options.printStyled, visible || this.table.options.printRowRange, \"print\"),\n\t\theaderContent, footerContent;\n\n\t\tthis.manualBlock = true;\n\n\t\tthis.element = document.createElement(\"div\");\n\t\tthis.element.classList.add(\"tabulator-print-fullscreen\");\n\n\t\tif(this.table.options.printHeader){\n\t\t\theaderEl.classList.add(\"tabulator-print-header\");\n\n\t\t\theaderContent = typeof this.table.options.printHeader == \"function\" ? this.table.options.printHeader.call(this.table) : this.table.options.printHeader;\n\n\t\t\tif(typeof headerContent == \"string\"){\n\t\t\t\theaderEl.innerHTML = headerContent;\n\t\t\t}else {\n\t\t\t\theaderEl.appendChild(headerContent);\n\t\t\t}\n\n\t\t\tthis.element.appendChild(headerEl);\n\t\t}\n\n\t\tthis.element.appendChild(tableEl);\n\n\t\tif(this.table.options.printFooter){\n\t\t\tfooterEl.classList.add(\"tabulator-print-footer\");\n\n\t\t\tfooterContent = typeof this.table.options.printFooter == \"function\" ? this.table.options.printFooter.call(this.table) : this.table.options.printFooter;\n\n\n\t\t\tif(typeof footerContent == \"string\"){\n\t\t\t\tfooterEl.innerHTML = footerContent;\n\t\t\t}else {\n\t\t\t\tfooterEl.appendChild(footerContent);\n\t\t\t}\n\n\t\t\tthis.element.appendChild(footerEl);\n\t\t}\n\n\t\tdocument.body.classList.add(\"tabulator-print-fullscreen-hide\");\n\t\tdocument.body.appendChild(this.element);\n\n\t\tif(this.table.options.printFormatter){\n\t\t\tthis.table.options.printFormatter(this.element, tableEl);\n\t\t}\n\n\t\twindow.print();\n\n\t\tthis.cleanup();\n\n\t\twindow.scrollTo(scrollX, scrollY);\n\n\t\tthis.manualBlock = false;\n\t}\n}\n\nclass ReactiveData extends Module{\n\n\tstatic moduleName = \"reactiveData\";\n\t\n\tconstructor(table){\n\t\tsuper(table);\n\t\t\n\t\tthis.data = false;\n\t\tthis.blocked = false; //block reactivity while performing update\n\t\tthis.origFuncs = {}; // hold original data array functions to allow replacement after data is done with\n\t\tthis.currentVersion = 0;\n\t\t\n\t\tthis.registerTableOption(\"reactiveData\", false); //enable data reactivity\n\t}\n\t\n\tinitialize(){\n\t\tif(this.table.options.reactiveData){\n\t\t\tthis.subscribe(\"cell-value-save-before\", this.block.bind(this, \"cellsave\"));\n\t\t\tthis.subscribe(\"cell-value-save-after\", this.unblock.bind(this, \"cellsave\"));\n\t\t\tthis.subscribe(\"row-data-save-before\", this.block.bind(this, \"rowsave\"));\n\t\t\tthis.subscribe(\"row-data-save-after\", this.unblock.bind(this, \"rowsave\"));\n\t\t\tthis.subscribe(\"row-data-init-after\", this.watchRow.bind(this));\n\t\t\tthis.subscribe(\"data-processing\", this.watchData.bind(this));\n\t\t\tthis.subscribe(\"table-destroy\", this.unwatchData.bind(this));\n\t\t}\n\t}\n\t\n\twatchData(data){\n\t\tvar self = this,\n\t\tversion;\n\t\t\n\t\tthis.currentVersion ++;\n\t\t\n\t\tversion = this.currentVersion;\n\t\t\n\t\tthis.unwatchData();\n\t\t\n\t\tthis.data = data;\n\t\t\n\t\t//override array push function\n\t\tthis.origFuncs.push = data.push;\n\t\t\n\t\tObject.defineProperty(this.data, \"push\", {\n\t\t\tenumerable: false,\n\t\t\tconfigurable: true,\n\t\t\tvalue: function(){\n\t\t\t\tvar args = Array.from(arguments),\n\t\t\t\tresult;\n\n\t\t\t\tif(!self.blocked && version === self.currentVersion){\t\n\t\t\t\t\tself.block(\"data-push\");\n\n\t\t\t\t\targs.forEach((arg) => {\n\t\t\t\t\t\tself.table.rowManager.addRowActual(arg, false);\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tresult = self.origFuncs.push.apply(data, arguments);\n\t\t\t\t\t\n\t\t\t\t\tself.unblock(\"data-push\");\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn result;\n\t\t\t}\n\t\t});\n\t\t\n\t\t//override array unshift function\n\t\tthis.origFuncs.unshift = data.unshift;\n\t\t\n\t\tObject.defineProperty(this.data, \"unshift\", {\n\t\t\tenumerable: false,\n\t\t\tconfigurable: true,\n\t\t\tvalue: function(){\n\t\t\t\tvar args = Array.from(arguments),\n\t\t\t\tresult;\n\t\t\t\t\n\t\t\t\tif(!self.blocked && version === self.currentVersion){\n\t\t\t\t\tself.block(\"data-unshift\");\n\t\t\t\t\t\n\t\t\t\t\targs.forEach((arg) => {\n\t\t\t\t\t\tself.table.rowManager.addRowActual(arg, true);\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tresult = self.origFuncs.unshift.apply(data, arguments);\n\t\t\t\t\t\n\t\t\t\t\tself.unblock(\"data-unshift\");\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn result;\n\t\t\t}\n\t\t});\n\t\t\n\t\t\n\t\t//override array shift function\n\t\tthis.origFuncs.shift = data.shift;\n\t\t\n\t\tObject.defineProperty(this.data, \"shift\", {\n\t\t\tenumerable: false,\n\t\t\tconfigurable: true,\n\t\t\tvalue: function(){\n\t\t\t\tvar row, result;\n\t\t\t\t\n\t\t\t\tif(!self.blocked && version === self.currentVersion){\n\t\t\t\t\tself.block(\"data-shift\");\n\t\t\t\t\t\n\t\t\t\t\tif(self.data.length){\n\t\t\t\t\t\trow = self.table.rowManager.getRowFromDataObject(self.data[0]);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(row){\n\t\t\t\t\t\t\trow.deleteActual();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tresult = self.origFuncs.shift.call(data);\n\n\t\t\t\t\tself.unblock(\"data-shift\");\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn result;\n\t\t\t}\n\t\t});\n\t\t\n\t\t//override array pop function\n\t\tthis.origFuncs.pop = data.pop;\n\t\t\n\t\tObject.defineProperty(this.data, \"pop\", {\n\t\t\tenumerable: false,\n\t\t\tconfigurable: true,\n\t\t\tvalue: function(){\n\t\t\t\tvar row, result;\n\t\t\t\n\t\t\t\tif(!self.blocked && version === self.currentVersion){\n\t\t\t\t\tself.block(\"data-pop\");\n\t\t\t\t\t\n\t\t\t\t\tif(self.data.length){\n\t\t\t\t\t\trow = self.table.rowManager.getRowFromDataObject(self.data[self.data.length - 1]);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(row){\n\t\t\t\t\t\t\trow.deleteActual();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tresult = self.origFuncs.pop.call(data);\n\t\t\t\t\t\n\t\t\t\t\tself.unblock(\"data-pop\");\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t}\n\t\t});\n\t\t\n\t\t\n\t\t//override array splice function\n\t\tthis.origFuncs.splice = data.splice;\n\t\t\n\t\tObject.defineProperty(this.data, \"splice\", {\n\t\t\tenumerable: false,\n\t\t\tconfigurable: true,\n\t\t\tvalue: function(){\n\t\t\t\tvar args = Array.from(arguments),\n\t\t\t\tstart = args[0] < 0 ? data.length + args[0] : args[0],\n\t\t\t\tend = args[1],\n\t\t\t\tnewRows = args[2] ? args.slice(2) : false,\n\t\t\t\tstartRow, result;\n\t\t\t\t\n\t\t\t\tif(!self.blocked && version === self.currentVersion){\n\t\t\t\t\tself.block(\"data-splice\");\n\t\t\t\t\t//add new rows\n\t\t\t\t\tif(newRows){\n\t\t\t\t\t\tstartRow = data[start] ? self.table.rowManager.getRowFromDataObject(data[start]) : false;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(startRow){\n\t\t\t\t\t\t\tnewRows.forEach((rowData) => {\n\t\t\t\t\t\t\t\tself.table.rowManager.addRowActual(rowData, true, startRow, true);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\tnewRows = newRows.slice().reverse();\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tnewRows.forEach((rowData) => {\n\t\t\t\t\t\t\t\tself.table.rowManager.addRowActual(rowData, true, false, true);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t//delete removed rows\n\t\t\t\t\tif(end !== 0){\n\t\t\t\t\t\tvar oldRows = data.slice(start, typeof args[1] === \"undefined\" ? args[1] : start + end);\n\t\t\t\t\t\t\n\t\t\t\t\t\toldRows.forEach((rowData, i) => {\n\t\t\t\t\t\t\tvar row = self.table.rowManager.getRowFromDataObject(rowData);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(row){\n\t\t\t\t\t\t\t\trow.deleteActual(i !== oldRows.length - 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif(newRows || end !== 0){\n\t\t\t\t\t\tself.table.rowManager.reRenderInPosition();\n\t\t\t\t\t}\n\n\t\t\t\t\tresult = self.origFuncs.splice.apply(data, arguments);\n\t\t\t\t\t\n\t\t\t\t\tself.unblock(\"data-splice\");\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn result ;\n\t\t\t}\n\t\t});\n\t}\n\t\n\tunwatchData(){\n\t\tif(this.data !== false){\n\t\t\tfor(var key in this.origFuncs){\n\t\t\t\tObject.defineProperty(this.data, key, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable:true,\n\t\t\t\t\twritable:true,\n\t\t\t\t\tvalue: this.origFuncs.key,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\t\n\twatchRow(row){\n\t\tvar data = row.getData();\n\t\t\n\t\tfor(var key in data){\n\t\t\tthis.watchKey(row, data, key);\n\t\t}\n\t\t\n\t\tif(this.table.options.dataTree){\n\t\t\tthis.watchTreeChildren(row);\n\t\t}\n\t}\n\t\n\twatchTreeChildren (row){\n\t\tvar self = this,\n\t\tchildField = row.getData()[this.table.options.dataTreeChildField],\n\t\torigFuncs = {};\n\t\t\n\t\tif(childField){\n\t\t\t\n\t\t\torigFuncs.push = childField.push;\n\t\t\t\n\t\t\tObject.defineProperty(childField, \"push\", {\n\t\t\t\tenumerable: false,\n\t\t\t\tconfigurable: true,\n\t\t\t\tvalue: () => {\n\t\t\t\t\tif(!self.blocked){\n\t\t\t\t\t\tself.block(\"tree-push\");\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar result = origFuncs.push.apply(childField, arguments);\n\t\t\t\t\t\tthis.rebuildTree(row);\n\t\t\t\t\t\t\n\t\t\t\t\t\tself.unblock(\"tree-push\");\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\torigFuncs.unshift = childField.unshift;\n\t\t\t\n\t\t\tObject.defineProperty(childField, \"unshift\", {\n\t\t\t\tenumerable: false,\n\t\t\t\tconfigurable: true,\n\t\t\t\tvalue: () => {\n\t\t\t\t\tif(!self.blocked){\n\t\t\t\t\t\tself.block(\"tree-unshift\");\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar result = origFuncs.unshift.apply(childField, arguments);\n\t\t\t\t\t\tthis.rebuildTree(row);\n\t\t\t\t\t\t\n\t\t\t\t\t\tself.unblock(\"tree-unshift\");\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\torigFuncs.shift = childField.shift;\n\t\t\t\n\t\t\tObject.defineProperty(childField, \"shift\", {\n\t\t\t\tenumerable: false,\n\t\t\t\tconfigurable: true,\n\t\t\t\tvalue: () => {\n\t\t\t\t\tif(!self.blocked){\n\t\t\t\t\t\tself.block(\"tree-shift\");\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar result = origFuncs.shift.call(childField);\n\t\t\t\t\t\tthis.rebuildTree(row);\n\t\t\t\t\t\t\n\t\t\t\t\t\tself.unblock(\"tree-shift\");\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\torigFuncs.pop = childField.pop;\n\t\t\t\n\t\t\tObject.defineProperty(childField, \"pop\", {\n\t\t\t\tenumerable: false,\n\t\t\t\tconfigurable: true,\n\t\t\t\tvalue: () => {\n\t\t\t\t\tif(!self.blocked){\n\t\t\t\t\t\tself.block(\"tree-pop\");\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar result = origFuncs.pop.call(childField);\n\t\t\t\t\t\tthis.rebuildTree(row);\n\t\t\t\t\t\t\n\t\t\t\t\t\tself.unblock(\"tree-pop\");\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\torigFuncs.splice = childField.splice;\n\t\t\t\n\t\t\tObject.defineProperty(childField, \"splice\", {\n\t\t\t\tenumerable: false,\n\t\t\t\tconfigurable: true,\n\t\t\t\tvalue: () => {\n\t\t\t\t\tif(!self.blocked){\n\t\t\t\t\t\tself.block(\"tree-splice\");\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar result = origFuncs.splice.apply(childField, arguments);\n\t\t\t\t\t\tthis.rebuildTree(row);\n\t\t\t\t\t\t\n\t\t\t\t\t\tself.unblock(\"tree-splice\");\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\t\n\trebuildTree(row){\n\t\tthis.table.modules.dataTree.initializeRow(row);\n\t\tthis.table.modules.dataTree.layoutRow(row);\n\t\tthis.table.rowManager.refreshActiveData(\"tree\", false, true);\n\t}\n\t\n\twatchKey(row, data, key){\n\t\tvar self = this,\n\t\tprops = Object.getOwnPropertyDescriptor(data, key),\n\t\tvalue = data[key],\n\t\tversion = this.currentVersion;\n\t\t\n\t\tObject.defineProperty(data, key, {\n\t\t\tset: (newValue) => {\n\t\t\t\tvalue = newValue;\n\t\t\t\tif(!self.blocked && version === self.currentVersion){\n\t\t\t\t\tself.block(\"key\");\n\t\t\t\t\t\n\t\t\t\t\tvar update = {};\n\t\t\t\t\tupdate[key] = newValue;\n\t\t\t\t\trow.updateData(update);\n\t\t\t\t\t\n\t\t\t\t\tself.unblock(\"key\");\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(props.set){\n\t\t\t\t\tprops.set(newValue);\n\t\t\t\t}\n\t\t\t},\n\t\t\tget:() => {\n\t\t\t\t\n\t\t\t\tif(props.get){\n\t\t\t\t\tprops.get();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn value;\n\t\t\t}\n\t\t});\n\t}\n\t\n\tunwatchRow(row){\n\t\tvar data = row.getData();\n\t\t\n\t\tfor(var key in data){\n\t\t\tObject.defineProperty(data, key, {\n\t\t\t\tvalue:data[key],\n\t\t\t});\n\t\t}\n\t}\n\t\n\tblock(key){\n\t\tif(!this.blocked){\n\t\t\tthis.blocked = key;\n\t\t}\n\t}\n\t\n\tunblock(key){\n\t\tif(this.blocked === key){\n\t\t\tthis.blocked = false;\n\t\t}\n\t}\n}\n\nclass ResizeColumns extends Module{\n\n\tstatic moduleName = \"resizeColumns\";\n\n\tconstructor(table){\n\t\tsuper(table);\n\t\t\n\t\tthis.startColumn = false;\n\t\tthis.startX = false;\n\t\tthis.startWidth = false;\n\t\tthis.latestX = false;\n\t\tthis.handle = null;\n\t\tthis.initialNextColumn = null;\n\t\tthis.nextColumn = null;\n\t\t\n\t\tthis.initialized = false;\n\t\tthis.registerColumnOption(\"resizable\", true);\n\t\tthis.registerTableOption(\"resizableColumnFit\", false);\n\t\tthis.registerTableOption(\"resizableColumnGuide\", false);\n\t}\n\t\n\tinitialize(){\n\t\tthis.subscribe(\"column-rendered\", this.layoutColumnHeader.bind(this));\n\t}\n\t\n\tinitializeEventWatchers(){\n\t\tif(!this.initialized){\n\t\t\t\n\t\t\tthis.subscribe(\"cell-rendered\", this.layoutCellHandles.bind(this));\n\t\t\tthis.subscribe(\"cell-delete\", this.deInitializeComponent.bind(this));\n\t\t\t\n\t\t\tthis.subscribe(\"cell-height\", this.resizeHandle.bind(this));\n\t\t\tthis.subscribe(\"column-moved\", this.columnLayoutUpdated.bind(this));\n\t\t\t\n\t\t\tthis.subscribe(\"column-hide\", this.deInitializeColumn.bind(this));\n\t\t\tthis.subscribe(\"column-show\", this.columnLayoutUpdated.bind(this));\n\t\t\tthis.subscribe(\"column-width\", this.columnWidthUpdated.bind(this));\n\t\t\t\n\t\t\tthis.subscribe(\"column-delete\", this.deInitializeComponent.bind(this));\n\t\t\tthis.subscribe(\"column-height\", this.resizeHandle.bind(this));\n\t\t\t\n\t\t\tthis.initialized = true;\n\t\t}\n\t}\n\t\n\t\n\tlayoutCellHandles(cell){\n\t\tif(cell.row.type === \"row\"){\n\t\t\tthis.deInitializeComponent(cell);\n\t\t\tthis.initializeColumn(\"cell\", cell, cell.column, cell.element);\n\t\t}\n\t}\n\t\n\tlayoutColumnHeader(column){\n\t\tif(column.definition.resizable){\n\t\t\tthis.initializeEventWatchers();\n\t\t\tthis.deInitializeComponent(column);\n\t\t\tthis.initializeColumn(\"header\", column, column, column.element);\n\t\t}\n\t}\n\t\n\tcolumnLayoutUpdated(column){\n\t\tvar prev = column.prevColumn();\n\t\t\n\t\tthis.reinitializeColumn(column);\n\t\t\n\t\tif(prev){\n\t\t\tthis.reinitializeColumn(prev);\n\t\t}\n\t}\n\t\n\tcolumnWidthUpdated(column){\n\t\tif(column.modules.frozen){\n\t\t\tif(this.table.modules.frozenColumns.leftColumns.includes(column)){\n\t\t\t\tthis.table.modules.frozenColumns.leftColumns.forEach((col) => {\n\t\t\t\t\tthis.reinitializeColumn(col);\n\t\t\t\t});\n\t\t\t}else if(this.table.modules.frozenColumns.rightColumns.includes(column)){\n\t\t\t\tthis.table.modules.frozenColumns.rightColumns.forEach((col) => {\n\t\t\t\t\tthis.reinitializeColumn(col);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tfrozenColumnOffset(column){\n\t\tvar offset = false;\n\n\t\tif(column.modules.frozen){\n\t\t\toffset = column.modules.frozen.marginValue; \n\n\t\t\tif(column.modules.frozen.position === \"left\"){\n\t\t\t\toffset += column.getWidth() - 3;\n\t\t\t}else {\n\t\t\t\tif(offset){\n\t\t\t\t\toffset -= 3;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn offset !== false ? offset + \"px\" : false;\n\t}\n\t\n\treinitializeColumn(column){\n\t\tvar frozenOffset = this.frozenColumnOffset(column);\n\t\t\n\t\tcolumn.cells.forEach((cell) => {\n\t\t\tif(cell.modules.resize && cell.modules.resize.handleEl){\n\t\t\t\tif(frozenOffset){\n\t\t\t\t\tcell.modules.resize.handleEl.style[column.modules.frozen.position] = frozenOffset;\n\t\t\t\t\tcell.modules.resize.handleEl.style[\"z-index\"] = 11;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tcell.element.after(cell.modules.resize.handleEl);\n\t\t\t}\n\t\t});\n\t\t\n\t\tif(column.modules.resize && column.modules.resize.handleEl){\n\t\t\tif(frozenOffset){\n\t\t\t\tcolumn.modules.resize.handleEl.style[column.modules.frozen.position] = frozenOffset;\n\t\t\t}\n\t\t\t\n\t\t\tcolumn.element.after(column.modules.resize.handleEl);\n\t\t}\n\t}\n\t\n\tinitializeColumn(type, component, column, element){\n\t\tvar self = this,\n\t\tvariableHeight = false,\n\t\tmode = column.definition.resizable,\n\t\tconfig = {},\n\t\tnearestColumn = column.getLastColumn();\n\t\t\n\t\t//set column resize mode\n\t\tif(type === \"header\"){\n\t\t\tvariableHeight = column.definition.formatter == \"textarea\" || column.definition.variableHeight;\n\t\t\tconfig = {variableHeight:variableHeight};\n\t\t}\n\t\t\n\t\tif((mode === true || mode == type) && this._checkResizability(nearestColumn)){\n\t\t\t\n\t\t\tvar handle = document.createElement('span');\n\t\t\thandle.className = \"tabulator-col-resize-handle\";\n\t\t\t\n\t\t\thandle.addEventListener(\"click\", function(e){\n\t\t\t\te.stopPropagation();\n\t\t\t});\n\t\t\t\n\t\t\tvar handleDown = function(e){\n\t\t\t\tself.startColumn = column;\n\t\t\t\tself.initialNextColumn = self.nextColumn = nearestColumn.nextColumn();\n\t\t\t\tself._mouseDown(e, nearestColumn, handle);\n\t\t\t};\n\t\t\t\n\t\t\thandle.addEventListener(\"mousedown\", handleDown);\n\t\t\thandle.addEventListener(\"touchstart\", handleDown, {passive: true});\n\t\t\t\n\t\t\t//resize column on double click\n\t\t\thandle.addEventListener(\"dblclick\", (e) => {\n\t\t\t\tvar oldWidth = nearestColumn.getWidth();\n\t\t\t\t\n\t\t\t\te.stopPropagation();\n\t\t\t\tnearestColumn.reinitializeWidth(true);\n\t\t\t\t\n\t\t\t\tif(oldWidth !== nearestColumn.getWidth()){\n\t\t\t\t\tself.dispatch(\"column-resized\", nearestColumn);\n\t\t\t\t\tself.dispatchExternal(\"columnResized\", nearestColumn.getComponent());\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tif(column.modules.frozen){\n\t\t\t\thandle.style.position = \"sticky\";\n\t\t\t\thandle.style[column.modules.frozen.position] = this.frozenColumnOffset(column);\n\t\t\t}\n\t\t\t\n\t\t\tconfig.handleEl = handle;\n\t\t\t\n\t\t\tif(element.parentNode && column.visible){\n\t\t\t\telement.after(handle);\t\t\t\n\t\t\t}\n\t\t}\n\t\t\n\t\tcomponent.modules.resize = config;\n\t}\n\t\n\tdeInitializeColumn(column){\n\t\tthis.deInitializeComponent(column);\n\t\t\n\t\tcolumn.cells.forEach((cell) => {\n\t\t\tthis.deInitializeComponent(cell);\n\t\t});\n\t}\n\t\n\tdeInitializeComponent(component){\n\t\tvar handleEl;\n\t\t\n\t\tif(component.modules.resize){\n\t\t\thandleEl = component.modules.resize.handleEl;\n\t\t\t\n\t\t\tif(handleEl && handleEl.parentElement){\n\t\t\t\thandleEl.parentElement.removeChild(handleEl);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tresizeHandle(component, height){\n\t\tif(component.modules.resize && component.modules.resize.handleEl){\n\t\t\tcomponent.modules.resize.handleEl.style.height = height;\n\t\t}\n\t}\n\t\n\tresize(e, column){\n\t\tvar x = typeof e.clientX === \"undefined\" ? e.touches[0].clientX : e.clientX,\n\t\tstartDiff = x - this.startX,\n\t\tmoveDiff = x - this.latestX,\n\t\tblockedBefore, blockedAfter;\n\n\t\tthis.latestX = x;\n\n\t\tif(this.table.rtl){\n\t\t\tstartDiff = -startDiff;\n\t\t\tmoveDiff = -moveDiff;\n\t\t}\n\n\t\tblockedBefore = column.width == column.minWidth || column.width == column.maxWidth;\n\n\t\tcolumn.setWidth(this.startWidth + startDiff);\n\n\t\tblockedAfter = column.width == column.minWidth || column.width == column.maxWidth;\n\n\t\tif(moveDiff < 0){\n\t\t\tthis.nextColumn = this.initialNextColumn;\n\t\t}\n\n\t\tif(this.table.options.resizableColumnFit && this.nextColumn && !(blockedBefore && blockedAfter)){\n\t\t\tlet colWidth = this.nextColumn.getWidth();\n\n\t\t\tif(moveDiff > 0){\n\t\t\t\tif(colWidth <= this.nextColumn.minWidth){\n\t\t\t\t\tthis.nextColumn = this.nextColumn.nextColumn();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(this.nextColumn){\n\t\t\t\tthis.nextColumn.setWidth(this.nextColumn.getWidth() - moveDiff);\n\t\t\t}\n\t\t}\n\n\t\tthis.table.columnManager.rerenderColumns(true);\n\n\t\tif(!this.table.browserSlow && column.modules.resize && column.modules.resize.variableHeight){\n\t\t\tcolumn.checkCellHeights();\n\t\t}\n\t}\n\n\tcalcGuidePosition(e, column, handle) {\n\t\tvar mouseX = typeof e.clientX === \"undefined\" ? e.touches[0].clientX : e.clientX,\n\t\thandleX = handle.getBoundingClientRect().x - this.table.element.getBoundingClientRect().x,\n\t\ttableX = this.table.element.getBoundingClientRect().x,\n\t\tcolumnX = column.element.getBoundingClientRect().left - tableX,\n\t\tmouseDiff = mouseX - this.startX,\n\t\tpos = Math.max(handleX + mouseDiff, columnX + column.minWidth);\n\n\t\tif(column.maxWidth){\n\t\t\tpos = Math.min(pos, columnX + column.maxWidth);\n\t\t}\n\n\t\treturn pos;\n\t}\n\n\t_checkResizability(column){\n\t\treturn column.definition.resizable;\n\t}\n\t\n\t_mouseDown(e, column, handle){\n\t\tvar self = this,\n\t\tguideEl;\n\n\t\tthis.dispatchExternal(\"columnResizing\", column.getComponent());\n\n\t\tif(self.table.options.resizableColumnGuide){\n\t\t\tguideEl = document.createElement(\"span\");\n\t\t\tguideEl.classList.add('tabulator-col-resize-guide');\n\t\t\tself.table.element.appendChild(guideEl);\n\t\t\tsetTimeout(() => {\n\t\t\t\tguideEl.style.left = self.calcGuidePosition(e, column, handle) + \"px\";\n\t\t\t});\n\t\t}\n\n\t\tself.table.element.classList.add(\"tabulator-block-select\");\n\n\t\tfunction mouseMove(e){\n\t\t\tif(self.table.options.resizableColumnGuide){\n\t\t\t\tguideEl.style.left = self.calcGuidePosition(e, column, handle) + \"px\";\n\t\t\t}else {\n\t\t\t\tself.resize(e, column);\n\t\t\t}\n\t\t}\n\t\t\n\t\tfunction mouseUp(e){\n\t\t\tif(self.table.options.resizableColumnGuide){\n\t\t\t\tself.resize(e, column);\n\t\t\t\tguideEl.remove();\n\t\t\t}\n\t\t\t\n\t\t\t//block editor from taking action while resizing is taking place\n\t\t\tif(self.startColumn.modules.edit){\n\t\t\t\tself.startColumn.modules.edit.blocked = false;\n\t\t\t}\n\t\t\t\n\t\t\tif(self.table.browserSlow && column.modules.resize && column.modules.resize.variableHeight){\n\t\t\t\tcolumn.checkCellHeights();\n\t\t\t}\n\t\t\t\n\t\t\tdocument.body.removeEventListener(\"mouseup\", mouseUp);\n\t\t\tdocument.body.removeEventListener(\"mousemove\", mouseMove);\n\t\t\t\n\t\t\thandle.removeEventListener(\"touchmove\", mouseMove);\n\t\t\thandle.removeEventListener(\"touchend\", mouseUp);\n\t\t\t\n\t\t\tself.table.element.classList.remove(\"tabulator-block-select\");\n\t\t\t\n\t\t\tif(self.startWidth !== column.getWidth()){\n\t\t\t\tself.table.columnManager.verticalAlignHeaders();\n\n\t\t\t\tself.dispatch(\"column-resized\", column);\n\t\t\t\tself.dispatchExternal(\"columnResized\", column.getComponent());\n\t\t\t}\n\t\t}\n\t\t\n\t\te.stopPropagation(); //prevent resize from interfering with movable columns\n\t\t\n\t\t//block editor from taking action while resizing is taking place\n\t\tif(self.startColumn.modules.edit){\n\t\t\tself.startColumn.modules.edit.blocked = true;\n\t\t}\n\t\t\n\t\tself.startX = typeof e.clientX === \"undefined\" ? e.touches[0].clientX : e.clientX;\n\t\tself.latestX = self.startX;\n\t\tself.startWidth = column.getWidth();\n\t\t\n\t\tdocument.body.addEventListener(\"mousemove\", mouseMove);\n\t\tdocument.body.addEventListener(\"mouseup\", mouseUp);\n\t\thandle.addEventListener(\"touchmove\", mouseMove, {passive: true});\n\t\thandle.addEventListener(\"touchend\", mouseUp);\n\t}\n}\n\nclass ResizeRows extends Module{\n\n\tstatic moduleName = \"resizeRows\";\n\n\tconstructor(table){\n\t\tsuper(table);\n\n\t\tthis.startColumn = false;\n\t\tthis.startY = false;\n\t\tthis.startHeight = false;\n\t\tthis.handle = null;\n\t\tthis.prevHandle = null;\n\n\t\tthis.registerTableOption(\"resizableRows\", false); //resizable rows\n\t\tthis.registerTableOption(\"resizableRowGuide\", false);\n\t}\n\n\tinitialize(){\n\t\tif(this.table.options.resizableRows){\n\t\t\tthis.subscribe(\"row-layout-after\", this.initializeRow.bind(this));\n\t\t}\n\t}\n\n\tinitializeRow(row){\n\t\tvar self = this,\n\t\trowEl = row.getElement();\n\n\t\tvar handle = document.createElement('div');\n\t\thandle.className = \"tabulator-row-resize-handle\";\n\n\t\tvar prevHandle = document.createElement('div');\n\t\tprevHandle.className = \"tabulator-row-resize-handle prev\";\n\n\t\thandle.addEventListener(\"click\", function(e){\n\t\t\te.stopPropagation();\n\t\t});\n\n\t\tvar handleDown = function(e){\n\t\t\tself.startRow = row;\n\t\t\tself._mouseDown(e, row, handle);\n\t\t};\n\n\t\thandle.addEventListener(\"mousedown\", handleDown);\n\t\thandle.addEventListener(\"touchstart\", handleDown, {passive: true});\n\n\t\tprevHandle.addEventListener(\"click\", function(e){\n\t\t\te.stopPropagation();\n\t\t});\n\n\t\tvar prevHandleDown = function(e){\n\t\t\tvar prevRow = self.table.rowManager.prevDisplayRow(row);\n\n\t\t\tif(prevRow){\n\t\t\t\tself.startRow = prevRow;\n\t\t\t\tself._mouseDown(e, prevRow, prevHandle);\n\t\t\t}\n\t\t};\n\n\t\tprevHandle.addEventListener(\"mousedown\",prevHandleDown);\n\t\tprevHandle.addEventListener(\"touchstart\",prevHandleDown, {passive: true});\n\n\t\trowEl.appendChild(handle);\n\t\trowEl.appendChild(prevHandle);\n\t}\n\n\tresize(e, row) {\n\t\trow.setHeight(this.startHeight + ((typeof e.screenY === \"undefined\" ? e.touches[0].screenY : e.screenY) - this.startY));\n\t}\n\n\tcalcGuidePosition(e, row, handle) {\n\t\tvar mouseY = typeof e.screenY === \"undefined\" ? e.touches[0].screenY : e.screenY,\n\t\thandleY = handle.getBoundingClientRect().y - this.table.element.getBoundingClientRect().y,\n\t\ttableY = this.table.element.getBoundingClientRect().y,\n\t\trowY = row.element.getBoundingClientRect().top - tableY,\n\t\tmouseDiff = mouseY - this.startY;\n\n\t\treturn Math.max(handleY + mouseDiff, rowY);\n\t}\n\n\t_mouseDown(e, row, handle){\n\t\tvar self = this,\n\t\tguideEl;\n\n\t\tself.dispatchExternal(\"rowResizing\", row.getComponent());\n\n\t\tif(self.table.options.resizableRowGuide){\n\t\t\tguideEl = document.createElement(\"span\");\n\t\t\tguideEl.classList.add('tabulator-row-resize-guide');\n\t\t\tself.table.element.appendChild(guideEl);\n\t\t\tsetTimeout(() => {\n\t\t\t\tguideEl.style.top = self.calcGuidePosition(e, row, handle) + \"px\";\n\t\t\t});\n\t\t}\n\n\t\tself.table.element.classList.add(\"tabulator-block-select\");\n\n\t\tfunction mouseMove(e){\n\t\t\tif(self.table.options.resizableRowGuide){\n\t\t\t\tguideEl.style.top = self.calcGuidePosition(e, row, handle) + \"px\";\n\t\t\t}else {\n\t\t\t\tself.resize(e, row);\n\t\t\t}\n\t\t}\n\n\t\tfunction mouseUp(e){\n\t\t\tif(self.table.options.resizableRowGuide){\n\t\t\t\tself.resize(e, row);\n\t\t\t\tguideEl.remove();\n\t\t\t}\n\n\t\t\t// //block editor from taking action while resizing is taking place\n\t\t\t// if(self.startColumn.modules.edit){\n\t\t\t// \tself.startColumn.modules.edit.blocked = false;\n\t\t\t// }\n\n\t\t\tdocument.body.removeEventListener(\"mouseup\", mouseMove);\n\t\t\tdocument.body.removeEventListener(\"mousemove\", mouseMove);\n\n\t\t\thandle.removeEventListener(\"touchmove\", mouseMove);\n\t\t\thandle.removeEventListener(\"touchend\", mouseUp);\n\n\t\t\tself.table.element.classList.remove(\"tabulator-block-select\");\n\n\t\t\tself.dispatchExternal(\"rowResized\", row.getComponent());\n\t\t}\n\n\t\te.stopPropagation(); //prevent resize from interfering with movable columns\n\n\t\t//block editor from taking action while resizing is taking place\n\t\t// if(self.startColumn.modules.edit){\n\t\t// \tself.startColumn.modules.edit.blocked = true;\n\t\t// }\n\n\t\tself.startY = typeof e.screenY === \"undefined\" ? e.touches[0].screenY : e.screenY;\n\t\tself.startHeight = row.getHeight();\n\n\t\tdocument.body.addEventListener(\"mousemove\", mouseMove);\n\t\tdocument.body.addEventListener(\"mouseup\", mouseUp);\n\n\t\thandle.addEventListener(\"touchmove\", mouseMove, {passive: true});\n\t\thandle.addEventListener(\"touchend\", mouseUp);\n\t}\n}\n\nclass ResizeTable extends Module{\n\n\tstatic moduleName = \"resizeTable\";\n\t\n\tconstructor(table){\n\t\tsuper(table);\n\t\t\n\t\tthis.binding = false;\n\t\tthis.visibilityObserver = false;\n\t\tthis.resizeObserver = false;\n\t\tthis.containerObserver = false;\n\t\t\n\t\tthis.tableHeight = 0;\n\t\tthis.tableWidth = 0;\n\t\tthis.containerHeight = 0;\n\t\tthis.containerWidth = 0;\n\t\t\n\t\tthis.autoResize = false;\n\t\t\n\t\tthis.visible = false;\n\t\t\n\t\tthis.initialized = false;\n\t\tthis.initialRedraw = false;\n\t\t\n\t\tthis.registerTableOption(\"autoResize\", true); //auto resize table\n\t}\n\t\n\tinitialize(){\n\t\tif(this.table.options.autoResize){\n\t\t\tvar table = this.table,\n\t\t\ttableStyle;\n\t\t\t\n\t\t\tthis.tableHeight = table.element.clientHeight;\n\t\t\tthis.tableWidth = table.element.clientWidth;\n\t\t\t\n\t\t\tif(table.element.parentNode){\n\t\t\t\tthis.containerHeight = table.element.parentNode.clientHeight;\n\t\t\t\tthis.containerWidth = table.element.parentNode.clientWidth;\n\t\t\t}\n\t\t\t\n\t\t\tif(typeof IntersectionObserver !== \"undefined\" && typeof ResizeObserver !== \"undefined\" && table.rowManager.getRenderMode() === \"virtual\"){\n\t\t\t\t\n\t\t\t\tthis.initializeVisibilityObserver();\n\t\t\t\t\n\t\t\t\tthis.autoResize = true;\n\t\t\t\t\n\t\t\t\tthis.resizeObserver = new ResizeObserver((entry) => {\n\t\t\t\t\tif(!table.browserMobile || (table.browserMobile && (!table.modules.edit || (table.modules.edit && !table.modules.edit.currentCell)))){\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar nodeHeight = Math.floor(entry[0].contentRect.height);\n\t\t\t\t\t\tvar nodeWidth = Math.floor(entry[0].contentRect.width);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(this.tableHeight != nodeHeight || this.tableWidth != nodeWidth){\n\t\t\t\t\t\t\tthis.tableHeight = nodeHeight;\n\t\t\t\t\t\t\tthis.tableWidth = nodeWidth;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(table.element.parentNode){\n\t\t\t\t\t\t\t\tthis.containerHeight = table.element.parentNode.clientHeight;\n\t\t\t\t\t\t\t\tthis.containerWidth = table.element.parentNode.clientWidth;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tthis.redrawTable();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tthis.resizeObserver.observe(table.element);\n\t\t\t\t\n\t\t\t\ttableStyle = window.getComputedStyle(table.element);\n\t\t\t\t\n\t\t\t\tif(this.table.element.parentNode && !this.table.rowManager.fixedHeight && (tableStyle.getPropertyValue(\"max-height\") || tableStyle.getPropertyValue(\"min-height\"))){\n\t\t\t\t\t\n\t\t\t\t\tthis.containerObserver = new ResizeObserver((entry) => {\n\t\t\t\t\t\tif(!table.browserMobile || (table.browserMobile && (!table.modules.edit || (table.modules.edit && !table.modules.edit.currentCell)))){\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tvar nodeHeight = Math.floor(entry[0].contentRect.height);\n\t\t\t\t\t\t\tvar nodeWidth = Math.floor(entry[0].contentRect.width);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(this.containerHeight != nodeHeight || this.containerWidth != nodeWidth){\n\t\t\t\t\t\t\t\tthis.containerHeight = nodeHeight;\n\t\t\t\t\t\t\t\tthis.containerWidth = nodeWidth;\n\t\t\t\t\t\t\t\tthis.tableHeight = table.element.clientHeight;\n\t\t\t\t\t\t\t\tthis.tableWidth = table.element.clientWidth;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tthis.redrawTable();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tthis.containerObserver.observe(this.table.element.parentNode);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.subscribe(\"table-resize\", this.tableResized.bind(this));\n\t\t\t\t\n\t\t\t}else {\n\t\t\t\tthis.binding = function(){\n\t\t\t\t\tif(!table.browserMobile || (table.browserMobile && (!table.modules.edit || (table.modules.edit && !table.modules.edit.currentCell)))){\n\t\t\t\t\t\ttable.columnManager.rerenderColumns(true);\n\t\t\t\t\t\ttable.redraw();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\twindow.addEventListener(\"resize\", this.binding);\n\t\t\t}\n\t\t\t\n\t\t\tthis.subscribe(\"table-destroy\", this.clearBindings.bind(this));\n\t\t}\n\t}\n\t\n\tinitializeVisibilityObserver(){\n\t\tthis.visibilityObserver = new IntersectionObserver((entries) => {\n\t\t\tthis.visible = entries[0].isIntersecting;\n\t\t\t\n\t\t\tif(!this.initialized){\n\t\t\t\tthis.initialized = true;\n\t\t\t\tthis.initialRedraw = !this.visible;\n\t\t\t}else {\n\t\t\t\tif(this.visible){\n\t\t\t\t\tthis.redrawTable(this.initialRedraw);\n\t\t\t\t\tthis.initialRedraw = false;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t\n\t\tthis.visibilityObserver.observe(this.table.element);\n\t}\n\t\n\tredrawTable(force){\n\t\tif(this.initialized && this.visible){\n\t\t\tthis.table.columnManager.rerenderColumns(true);\n\t\t\tthis.table.redraw(force);\n\t\t}\n\t}\n\t\n\ttableResized(){\n\t\tthis.table.rowManager.redraw();\n\t}\n\t\n\tclearBindings(){\n\t\tif(this.binding){\n\t\t\twindow.removeEventListener(\"resize\", this.binding);\n\t\t}\n\t\t\n\t\tif(this.resizeObserver){\n\t\t\tthis.resizeObserver.unobserve(this.table.element);\n\t\t}\n\t\t\n\t\tif(this.visibilityObserver){\n\t\t\tthis.visibilityObserver.unobserve(this.table.element);\n\t\t}\n\t\t\n\t\tif(this.containerObserver){\n\t\t\tthis.containerObserver.unobserve(this.table.element.parentNode);\n\t\t}\n\t}\n}\n\nfunction responsiveCollapse(cell, formatterParams, onRendered){\n\tvar el = document.createElement(\"div\"),\n\tconfig = cell.getRow()._row.modules.responsiveLayout;\n\n\tel.classList.add(\"tabulator-responsive-collapse-toggle\");\n\t\n\tel.innerHTML = `<svg class='tabulator-responsive-collapse-toggle-open' viewbox=\"0 0 24 24\">\n <line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"12\" fill=\"none\" stroke-width=\"3\" stroke-linecap=\"round\" />\n <line y1=\"7\" x1=\"12\" y2=\"17\" x2=\"12\" fill=\"none\" stroke-width=\"3\" stroke-linecap=\"round\" />\n</svg>\n\n<svg class='tabulator-responsive-collapse-toggle-close' viewbox=\"0 0 24 24\">\n <line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"12\" fill=\"none\" stroke-width=\"3\" stroke-linecap=\"round\" />\n</svg>`;\n\n\tcell.getElement().classList.add(\"tabulator-row-handle\");\n\n\tfunction toggleList(isOpen){\n\t\tvar collapseEl = config.element;\n\n\t\tconfig.open = isOpen;\n\n\t\tif(collapseEl){\n\n\t\t\tif(config.open){\n\t\t\t\tel.classList.add(\"open\");\n\t\t\t\tcollapseEl.style.display = '';\n\t\t\t}else {\n\t\t\t\tel.classList.remove(\"open\");\n\t\t\t\tcollapseEl.style.display = 'none';\n\t\t\t}\n\t\t}\n\t}\n\n\tel.addEventListener(\"click\", function(e){\n\t\te.stopImmediatePropagation();\n\t\ttoggleList(!config.open);\n\t\tcell.getTable().rowManager.adjustTableSize();\n\t});\n\n\ttoggleList(config.open);\n\n\treturn el;\n}\n\nvar extensions$2 = {\r\n\tformat:{\r\n\t\tformatters:{\r\n\t\t\tresponsiveCollapse:responsiveCollapse,\r\n\t\t}\r\n\t}\r\n};\n\nclass ResponsiveLayout extends Module{\n\n\tstatic moduleName = \"responsiveLayout\";\n\tstatic moduleExtensions = extensions$2;\n\n\tconstructor(table){\n\t\tsuper(table);\n\n\t\tthis.columns = [];\n\t\tthis.hiddenColumns = [];\n\t\tthis.mode = \"\";\n\t\tthis.index = 0;\n\t\tthis.collapseFormatter = [];\n\t\tthis.collapseStartOpen = true;\n\t\tthis.collapseHandleColumn = false;\n\n\t\tthis.registerTableOption(\"responsiveLayout\", false); //responsive layout flags\n\t\tthis.registerTableOption(\"responsiveLayoutCollapseStartOpen\", true); //start showing collapsed data\n\t\tthis.registerTableOption(\"responsiveLayoutCollapseUseFormatters\", true); //responsive layout collapse formatter\n\t\tthis.registerTableOption(\"responsiveLayoutCollapseFormatter\", false); //responsive layout collapse formatter\n\n\t\tthis.registerColumnOption(\"responsive\");\n\t}\n\n\t//generate responsive columns list\n\tinitialize(){\n\t\tif(this.table.options.responsiveLayout){\n\t\t\tthis.subscribe(\"column-layout\", this.initializeColumn.bind(this));\n\t\t\tthis.subscribe(\"column-show\", this.updateColumnVisibility.bind(this));\n\t\t\tthis.subscribe(\"column-hide\", this.updateColumnVisibility.bind(this));\n\t\t\tthis.subscribe(\"columns-loaded\", this.initializeResponsivity.bind(this));\n\t\t\tthis.subscribe(\"column-moved\", this.initializeResponsivity.bind(this));\n\t\t\tthis.subscribe(\"column-add\", this.initializeResponsivity.bind(this));\n\t\t\tthis.subscribe(\"column-delete\", this.initializeResponsivity.bind(this));\n\n\t\t\tthis.subscribe(\"table-redrawing\", this.tableRedraw.bind(this));\n\t\t\t\n\t\t\tif(this.table.options.responsiveLayout === \"collapse\"){\n\t\t\t\tthis.subscribe(\"row-data-changed\", this.generateCollapsedRowContent.bind(this));\n\t\t\t\tthis.subscribe(\"row-init\", this.initializeRow.bind(this));\n\t\t\t\tthis.subscribe(\"row-layout\", this.layoutRow.bind(this));\n\t\t\t}\n\t\t}\n\t}\n\n\ttableRedraw(force){\n\t\tif([\"fitColumns\", \"fitDataStretch\"].indexOf(this.layoutMode()) === -1){\n\t\t\tif(!force){\n\t\t\t\tthis.update();\n\t\t\t}\n\t\t}\n\t}\n\n\tinitializeResponsivity(){\n\t\tvar columns = [];\n\n\t\tthis.mode = this.table.options.responsiveLayout;\n\t\tthis.collapseFormatter = this.table.options.responsiveLayoutCollapseFormatter || this.formatCollapsedData;\n\t\tthis.collapseStartOpen = this.table.options.responsiveLayoutCollapseStartOpen;\n\t\tthis.hiddenColumns = [];\n\n\t\tif(this.collapseFormatter){\n\t\t\tthis.collapseFormatter = this.collapseFormatter.bind(this.table);\n\t\t}\n\n\t\t//determine level of responsivity for each column\n\t\tthis.table.columnManager.columnsByIndex.forEach((column, i) => {\n\t\t\tif(column.modules.responsive){\n\t\t\t\tif(column.modules.responsive.order && column.modules.responsive.visible){\n\t\t\t\t\tcolumn.modules.responsive.index = i;\n\t\t\t\t\tcolumns.push(column);\n\n\t\t\t\t\tif(!column.visible && this.mode === \"collapse\"){\n\t\t\t\t\t\tthis.hiddenColumns.push(column);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t//sort list by responsivity\n\t\tcolumns = columns.reverse();\n\t\tcolumns = columns.sort((a, b) => {\n\t\t\tvar diff = b.modules.responsive.order - a.modules.responsive.order;\n\t\t\treturn diff || (b.modules.responsive.index - a.modules.responsive.index);\n\t\t});\n\n\t\tthis.columns = columns;\n\n\t\tif(this.mode === \"collapse\"){\n\t\t\tthis.generateCollapsedContent();\n\t\t}\n\n\t\t//assign collapse column\n\t\tfor (let col of this.table.columnManager.columnsByIndex){\n\t\t\tif(col.definition.formatter == \"responsiveCollapse\"){\n\t\t\t\tthis.collapseHandleColumn = col;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif(this.collapseHandleColumn){\n\t\t\tif(this.hiddenColumns.length){\n\t\t\t\tthis.collapseHandleColumn.show();\n\t\t\t}else {\n\t\t\t\tthis.collapseHandleColumn.hide();\n\t\t\t}\n\t\t}\n\t}\n\n\t//define layout information\n\tinitializeColumn(column){\n\t\tvar def = column.getDefinition();\n\n\t\tcolumn.modules.responsive = {order: typeof def.responsive === \"undefined\" ? 1 : def.responsive, visible:def.visible === false ? false : true};\n\t}\n\n\tinitializeRow(row){\n\t\tvar el;\n\n\t\tif(row.type !== \"calc\"){\n\t\t\tel = document.createElement(\"div\");\n\t\t\tel.classList.add(\"tabulator-responsive-collapse\");\n\n\t\t\trow.modules.responsiveLayout = {\n\t\t\t\telement:el,\n\t\t\t\topen:this.collapseStartOpen,\n\t\t\t};\n\n\t\t\tif(!this.collapseStartOpen){\n\t\t\t\tel.style.display = 'none';\n\t\t\t}\n\t\t}\n\t}\n\n\tlayoutRow(row){\n\t\tvar rowEl = row.getElement();\n\n\t\tif(row.modules.responsiveLayout){\n\t\t\trowEl.appendChild(row.modules.responsiveLayout.element);\n\t\t\tthis.generateCollapsedRowContent(row);\n\t\t}\n\t}\n\n\t//update column visibility\n\tupdateColumnVisibility(column, responsiveToggle){\n\t\tif(!responsiveToggle && column.modules.responsive){\n\t\t\tcolumn.modules.responsive.visible = column.visible;\n\t\t\tthis.initializeResponsivity();\n\t\t}\n\t}\n\n\thideColumn(column){\n\t\tvar colCount = this.hiddenColumns.length;\n\n\t\tcolumn.hide(false, true);\n\n\t\tif(this.mode === \"collapse\"){\n\t\t\tthis.hiddenColumns.unshift(column);\n\t\t\tthis.generateCollapsedContent();\n\n\t\t\tif(this.collapseHandleColumn && !colCount){\n\t\t\t\tthis.collapseHandleColumn.show();\n\t\t\t}\n\t\t}\n\t}\n\n\tshowColumn(column){\n\t\tvar index;\n\n\t\tcolumn.show(false, true);\n\t\t//set column width to prevent calculation loops on uninitialized columns\n\t\tcolumn.setWidth(column.getWidth());\n\n\t\tif(this.mode === \"collapse\"){\n\t\t\tindex = this.hiddenColumns.indexOf(column);\n\n\t\t\tif(index > -1){\n\t\t\t\tthis.hiddenColumns.splice(index, 1);\n\t\t\t}\n\n\t\t\tthis.generateCollapsedContent();\n\n\t\t\tif(this.collapseHandleColumn && !this.hiddenColumns.length){\n\t\t\t\tthis.collapseHandleColumn.hide();\n\t\t\t}\n\t\t}\n\t}\n\n\t//redraw columns to fit space\n\tupdate(){\n\t\tvar working = true;\n\n\t\twhile(working){\n\n\t\t\tlet width = this.table.modules.layout.getMode() == \"fitColumns\" ? this.table.columnManager.getFlexBaseWidth() : this.table.columnManager.getWidth();\n\n\t\t\tlet diff = (this.table.options.headerVisible ? this.table.columnManager.element.clientWidth : this.table.element.clientWidth) - width;\n\n\t\t\tif(diff < 0){\n\t\t\t\t//table is too wide\n\t\t\t\tlet column = this.columns[this.index];\n\n\t\t\t\tif(column){\n\t\t\t\t\tthis.hideColumn(column);\n\t\t\t\t\tthis.index ++;\n\t\t\t\t}else {\n\t\t\t\t\tworking = false;\n\t\t\t\t}\n\n\t\t\t}else {\n\n\t\t\t\t//table has spare space\n\t\t\t\tlet column = this.columns[this.index -1];\n\n\t\t\t\tif(column){\n\t\t\t\t\tif(diff > 0){\n\t\t\t\t\t\tif(diff >= column.getWidth()){\n\t\t\t\t\t\t\tthis.showColumn(column);\n\t\t\t\t\t\t\tthis.index --;\n\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\tworking = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}else {\n\t\t\t\t\t\tworking = false;\n\t\t\t\t\t}\n\t\t\t\t}else {\n\t\t\t\t\tworking = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!this.table.rowManager.activeRowsCount){\n\t\t\t\tthis.table.rowManager.renderEmptyScroll();\n\t\t\t}\n\t\t}\n\t}\n\n\tgenerateCollapsedContent(){\n\t\tvar rows = this.table.rowManager.getDisplayRows();\n\n\t\trows.forEach((row) => {\n\t\t\tthis.generateCollapsedRowContent(row);\n\t\t});\n\t}\n\n\tgenerateCollapsedRowContent(row){\n\t\tvar el, contents;\n\n\t\tif(row.modules.responsiveLayout){\n\t\t\tel = row.modules.responsiveLayout.element;\n\n\t\t\twhile(el.firstChild) el.removeChild(el.firstChild);\n\n\t\t\tcontents = this.collapseFormatter(this.generateCollapsedRowData(row));\n\t\t\tif(contents){\n\t\t\t\tel.appendChild(contents);\n\t\t\t}\n\t\t\trow.calcHeight(true);\n\t\t}\n\t}\n\n\tgenerateCollapsedRowData(row){\n\t\tvar data = row.getData(),\n\t\toutput = [],\n\t\tmockCellComponent;\n\n\t\tthis.hiddenColumns.forEach((column) => {\n\t\t\tvar value = column.getFieldValue(data);\n\n\t\t\tif(column.definition.title && column.field){\n\t\t\t\tif(column.modules.format && this.table.options.responsiveLayoutCollapseUseFormatters){\n\n\t\t\t\t\tmockCellComponent = {\n\t\t\t\t\t\tvalue:false,\n\t\t\t\t\t\tdata:{},\n\t\t\t\t\t\tgetValue:function(){\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tgetData:function(){\n\t\t\t\t\t\t\treturn data;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tgetType:function(){\n\t\t\t\t\t\t\treturn \"cell\";\n\t\t\t\t\t\t},\n\t\t\t\t\t\tgetElement:function(){\n\t\t\t\t\t\t\treturn document.createElement(\"div\");\n\t\t\t\t\t\t},\n\t\t\t\t\t\tgetRow:function(){\n\t\t\t\t\t\t\treturn row.getComponent();\n\t\t\t\t\t\t},\n\t\t\t\t\t\tgetColumn:function(){\n\t\t\t\t\t\t\treturn column.getComponent();\n\t\t\t\t\t\t},\n\t\t\t\t\t\tgetTable:() => {\n\t\t\t\t\t\t\treturn this.table;\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\n\t\t\t\t\tfunction onRendered(callback){\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t}\n\n\t\t\t\t\toutput.push({\n\t\t\t\t\t\tfield: column.field,\n\t\t\t\t\t\ttitle: column.definition.title,\n\t\t\t\t\t\tvalue: column.modules.format.formatter.call(this.table.modules.format, mockCellComponent, column.modules.format.params, onRendered)\n\t\t\t\t\t});\n\t\t\t\t}else {\n\t\t\t\t\toutput.push({\n\t\t\t\t\t\tfield: column.field,\n\t\t\t\t\t\ttitle: column.definition.title,\n\t\t\t\t\t\tvalue: value\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn output;\n\t}\n\n\tformatCollapsedData(data){\n\t\tvar list = document.createElement(\"table\");\n\n\t\tdata.forEach((item) => {\n\t\t\tvar row = document.createElement(\"tr\");\n\t\t\tvar titleData = document.createElement(\"td\");\n\t\t\tvar valueData = document.createElement(\"td\");\n\t\t\tvar node_content;\n\n\t\t\tvar titleHighlight = document.createElement(\"strong\");\n\t\t\ttitleData.appendChild(titleHighlight);\n\t\t\t\n\t\t\tthis.modules.localize.bind(\"columns|\" + item.field, function(text){\n\t\t\t\ttitleHighlight.innerHTML = text || item.title;\n\t\t\t});\n\n\t\t\tif(item.value instanceof Node){\n\t\t\t\tnode_content = document.createElement(\"div\");\n\t\t\t\tnode_content.appendChild(item.value);\n\t\t\t\tvalueData.appendChild(node_content);\n\t\t\t}else {\n\t\t\t\tvalueData.innerHTML = item.value;\n\t\t\t}\n\n\t\t\trow.appendChild(titleData);\n\t\t\trow.appendChild(valueData);\n\t\t\tlist.appendChild(row);\n\t\t});\n\n\t\treturn Object.keys(data).length ? list : \"\";\n\t}\n}\n\nfunction rowSelection(cell, formatterParams, onRendered){\n\tvar checkbox = document.createElement(\"input\");\n\tvar blocked = false;\n\n\tcheckbox.type = 'checkbox';\n\n\tcheckbox.setAttribute(\"aria-label\", \"Select Row\");\n\t\n\tif(this.table.modExists(\"selectRow\", true)){\n\n\t\tcheckbox.addEventListener(\"click\", (e) => {\n\t\t\te.stopPropagation();\n\t\t});\n\n\t\tif(typeof cell.getRow == 'function'){\n\t\t\tvar row = cell.getRow();\n\n\t\t\tif(row instanceof RowComponent){\n\n\t\t\t\tcheckbox.addEventListener(\"change\", (e) => {\n\t\t\t\t\tif(this.table.options.selectableRowsRangeMode === \"click\"){\n\t\t\t\t\t\tif(!blocked){\n\t\t\t\t\t\t\trow.toggleSelect();\n\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\tblocked = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}else {\n\t\t\t\t\t\trow.toggleSelect();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif(this.table.options.selectableRowsRangeMode === \"click\"){\n\t\t\t\t\tcheckbox.addEventListener(\"click\", (e) => {\n\t\t\t\t\t\tblocked = true;\n\t\t\t\t\t\tthis.table.modules.selectRow.handleComplexRowClick(row._row, e);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tcheckbox.checked = row.isSelected && row.isSelected();\n\t\t\t\tthis.table.modules.selectRow.registerRowSelectCheckbox(row, checkbox);\n\t\t\t}else {\n\t\t\t\tcheckbox = \"\";\n\t\t\t}\n\t\t}else {\n\t\t\tcheckbox.addEventListener(\"change\", (e) => {\n\t\t\t\tif(this.table.modules.selectRow.selectedRows.length){\n\t\t\t\t\tthis.table.deselectRow();\n\t\t\t\t}else {\n\t\t\t\t\tthis.table.selectRow(formatterParams.rowRange);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.table.modules.selectRow.registerHeaderSelectCheckbox(checkbox);\n\t\t}\n\t}\n\n\treturn checkbox;\n}\n\nvar extensions$1 = {\r\n\tformat:{\r\n\t\tformatters:{\r\n\t\t\trowSelection:rowSelection,\r\n\t\t}\r\n\t}\r\n};\n\nclass SelectRow extends Module{\n\n\tstatic moduleName = \"selectRow\";\n\tstatic moduleExtensions = extensions$1;\n\t\n\tconstructor(table){\n\t\tsuper(table);\n\t\t\n\t\tthis.selecting = false; //flag selecting in progress\n\t\tthis.lastClickedRow = false; //last clicked row\n\t\tthis.selectPrev = []; //hold previously selected element for drag drop selection\n\t\tthis.selectedRows = []; //hold selected rows\n\t\tthis.headerCheckboxElement = null; // hold header select element\n\t\t\n\t\tthis.registerTableOption(\"selectableRows\", \"highlight\"); //highlight rows on hover\n\t\tthis.registerTableOption(\"selectableRowsRangeMode\", \"drag\"); //highlight rows on hover\n\t\tthis.registerTableOption(\"selectableRowsRollingSelection\", true); //roll selection once maximum number of selectable rows is reached\n\t\tthis.registerTableOption(\"selectableRowsPersistence\", true); // maintain selection when table view is updated\n\t\tthis.registerTableOption(\"selectableRowsCheck\", function(data, row){return true;}); //check whether row is selectable\n\t\t\n\t\tthis.registerTableFunction(\"selectRow\", this.selectRows.bind(this));\n\t\tthis.registerTableFunction(\"deselectRow\", this.deselectRows.bind(this));\n\t\tthis.registerTableFunction(\"toggleSelectRow\", this.toggleRow.bind(this));\n\t\tthis.registerTableFunction(\"getSelectedRows\", this.getSelectedRows.bind(this));\n\t\tthis.registerTableFunction(\"getSelectedData\", this.getSelectedData.bind(this));\n\t\t\n\t\t//register component functions\n\t\tthis.registerComponentFunction(\"row\", \"select\", this.selectRows.bind(this));\n\t\tthis.registerComponentFunction(\"row\", \"deselect\", this.deselectRows.bind(this));\n\t\tthis.registerComponentFunction(\"row\", \"toggleSelect\", this.toggleRow.bind(this));\n\t\tthis.registerComponentFunction(\"row\", \"isSelected\", this.isRowSelected.bind(this));\n\t}\n\t\n\tinitialize(){\n\n\t\tthis.deprecatedOptionsCheck();\n\n\t\tif(this.table.options.selectableRows === \"highlight\" && this.table.options.selectableRange){\n\t\t\tthis.table.options.selectableRows = false;\n\t\t}\n\n\t\tif(this.table.options.selectableRows !== false){\n\t\t\tthis.subscribe(\"row-init\", this.initializeRow.bind(this));\n\t\t\tthis.subscribe(\"row-deleting\", this.rowDeleted.bind(this));\n\t\t\tthis.subscribe(\"rows-wipe\", this.clearSelectionData.bind(this));\n\t\t\tthis.subscribe(\"rows-retrieve\", this.rowRetrieve.bind(this));\n\t\t\t\n\t\t\tif(this.table.options.selectableRows && !this.table.options.selectableRowsPersistence){\n\t\t\t\tthis.subscribe(\"data-refreshing\", this.deselectRows.bind(this));\n\t\t\t}\n\t\t}\n\t}\n\n\tdeprecatedOptionsCheck(){\n\t\t// this.deprecationCheck(\"selectable\", \"selectableRows\", true);\n\t\t// this.deprecationCheck(\"selectableRollingSelection\", \"selectableRowsRollingSelection\", true);\n\t\t// this.deprecationCheck(\"selectableRangeMode\", \"selectableRowsRangeMode\", true);\n\t\t// this.deprecationCheck(\"selectablePersistence\", \"selectableRowsPersistence\", true);\n\t\t// this.deprecationCheck(\"selectableCheck\", \"selectableRowsCheck\", true);\n\t}\n\t\n\trowRetrieve(type, prevValue){\n\t\treturn type === \"selected\" ? this.selectedRows : prevValue;\n\t}\n\t\n\trowDeleted(row){\n\t\tthis._deselectRow(row, true);\n\t}\n\t\n\tclearSelectionData(silent){\n\t\tvar prevSelected = this.selectedRows.length;\n\n\t\tthis.selecting = false;\n\t\tthis.lastClickedRow = false;\n\t\tthis.selectPrev = [];\n\t\tthis.selectedRows = [];\n\t\t\n\t\tif(prevSelected && silent !== true){\n\t\t\tthis._rowSelectionChanged();\n\t\t}\n\t}\n\t\n\tinitializeRow(row){\n\t\tvar self = this,\n\t\tselectable = self.checkRowSelectability(row),\n\t\telement = row.getElement();\n\t\t\n\t\t// trigger end of row selection\n\t\tvar endSelect = function(){\n\t\t\t\n\t\t\tsetTimeout(function(){\n\t\t\t\tself.selecting = false;\n\t\t\t}, 50);\n\t\t\t\n\t\t\tdocument.body.removeEventListener(\"mouseup\", endSelect);\n\t\t};\n\t\t\n\t\trow.modules.select = {selected:false};\n\n\t\telement.classList.toggle(\"tabulator-selectable\", selectable);\n\t\telement.classList.toggle(\"tabulator-unselectable\", !selectable);\n\t\t\n\t\t//set row selection class\n\t\tif(self.checkRowSelectability(row)){\t\t\t\n\t\t\tif(self.table.options.selectableRows && self.table.options.selectableRows != \"highlight\"){\n\t\t\t\tif(self.table.options.selectableRowsRangeMode === \"click\"){\n\t\t\t\t\telement.addEventListener(\"click\", this.handleComplexRowClick.bind(this, row));\n\t\t\t\t}else {\n\t\t\t\t\telement.addEventListener(\"click\", function(e){\n\t\t\t\t\t\tif(!self.table.modExists(\"edit\") || !self.table.modules.edit.getCurrentCell()){\n\t\t\t\t\t\t\tself.table._clearSelection();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(!self.selecting){\n\t\t\t\t\t\t\tself.toggleRow(row);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\telement.addEventListener(\"mousedown\", function(e){\n\t\t\t\t\t\tif(e.shiftKey){\n\t\t\t\t\t\t\tself.table._clearSelection();\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tself.selecting = true;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tself.selectPrev = [];\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tdocument.body.addEventListener(\"mouseup\", endSelect);\n\t\t\t\t\t\t\tdocument.body.addEventListener(\"keyup\", endSelect);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tself.toggleRow(row);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\telement.addEventListener(\"mouseenter\", function(e){\n\t\t\t\t\t\tif(self.selecting){\n\t\t\t\t\t\t\tself.table._clearSelection();\n\t\t\t\t\t\t\tself.toggleRow(row);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(self.selectPrev[1] == row){\n\t\t\t\t\t\t\t\tself.toggleRow(self.selectPrev[0]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\telement.addEventListener(\"mouseout\", function(e){\n\t\t\t\t\t\tif(self.selecting){\n\t\t\t\t\t\t\tself.table._clearSelection();\n\t\t\t\t\t\t\tself.selectPrev.unshift(row);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\thandleComplexRowClick(row, e){\n\t\tif(e.shiftKey){\n\t\t\tthis.table._clearSelection();\n\t\t\tthis.lastClickedRow = this.lastClickedRow || row;\n\t\t\t\n\t\t\tvar lastClickedRowIdx = this.table.rowManager.getDisplayRowIndex(this.lastClickedRow);\n\t\t\tvar rowIdx = this.table.rowManager.getDisplayRowIndex(row);\n\t\t\t\n\t\t\tvar fromRowIdx = lastClickedRowIdx <= rowIdx ? lastClickedRowIdx : rowIdx;\n\t\t\tvar toRowIdx = lastClickedRowIdx >= rowIdx ? lastClickedRowIdx : rowIdx;\n\t\t\t\n\t\t\tvar rows = this.table.rowManager.getDisplayRows().slice(0);\n\t\t\tvar toggledRows = rows.splice(fromRowIdx, toRowIdx - fromRowIdx + 1);\n\t\t\t\n\t\t\tif(e.ctrlKey || e.metaKey){\n\t\t\t\ttoggledRows.forEach((toggledRow)=>{\n\t\t\t\t\tif(toggledRow !== this.lastClickedRow){\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(this.table.options.selectableRows !== true && !this.isRowSelected(row)){\n\t\t\t\t\t\t\tif(this.selectedRows.length < this.table.options.selectableRows){\n\t\t\t\t\t\t\t\tthis.toggleRow(toggledRow);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\tthis.toggleRow(toggledRow);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tthis.lastClickedRow = row;\n\t\t\t}else {\n\t\t\t\tthis.deselectRows(undefined, true);\n\t\t\t\t\n\t\t\t\tif(this.table.options.selectableRows !== true){\n\t\t\t\t\tif(toggledRows.length > this.table.options.selectableRows){\n\t\t\t\t\t\ttoggledRows = toggledRows.slice(0, this.table.options.selectableRows);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.selectRows(toggledRows);\n\t\t\t}\n\t\t\tthis.table._clearSelection();\n\t\t}\n\t\telse if(e.ctrlKey || e.metaKey){\n\t\t\tthis.toggleRow(row);\n\t\t\tthis.lastClickedRow = row;\n\t\t}else {\n\t\t\tthis.deselectRows(undefined, true);\n\t\t\tthis.selectRows(row);\n\t\t\tthis.lastClickedRow = row;\n\t\t}\n\t}\n\n\tcheckRowSelectability(row){\n\t\tif(row && row.type === \"row\"){\n\t\t\treturn this.table.options.selectableRowsCheck.call(this.table, row.getComponent());\n\t\t}\n\n\t\treturn false;\n\t}\n\t\n\t//toggle row selection\n\ttoggleRow(row){\n\t\tif(this.checkRowSelectability(row)){\n\t\t\tif(row.modules.select && row.modules.select.selected){\n\t\t\t\tthis._deselectRow(row);\n\t\t\t}else {\n\t\t\t\tthis._selectRow(row);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t//select a number of rows\n\tselectRows(rows){\n\t\tvar changes = [], \n\t\trowMatch, change;\n\t\t\n\t\tswitch(typeof rows){\n\t\t\tcase \"undefined\":\n\t\t\t\trowMatch = this.table.rowManager.rows;\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase \"number\":\n\t\t\t\trowMatch = this.table.rowManager.findRow(rows);\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase \"string\":\n\t\t\t\trowMatch = this.table.rowManager.findRow(rows);\n\t\t\t\n\t\t\t\tif(!rowMatch){\n\t\t\t\t\trowMatch = this.table.rowManager.getRows(rows);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tdefault:\n\t\t\t\trowMatch = rows;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif(Array.isArray(rowMatch)){\n\t\t\tif(rowMatch.length){\n\t\t\t\trowMatch.forEach((row) => {\n\t\t\t\t\tchange = this._selectRow(row, true, true);\n\n\t\t\t\t\tif(change){\n\t\t\t\t\t\tchanges.push(change);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tthis._rowSelectionChanged(false, changes);\n\t\t\t}\n\t\t}else {\n\t\t\tif(rowMatch){\n\t\t\t\tthis._selectRow(rowMatch, false, true);\n\t\t\t}\n\t\t}\t\n\t}\n\t\n\t//select an individual row\n\t_selectRow(rowInfo, silent, force){\n\t\t//handle max row count\n\t\tif(!isNaN(this.table.options.selectableRows) && this.table.options.selectableRows !== true && !force){\n\t\t\tif(this.selectedRows.length >= this.table.options.selectableRows){\n\t\t\t\tif(this.table.options.selectableRowsRollingSelection){\n\t\t\t\t\tthis._deselectRow(this.selectedRows[0]);\n\t\t\t\t}else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tvar row = this.table.rowManager.findRow(rowInfo);\n\t\t\n\t\tif(row){\n\t\t\tif(this.selectedRows.indexOf(row) == -1){\n\t\t\t\trow.getElement().classList.add(\"tabulator-selected\");\n\t\t\t\tif(!row.modules.select){\n\t\t\t\t\trow.modules.select = {};\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\trow.modules.select.selected = true;\n\t\t\t\tif(row.modules.select.checkboxEl){\n\t\t\t\t\trow.modules.select.checkboxEl.checked = true;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.selectedRows.push(row);\n\t\t\t\t\n\t\t\t\tif(this.table.options.dataTreeSelectPropagate){\n\t\t\t\t\tthis.childRowSelection(row, true);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.dispatchExternal(\"rowSelected\", row.getComponent());\n\t\t\t\t\n\t\t\t\tthis._rowSelectionChanged(silent, row);\n\n\t\t\t\treturn row;\n\t\t\t}\n\t\t}else {\n\t\t\tif(!silent){\n\t\t\t\tconsole.warn(\"Selection Error - No such row found, ignoring selection:\" + rowInfo);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tisRowSelected(row){\n\t\treturn this.selectedRows.indexOf(row) !== -1;\n\t}\n\t\n\t//deselect a number of rows\n\tdeselectRows(rows, silent){\n\t\tvar changes = [], \n\t\trowMatch, change;\n\t\t\n\t\tswitch(typeof rows){\n\t\t\tcase \"undefined\":\n\t\t\t\trowMatch = Object.assign([], this.selectedRows);\n\t\t\t\tbreak;\n\n\t\t\tcase \"number\":\n\t\t\t\trowMatch = this.table.rowManager.findRow(rows);\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase \"string\":\n\t\t\t\trowMatch = this.table.rowManager.findRow(rows);\n\t\t\t\n\t\t\t\tif(!rowMatch){\n\t\t\t\t\trowMatch = this.table.rowManager.getRows(rows);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tdefault:\n\t\t\t\trowMatch = rows;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif(Array.isArray(rowMatch)){\n\t\t\tif(rowMatch.length){\n\t\t\t\trowMatch.forEach((row) => {\n\t\t\t\t\tchange = this._deselectRow(row, true, true);\n\n\t\t\t\t\tif(change){\n\t\t\t\t\t\tchanges.push(change);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tthis._rowSelectionChanged(silent, [], changes);\n\t\t\t}\n\t\t}else {\n\t\t\tif(rowMatch){\n\t\t\t\tthis._deselectRow(rowMatch, silent, true);\n\t\t\t}\n\t\t}\t\n\t}\n\t\n\t//deselect an individual row\n\t_deselectRow(rowInfo, silent){\n\t\tvar self = this,\n\t\trow = self.table.rowManager.findRow(rowInfo),\n\t\tindex, element;\n\t\t\n\t\tif(row){\n\t\t\tindex = self.selectedRows.findIndex(function(selectedRow){\n\t\t\t\treturn selectedRow == row;\n\t\t\t});\n\t\t\t\n\t\t\tif(index > -1){\n\n\t\t\t\telement = row.getElement();\n\t\t\t\t\n\t\t\t\tif(element){\n\t\t\t\t\telement.classList.remove(\"tabulator-selected\");\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(!row.modules.select){\n\t\t\t\t\trow.modules.select = {};\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\trow.modules.select.selected = false;\n\t\t\t\tif(row.modules.select.checkboxEl){\n\t\t\t\t\trow.modules.select.checkboxEl.checked = false;\n\t\t\t\t}\n\t\t\t\tself.selectedRows.splice(index, 1);\n\t\t\t\t\n\t\t\t\tif(this.table.options.dataTreeSelectPropagate){\n\t\t\t\t\tthis.childRowSelection(row, false);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.dispatchExternal(\"rowDeselected\", row.getComponent());\n\t\t\t\t\n\t\t\t\tself._rowSelectionChanged(silent, undefined, row);\n\n\t\t\t\treturn row;\n\t\t\t}\n\t\t}else {\n\t\t\tif(!silent){\n\t\t\t\tconsole.warn(\"Deselection Error - No such row found, ignoring selection:\" + rowInfo);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tgetSelectedData(){\n\t\tvar data = [];\n\t\t\n\t\tthis.selectedRows.forEach(function(row){\n\t\t\tdata.push(row.getData());\n\t\t});\n\t\t\n\t\treturn data;\n\t}\n\t\n\tgetSelectedRows(){\n\t\tvar rows = [];\n\t\t\n\t\tthis.selectedRows.forEach(function(row){\n\t\t\trows.push(row.getComponent());\n\t\t});\n\t\t\n\t\treturn rows;\n\t}\n\t\n\t_rowSelectionChanged(silent, selected = [], deselected = []){\n\t\tif(this.headerCheckboxElement){\n\t\t\tif(this.selectedRows.length === 0){\n\t\t\t\tthis.headerCheckboxElement.checked = false;\n\t\t\t\tthis.headerCheckboxElement.indeterminate = false;\n\t\t\t} else if(this.table.rowManager.rows.length === this.selectedRows.length){\n\t\t\t\tthis.headerCheckboxElement.checked = true;\n\t\t\t\tthis.headerCheckboxElement.indeterminate = false;\n\t\t\t} else {\n\t\t\t\tthis.headerCheckboxElement.indeterminate = true;\n\t\t\t\tthis.headerCheckboxElement.checked = false;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif(!silent){\n\t\t\tif(!Array.isArray(selected)){\n\t\t\t\tselected = [selected];\n\t\t\t}\n\n\t\t\tselected = selected.map(row => row.getComponent());\n\n\t\t\tif(!Array.isArray(deselected)){\n\t\t\t\tdeselected = [deselected];\n\t\t\t}\n\n\t\t\tdeselected = deselected.map(row => row.getComponent());\n\n\t\t\tthis.dispatchExternal(\"rowSelectionChanged\", this.getSelectedData(), this.getSelectedRows(), selected, deselected);\n\t\t}\n\t}\n\t\n\tregisterRowSelectCheckbox (row, element) {\n\t\tif(!row._row.modules.select){\n\t\t\trow._row.modules.select = {};\n\t\t}\n\t\t\n\t\trow._row.modules.select.checkboxEl = element;\n\t}\n\t\n\tregisterHeaderSelectCheckbox (element) {\n\t\tthis.headerCheckboxElement = element;\n\t}\n\t\n\tchildRowSelection(row, select){\n\t\tvar children = this.table.modules.dataTree.getChildren(row, true, true);\n\t\t\n\t\tif(select){\n\t\t\tfor(let child of children){\n\t\t\t\tthis._selectRow(child, true);\n\t\t\t}\n\t\t}else {\n\t\t\tfor(let child of children){\n\t\t\t\tthis._deselectRow(child, true);\n\t\t\t}\n\t\t}\n\t}\n}\n\nclass RangeComponent {\n\tconstructor(range) {\n\t\tthis._range = range;\n\n\t\treturn new Proxy(this, {\n\t\t\tget: function (target, name, receiver) {\n\t\t\t\tif (typeof target[name] !== \"undefined\") {\n\t\t\t\t\treturn target[name];\n\t\t\t\t} else {\n\t\t\t\t\treturn target._range.table.componentFunctionBinder.handle(\"range\", target._range, name);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n\n\tgetElement() {\n\t\treturn this._range.element;\n\t}\n\n\tgetData() {\n\t\treturn this._range.getData();\n\t}\n\n\tgetCells() {\n\t\treturn this._range.getCells(true, true);\n\t}\n\n\tgetStructuredCells() {\n\t\treturn this._range.getStructuredCells();\n\t}\n\n\tgetRows() {\n\t\treturn this._range.getRows().map((row) => row.getComponent());\n\t}\n\n\tgetColumns() {\n\t\treturn this._range.getColumns().map((column) => column.getComponent());\n\t}\n\t\n\tgetBounds() {\n\t\treturn this._range.getBounds();\n\t}\n\n\tgetTopEdge() {\n\t\treturn this._range.top;\n\t}\n\n\tgetBottomEdge() {\n\t\treturn this._range.bottom;\n\t}\n\n\tgetLeftEdge() {\n\t\treturn this._range.left;\n\t}\n\n\tgetRightEdge() {\n\t\treturn this._range.right;\n\t}\n\n\tsetBounds(start, end){\n\t\tif(this._range.destroyedGuard(\"setBounds\")){\n\t\t\tthis._range.setBounds(start ? start._cell : start, end ? end._cell : end);\n\t\t}\n\t}\n\n\tsetStartBound(start){\n\t\tif(this._range.destroyedGuard(\"setStartBound\")){\n\t\t\tthis._range.setEndBound(start ? start._cell : start);\n\t\t\tthis._range.rangeManager.layoutElement();\n\t\t}\n\t}\n\n\tsetEndBound(end){\n\t\tif(this._range.destroyedGuard(\"setEndBound\")){\n\t\t\tthis._range.setEndBound(end ? end._cell : end);\n\t\t\tthis._range.rangeManager.layoutElement();\n\t\t}\n\t}\n\n\tclearValues(){\n\t\tif(this._range.destroyedGuard(\"clearValues\")){\n\t\t\tthis._range.clearValues();\n\t\t}\n\t}\n\n\tremove(){\n\t\tif(this._range.destroyedGuard(\"remove\")){\n\t\t\tthis._range.destroy(true);\n\t\t}\n\t}\n}\n\nclass Range extends CoreFeature{\n\tconstructor(table, rangeManager, start, end) {\n\t\tsuper(table);\n\t\t\n\t\tthis.rangeManager = rangeManager;\n\t\tthis.element = null;\n\t\tthis.initialized = false;\n\t\tthis.initializing = {\n\t\t\tstart:false,\n\t\t\tend:false,\n\t\t};\n\t\tthis.destroyed = false;\n\t\t\n\t\tthis.top = 0;\n\t\tthis.bottom = 0;\n\t\tthis.left = 0;\n\t\tthis.right = 0;\n\t\t\n\t\tthis.table = table;\n\t\tthis.start = {row:0, col:0};\n\t\tthis.end = {row:0, col:0};\n\n\t\tif(this.rangeManager.rowHeader){\n\t\t\tthis.left = 1;\n\t\t\tthis.right = 1;\n\t\t\tthis.start.col = 1;\n\t\t\tthis.end.col = 1;\n\t\t}\n\t\t\n\t\tthis.initElement();\n\t\t\n\t\tsetTimeout(() => {\n\t\t\tthis.initBounds(start, end);\n\t\t});\n\t}\n\t\n\tinitElement(){\n\t\tthis.element = document.createElement(\"div\");\n\t\tthis.element.classList.add(\"tabulator-range\");\n\t}\n\t\n\tinitBounds(start, end){\n\t\tthis._updateMinMax();\n\t\t\n\t\tif(start){\n\t\t\tthis.setBounds(start, end || start);\n\t\t}\n\t}\n\t\n\t///////////////////////////////////\n\t/////// Boundary Setup ///////\n\t///////////////////////////////////\n\t\n\tsetStart(row, col) {\n\t\tif(this.start.row !== row || this.start.col !== col){\n\t\t\tthis.start.row = row;\n\t\t\tthis.start.col = col;\n\t\t\t\n\t\t\tthis.initializing.start = true;\n\t\t\tthis._updateMinMax();\n\t\t}\n\t}\n\t\n\tsetEnd(row, col) {\n\t\tif(this.end.row !== row || this.end.col !== col){\n\t\t\tthis.end.row = row;\n\t\t\tthis.end.col = col;\n\t\t\t\n\t\t\tthis.initializing.end = true;\n\t\t\tthis._updateMinMax();\n\t\t}\n\t}\n\t\n\tsetBounds(start, end, visibleRows){\n\t\tif(start){\n\t\t\tthis.setStartBound(start);\n\t\t}\n\t\t\n\t\tthis.setEndBound(end || start);\n\t\tthis.rangeManager.layoutElement(visibleRows);\n\t}\n\t\n\tsetStartBound(element){\n\t\tvar row, col;\n\t\t\n\t\tif (element.type === \"column\") {\n\t\t\tif(this.rangeManager.columnSelection){\n\t\t\t\tthis.setStart(0, element.getPosition() - 1);\n\t\t\t}\n\t\t}else {\n\t\t\trow = element.row.position - 1;\n\t\t\tcol = element.column.getPosition() - 1;\n\t\t\t\n\t\t\tif (element.column === this.rangeManager.rowHeader) {\n\t\t\t\tthis.setStart(row, 1);\n\t\t\t} else {\n\t\t\t\tthis.setStart(row, col);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tsetEndBound(element){\n\t\tvar rowsCount = this._getTableRows().length,\n\t\trow, col, isRowHeader;\n\t\t\n\t\tif (element.type === \"column\") {\n\t\t\tif(this.rangeManager.columnSelection){\n\t\t\t\tif (this.rangeManager.selecting === \"column\") {\n\t\t\t\t\tthis.setEnd(rowsCount - 1, element.getPosition() - 1);\n\t\t\t\t} else if (this.rangeManager.selecting === \"cell\") {\n\t\t\t\t\tthis.setEnd(0, element.getPosition() - 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}else {\n\t\t\trow = element.row.position - 1;\n\t\t\tcol = element.column.getPosition() - 1;\n\t\t\tisRowHeader = element.column === this.rangeManager.rowHeader;\n\t\t\t\n\t\t\tif (this.rangeManager.selecting === \"row\") {\n\t\t\t\tthis.setEnd(row, this._getTableColumns().length - 1);\n\t\t\t} else if (this.rangeManager.selecting !== \"row\" && isRowHeader) {\n\t\t\t\tthis.setEnd(row, 0);\n\t\t\t} else if (this.rangeManager.selecting === \"column\") {\n\t\t\t\tthis.setEnd(rowsCount - 1, col);\n\t\t\t} else {\n\t\t\t\tthis.setEnd(row, col);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t_updateMinMax() {\n\t\tthis.top = Math.min(this.start.row, this.end.row);\n\t\tthis.bottom = Math.max(this.start.row, this.end.row);\n\t\tthis.left = Math.min(this.start.col, this.end.col);\n\t\tthis.right = Math.max(this.start.col, this.end.col);\n\t\t\n\t\tif(this.initialized){\n\t\t\tthis.dispatchExternal(\"rangeChanged\", this.getComponent());\n\t\t}else {\n\t\t\tif(this.initializing.start && this.initializing.end){\n\t\t\t\tthis.initialized = true;\n\t\t\t\tthis.dispatchExternal(\"rangeAdded\", this.getComponent());\n\t\t\t}\n\t\t}\n\t}\n\t\n\t_getTableColumns() {\n\t\treturn this.table.columnManager.getVisibleColumnsByIndex();\n\t}\n\t\n\t_getTableRows() {\n\t\treturn this.table.rowManager.getDisplayRows().filter(row=> row.type === \"row\");\n\t}\n\t\n\t///////////////////////////////////\n\t/////// Rendering ///////\n\t///////////////////////////////////\n\t\n\tlayout() {\n\t\tvar _vDomTop = this.table.rowManager.renderer.vDomTop,\n\t\t_vDomBottom = this.table.rowManager.renderer.vDomBottom,\n\t\t_vDomLeft = this.table.columnManager.renderer.leftCol,\n\t\t_vDomRight = this.table.columnManager.renderer.rightCol,\t\t\n\t\ttop, bottom, left, right, topLeftCell, bottomRightCell, topLeftCellEl, bottomRightCellEl, topLeftRowEl, bottomRightRowEl;\n\n\t\tif(this.table.options.renderHorizontal === \"virtual\" && this.rangeManager.rowHeader) {\n\t\t\t_vDomRight += 1;\n\t\t}\n\t\t\n\t\tif (_vDomTop == null) {\n\t\t\t_vDomTop = 0;\n\t\t}\n\t\t\n\t\tif (_vDomBottom == null) {\n\t\t\t_vDomBottom = Infinity;\n\t\t}\n\t\t\n\t\tif (_vDomLeft == null) {\n\t\t\t_vDomLeft = 0;\n\t\t}\n\t\t\n\t\tif (_vDomRight == null) {\n\t\t\t_vDomRight = Infinity;\n\t\t}\n\t\t\n\t\tif (this.overlaps(_vDomLeft, _vDomTop, _vDomRight, _vDomBottom)) {\n\t\t\ttop = Math.max(this.top, _vDomTop);\n\t\t\tbottom = Math.min(this.bottom, _vDomBottom);\n\t\t\tleft = Math.max(this.left, _vDomLeft);\n\t\t\tright = Math.min(this.right, _vDomRight);\n\t\t\t\n\t\t\ttopLeftCell = this.rangeManager.getCell(top, left);\n\t\t\tbottomRightCell = this.rangeManager.getCell(bottom, right);\n\t\t\ttopLeftCellEl = topLeftCell.getElement();\n\t\t\tbottomRightCellEl = bottomRightCell.getElement();\n\t\t\ttopLeftRowEl = topLeftCell.row.getElement();\n\t\t\tbottomRightRowEl = bottomRightCell.row.getElement();\n\t\t\t\n\t\t\tthis.element.classList.add(\"tabulator-range-active\");\n\t\t\t// this.element.classList.toggle(\"tabulator-range-active\", this === this.rangeManager.activeRange);\n\n\t\t\tif(this.table.rtl){\n\t\t\t\tthis.element.style.right = topLeftRowEl.offsetWidth - topLeftCellEl.offsetLeft - topLeftCellEl.offsetWidth + \"px\";\n\t\t\t\tthis.element.style.width = topLeftCellEl.offsetLeft + topLeftCellEl.offsetWidth - bottomRightCellEl.offsetLeft + \"px\";\n\t\t\t}else {\n\t\t\t\tthis.element.style.left = topLeftRowEl.offsetLeft + topLeftCellEl.offsetLeft + \"px\";\n\t\t\t\tthis.element.style.width = bottomRightCellEl.offsetLeft + bottomRightCellEl.offsetWidth - topLeftCellEl.offsetLeft + \"px\";\n\t\t\t}\n\t\t\t\n\t\t\tthis.element.style.top = topLeftRowEl.offsetTop + \"px\";\n\t\t\tthis.element.style.height = bottomRightRowEl.offsetTop + bottomRightRowEl.offsetHeight - topLeftRowEl.offsetTop + \"px\";\n\t\t}\n\t}\n\t\n\tatTopLeft(cell) {\n\t\treturn cell.row.position - 1 === this.top && cell.column.getPosition() - 1 === this.left;\n\t}\n\t\n\tatBottomRight(cell) {\n\t\treturn cell.row.position - 1 === this.bottom && cell.column.getPosition() - 1 === this.right;\n\t}\n\t\n\toccupies(cell) {\n\t\treturn this.occupiesRow(cell.row) && this.occupiesColumn(cell.column);\n\t}\n\t\n\toccupiesRow(row) {\n\t\treturn this.top <= row.position - 1 && row.position - 1 <= this.bottom;\n\t}\n\t\n\toccupiesColumn(col) {\n\t\treturn this.left <= col.getPosition() - 1 && col.getPosition() - 1 <= this.right;\n\t}\n\t\n\toverlaps(left, top, right, bottom) {\n\t\tif ((this.left > right || left > this.right) || (this.top > bottom || top > this.bottom)){\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tgetData() {\n\t\tvar data = [],\n\t\trows = this.getRows(),\n\t\tcolumns = this.getColumns();\n\t\t\n\t\trows.forEach((row) => {\n\t\t\tvar rowData = row.getData(),\n\t\t\tresult = {};\n\t\t\t\n\t\t\tcolumns.forEach((column) => {\n\t\t\t\tresult[column.field] = rowData[column.field];\n\t\t\t});\n\t\t\t\n\t\t\tdata.push(result);\n\t\t});\n\t\t\n\t\treturn data;\n\t}\n\t\n\tgetCells(structured, component) {\n\t\tvar cells = [],\n\t\trows = this.getRows(),\n\t\tcolumns = this.getColumns();\n\t\t\n\t\tif (structured) {\n\t\t\tcells = rows.map((row) => {\n\t\t\t\tvar arr = [];\n\t\t\t\t\n\t\t\t\trow.getCells().forEach((cell) => {\n\t\t\t\t\tif (columns.includes(cell.column)) {\n\t\t\t\t\t\tarr.push(component ? cell.getComponent() : cell);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\treturn arr;\n\t\t\t});\n\t\t} else {\n\t\t\trows.forEach((row) => {\n\t\t\t\trow.getCells().forEach((cell) => {\n\t\t\t\t\tif (columns.includes(cell.column)) {\n\t\t\t\t\t\tcells.push(component ? cell.getComponent() : cell);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\t\n\t\treturn cells;\n\t}\n\t\n\tgetStructuredCells() {\n\t\treturn this.getCells(true, true);\n\t}\n\t\n\tgetRows() {\n\t\treturn this._getTableRows().slice(this.top, this.bottom + 1);\n\t}\n\t\n\tgetColumns() {\n\t\treturn this._getTableColumns().slice(this.left, this.right + 1);\n\t}\n\t\n\tclearValues(){\n\t\tvar cells = this.getCells();\n\t\tvar clearValue = this.table.options.selectableRangeClearCellsValue;\n\t\t\n\t\tthis.table.blockRedraw();\n\t\t\n\t\tcells.forEach((cell) => {\n\t\t\tcell.setValue(clearValue);\n\t\t});\n\t\t\n\t\tthis.table.restoreRedraw();\n\t\t\n\t}\n\t\n\tgetBounds(component){\n\t\tvar cells = this.getCells(false, component),\n\t\toutput = {\n\t\t\tstart:null,\n\t\t\tend:null,\n\t\t};\n\t\t\n\t\tif(cells.length){\n\t\t\toutput.start = cells[0];\n\t\t\toutput.end = cells[cells.length - 1];\n\t\t}else {\n\t\t\tconsole.warn(\"No bounds defined on range\");\n\t\t}\n\t\t\n\t\treturn output;\n\t}\n\t\n\tgetComponent() {\n\t\tif (!this.component) {\n\t\t\tthis.component = new RangeComponent(this);\n\t\t}\n\t\treturn this.component;\n\t}\n\t\n\tdestroy(notify) {\n\t\tthis.destroyed = true;\n\t\t\n\t\tthis.element.remove();\n\t\t\n\t\tif(notify){\n\t\t\tthis.rangeManager.rangeRemoved(this);\n\t\t}\n\t\t\n\t\tif(this.initialized){\n\t\t\tthis.dispatchExternal(\"rangeRemoved\", this.getComponent());\n\t\t}\n\t}\n\t\n\tdestroyedGuard(func){\n\t\tif(this.destroyed){\n\t\t\tconsole.warn(\"You cannot call the \" + func + \" function on a destroyed range\");\n\t\t}\n\t\t\n\t\treturn !this.destroyed;\n\t}\n}\n\nvar bindings = {\r\n\trangeJumpUp:[\"ctrl + 38\", \"meta + 38\"],\r\n\trangeJumpDown:[\"ctrl + 40\", \"meta + 40\"],\r\n\trangeJumpLeft:[\"ctrl + 37\", \"meta + 37\"],\r\n\trangeJumpRight:[\"ctrl + 39\", \"meta + 39\"],\r\n\trangeExpandUp:\"shift + 38\",\r\n\trangeExpandDown:\"shift + 40\",\r\n\trangeExpandLeft:\"shift + 37\",\r\n\trangeExpandRight:\"shift + 39\",\r\n\trangeExpandJumpUp:[\"ctrl + shift + 38\", \"meta + shift + 38\"],\r\n\trangeExpandJumpDown:[\"ctrl + shift + 40\", \"meta + shift + 40\"],\r\n\trangeExpandJumpLeft:[\"ctrl + shift + 37\", \"meta + shift + 37\"],\r\n\trangeExpandJumpRight:[\"ctrl + shift + 39\", \"meta + shift + 39\"],\r\n};\n\nvar actions = {\r\n\trangeJumpLeft: function(e){\r\n\t\tthis.dispatch(\"keybinding-nav-range\", e, \"left\", true, false);\r\n\t},\r\n\trangeJumpRight: function(e){\r\n\t\tthis.dispatch(\"keybinding-nav-range\", e, \"right\", true, false);\r\n\t},\r\n\trangeJumpUp: function(e){\r\n\t\tthis.dispatch(\"keybinding-nav-range\", e, \"up\", true, false);\r\n\t},\r\n\trangeJumpDown: function(e){\r\n\t\tthis.dispatch(\"keybinding-nav-range\", e, \"down\", true, false);\r\n\t},\r\n\trangeExpandLeft: function(e){\r\n\t\tthis.dispatch(\"keybinding-nav-range\", e, \"left\", false, true);\r\n\t},\r\n\trangeExpandRight: function(e){\r\n\t\tthis.dispatch(\"keybinding-nav-range\", e, \"right\", false, true);\r\n\t},\r\n\trangeExpandUp: function(e){\r\n\t\tthis.dispatch(\"keybinding-nav-range\", e, \"up\", false, true);\r\n\t},\r\n\trangeExpandDown: function(e){\r\n\t\tthis.dispatch(\"keybinding-nav-range\", e, \"down\", false, true);\r\n\t},\r\n\trangeExpandJumpLeft: function(e){\r\n\t\tthis.dispatch(\"keybinding-nav-range\", e, \"left\", true, true);\r\n\t},\r\n\trangeExpandJumpRight: function(e){\r\n\t\tthis.dispatch(\"keybinding-nav-range\", e, \"right\", true, true);\r\n\t},\r\n\trangeExpandJumpUp: function(e){\r\n\t\tthis.dispatch(\"keybinding-nav-range\", e, \"up\", true, true);\r\n\t},\r\n\trangeExpandJumpDown: function(e){\r\n\t\tthis.dispatch(\"keybinding-nav-range\", e, \"down\", true, true);\r\n\t},\r\n};\n\nvar pasteActions = {\r\n\trange:function(data){\r\n\t\tvar rows = [],\r\n\t\trange = this.table.modules.selectRange.activeRange,\r\n\t\tsingleCell = false,\r\n\t\tbounds, startCell, startRow, rowWidth, dataLength;\r\n\r\n\t\tdataLength = data.length;\r\n\t\t\r\n\t\tif(range){\r\n\t\t\tbounds = range.getBounds();\r\n\t\t\tstartCell = bounds.start;\r\n\t\t\t\r\n\t\t\tif(bounds.start === bounds.end){\r\n\t\t\t\tsingleCell = true;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif(startCell){\r\n\t\t\t\trows = this.table.rowManager.activeRows.slice();\r\n\t\t\t\tstartRow = rows.indexOf(startCell.row);\r\n\r\n\t\t\t\tif(singleCell){\r\n\t\t\t\t\trowWidth = data.length;\r\n\t\t\t\t}else {\r\n\t\t\t\t\trowWidth = (rows.indexOf(bounds.end.row) - startRow) + 1;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\tif(startRow >-1){\r\n\t\t\t\t\tthis.table.blockRedraw();\r\n\t\t\t\t\t\r\n\t\t\t\t\trows = rows.slice(startRow, startRow + rowWidth);\r\n\t\t\t\t\t\r\n\t\t\t\t\trows.forEach((row, i) => {\r\n\t\t\t\t\t\trow.updateData(data[i % dataLength]);\r\n\t\t\t\t\t});\r\n\t\t\t\t\t\r\n\t\t\t\t\tthis.table.restoreRedraw();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn rows;\r\n\t}\r\n};\n\nvar pasteParsers = {\r\n\trange:function(clipboard){\r\n\t\tvar data = [],\r\n\t\trows = [],\r\n\t\trange = this.table.modules.selectRange.activeRange,\r\n\t\tsingleCell = false,\r\n\t\tbounds, startCell, colWidth, columnMap, startCol;\r\n\t\t\r\n\t\tif(range){\r\n\t\t\tbounds = range.getBounds();\r\n\t\t\tstartCell = bounds.start;\r\n\r\n\t\t\tif(bounds.start === bounds.end){\r\n\t\t\t\tsingleCell = true;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif(startCell){\r\n\t\t\t\t//get data from clipboard into array of columns and rows.\r\n\t\t\t\tclipboard = clipboard.split(\"\\n\");\r\n\t\t\t\t\r\n\t\t\t\tclipboard.forEach(function(row){\r\n\t\t\t\t\tdata.push(row.split(\"\\t\"));\r\n\t\t\t\t});\r\n\t\t\t\t\r\n\t\t\t\tif(data.length){\r\n\t\t\t\t\tcolumnMap = this.table.columnManager.getVisibleColumnsByIndex();\r\n\t\t\t\t\tstartCol = columnMap.indexOf(startCell.column);\r\n\r\n\t\t\t\t\tif(startCol > -1){\r\n\t\t\t\t\t\tif(singleCell){\r\n\t\t\t\t\t\t\tcolWidth = data[0].length;\r\n\t\t\t\t\t\t}else {\r\n\t\t\t\t\t\t\tcolWidth = (columnMap.indexOf(bounds.end.column) - startCol) + 1;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tcolumnMap = columnMap.slice(startCol, startCol + colWidth);\r\n\r\n\t\t\t\t\t\tdata.forEach((item) => {\r\n\t\t\t\t\t\t\tvar row = {};\r\n\t\t\t\t\t\t\tvar itemLength = item.length;\r\n\r\n\t\t\t\t\t\t\tcolumnMap.forEach(function(col, i){\r\n\t\t\t\t\t\t\t\trow[col.field] = item[i % itemLength];\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\trows.push(row);\t\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\treturn rows;\r\n\t\t\t\t\t}\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn false;\r\n\t}\r\n};\n\nvar columnLookups = {\r\n\trange:function(){\r\n\t\tvar columns = this.modules.selectRange.selectedColumns();\r\n\r\n\t\tif(this.columnManager.rowHeader){\r\n\t\t\tcolumns.unshift(this.columnManager.rowHeader);\r\n\t\t}\r\n\r\n\t\treturn columns;\r\n\t},\r\n};\n\nvar rowLookups = {\r\n\trange:function(){\r\n\t\treturn this.modules.selectRange.selectedRows();\r\n\t},\r\n};\n\nvar extensions = {\r\n\tkeybindings:{\r\n\t\tbindings:bindings,\r\n\t\tactions:actions\r\n\t},\r\n\tclipboard:{\r\n\t\tpasteActions:pasteActions,\r\n\t\tpasteParsers:pasteParsers\r\n\t},\r\n\texport:{\r\n\t\tcolumnLookups:columnLookups,\r\n\t\trowLookups:rowLookups,\r\n\t}\r\n};\n\nclass SelectRange extends Module {\n\t\n\tstatic moduleName = \"selectRange\";\n\tstatic moduleInitOrder = 1;\n\tstatic moduleExtensions = extensions;\n\t\n\tconstructor(table) {\n\t\tsuper(table);\n\t\t\n\t\tthis.selecting = \"cell\";\n\t\tthis.mousedown = false;\n\t\tthis.ranges = [];\n\t\tthis.overlay = null;\n\t\tthis.rowHeader = null;\n\t\tthis.layoutChangeTimeout = null;\n\t\tthis.columnSelection = false;\n\t\tthis.rowSelection = false;\n\t\tthis.maxRanges = 0;\n\t\tthis.activeRange = false;\n\t\tthis.blockKeydown = false;\n\t\t\n\t\tthis.keyDownEvent = this._handleKeyDown.bind(this);\n\t\tthis.mouseUpEvent = this._handleMouseUp.bind(this);\n\t\t\n\t\tthis.registerTableOption(\"selectableRange\", false); //enable selectable range\n\t\tthis.registerTableOption(\"selectableRangeColumns\", false); //enable selectable range\n\t\tthis.registerTableOption(\"selectableRangeRows\", false); //enable selectable range\n\t\tthis.registerTableOption(\"selectableRangeClearCells\", false); //allow clearing of active range\n\t\tthis.registerTableOption(\"selectableRangeClearCellsValue\", undefined); //value for cleared active range\n\t\tthis.registerTableOption(\"selectableRangeAutoFocus\", true); //focus on a cell after resetRanges\n\t\t\n\t\tthis.registerTableFunction(\"getRangesData\", this.getRangesData.bind(this));\n\t\tthis.registerTableFunction(\"getRanges\", this.getRanges.bind(this));\n\t\tthis.registerTableFunction(\"addRange\", this.addRangeFromComponent.bind(this));\n\t\t\n\t\tthis.registerComponentFunction(\"cell\", \"getRanges\", this.cellGetRanges.bind(this));\n\t\tthis.registerComponentFunction(\"row\", \"getRanges\", this.rowGetRanges.bind(this));\n\t\tthis.registerComponentFunction(\"column\", \"getRanges\", this.colGetRanges.bind(this));\n\t}\n\t\n\t///////////////////////////////////\n\t/////// Initialization ///////\n\t///////////////////////////////////\n\t\n\tinitialize() {\n\t\tif (this.options(\"selectableRange\")) {\t\n\t\t\tif(!this.options(\"selectableRows\")){\n\t\t\t\tthis.maxRanges = this.options(\"selectableRange\");\n\t\t\t\t\n\t\t\t\tthis.initializeTable();\n\t\t\t\tthis.initializeWatchers();\n\t\t\t}else {\n\t\t\t\tconsole.warn(\"SelectRange functionality cannot be used in conjunction with row selection\");\n\t\t\t}\n\n\t\t\tif(this.options('columns').findIndex((column) => column.frozen) > 0) {\n\t\t\t\tconsole.warn(\"Having frozen column in arbitrary position with selectRange option may result in unpredictable behavior.\");\n\t\t\t}\n\n\t\t\tif(this.options('columns').filter((column) => column.frozen) > 1) {\n\t\t\t\tconsole.warn(\"Having multiple frozen columns with selectRange option may result in unpredictable behavior.\");\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\tinitializeTable() {\t\t\n\t\tthis.overlay = document.createElement(\"div\");\n\t\tthis.overlay.classList.add(\"tabulator-range-overlay\");\n\t\t\n\t\tthis.rangeContainer = document.createElement(\"div\");\n\t\tthis.rangeContainer.classList.add(\"tabulator-range-container\");\n\t\t\n\t\tthis.activeRangeCellElement = document.createElement(\"div\");\n\t\tthis.activeRangeCellElement.classList.add(\"tabulator-range-cell-active\");\n\t\t\n\t\tthis.overlay.appendChild(this.rangeContainer);\n\t\tthis.overlay.appendChild(this.activeRangeCellElement);\n\t\t\n\t\tthis.table.rowManager.element.addEventListener(\"keydown\", this.keyDownEvent);\n\t\t\n\t\tthis.resetRanges();\n\t\t\n\t\tthis.table.rowManager.element.appendChild(this.overlay);\n\t\tthis.table.columnManager.element.setAttribute(\"tabindex\", 0);\n\t\tthis.table.element.classList.add(\"tabulator-ranges\");\n\t}\n\t\n\tinitializeWatchers() {\n\t\tthis.columnSelection = this.options(\"selectableRangeColumns\");\n\t\tthis.rowSelection = this.options(\"selectableRangeRows\");\n\t\t\n\t\tthis.subscribe(\"column-init\", this.initializeColumn.bind(this));\n\t\tthis.subscribe(\"column-mousedown\", this.handleColumnMouseDown.bind(this));\n\t\tthis.subscribe(\"column-mousemove\", this.handleColumnMouseMove.bind(this));\n\t\tthis.subscribe(\"column-resized\", this.handleColumnResized.bind(this));\n\t\tthis.subscribe(\"column-moving\", this.handleColumnMoving.bind(this));\n\t\tthis.subscribe(\"column-moved\", this.handleColumnMoved.bind(this));\n\t\tthis.subscribe(\"column-width\", this.layoutChange.bind(this));\n\t\tthis.subscribe(\"column-height\", this.layoutChange.bind(this));\n\t\tthis.subscribe(\"column-resized\", this.layoutChange.bind(this));\n\t\tthis.subscribe(\"columns-loaded\", this.updateHeaderColumn.bind(this));\n\t\t\n\t\tthis.subscribe(\"cell-height\", this.layoutChange.bind(this));\n\t\tthis.subscribe(\"cell-rendered\", this.renderCell.bind(this));\n\t\tthis.subscribe(\"cell-mousedown\", this.handleCellMouseDown.bind(this));\n\t\tthis.subscribe(\"cell-mousemove\", this.handleCellMouseMove.bind(this));\n\t\tthis.subscribe(\"cell-click\", this.handleCellClick.bind(this));\n\t\tthis.subscribe(\"cell-editing\", this.handleEditingCell.bind(this));\n\t\t\n\t\tthis.subscribe(\"page-changed\", this.redraw.bind(this));\n\t\t\n\t\tthis.subscribe(\"scroll-vertical\", this.layoutChange.bind(this));\n\t\tthis.subscribe(\"scroll-horizontal\", this.layoutChange.bind(this));\n\t\t\n\t\tthis.subscribe(\"data-destroy\", this.tableDestroyed.bind(this));\n\t\tthis.subscribe(\"data-processed\", this.resetRanges.bind(this));\n\t\t\n\t\tthis.subscribe(\"table-layout\", this.layoutElement.bind(this));\n\t\tthis.subscribe(\"table-redraw\", this.redraw.bind(this));\n\t\tthis.subscribe(\"table-destroy\", this.tableDestroyed.bind(this));\n\t\t\n\t\tthis.subscribe(\"edit-editor-clear\", this.finishEditingCell.bind(this));\n\t\tthis.subscribe(\"edit-blur\", this.restoreFocus.bind(this));\n\t\t\n\t\tthis.subscribe(\"keybinding-nav-prev\", this.keyNavigate.bind(this, \"left\"));\n\t\tthis.subscribe(\"keybinding-nav-next\", this.keyNavigate.bind(this, \"right\"));\n\t\tthis.subscribe(\"keybinding-nav-left\", this.keyNavigate.bind(this, \"left\"));\n\t\tthis.subscribe(\"keybinding-nav-right\", this.keyNavigate.bind(this, \"right\"));\n\t\tthis.subscribe(\"keybinding-nav-up\", this.keyNavigate.bind(this, \"up\"));\n\t\tthis.subscribe(\"keybinding-nav-down\", this.keyNavigate.bind(this, \"down\"));\n\t\tthis.subscribe(\"keybinding-nav-range\", this.keyNavigateRange.bind(this));\n\t}\n\t\n\t\n\tinitializeColumn(column) {\n\t\tif(this.columnSelection && column.definition.headerSort && this.options(\"headerSortClickElement\") !== \"icon\"){\n\t\t\tconsole.warn(\"Using column headerSort with selectableRangeColumns option may result in unpredictable behavior. Consider using headerSortClickElement: 'icon'.\");\n\t\t}\n\t\t\n\t\tif (column.modules.edit) ;\n\t}\n\t\n\tupdateHeaderColumn(){\n\t\tvar frozenCols;\n\n\t\tif(this.rowSelection){\n\t\t\tthis.rowHeader = this.table.columnManager.getVisibleColumnsByIndex()[0];\n\t\t\t\n\t\t\tif(this.rowHeader){\n\t\t\t\tthis.rowHeader.definition.cssClass = this.rowHeader.definition.cssClass + \" tabulator-range-row-header\";\n\t\t\t\t\n\t\t\t\tif(this.rowHeader.definition.headerSort){\n\t\t\t\t\tconsole.warn(\"Using column headerSort with selectableRangeRows option may result in unpredictable behavior\");\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(this.rowHeader.definition.editor){\n\t\t\t\t\tconsole.warn(\"Using column editor with selectableRangeRows option may result in unpredictable behavior\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//warn if invalid frozen column configuration detected\n\t\tif(this.table.modules.frozenColumns && this.table.modules.frozenColumns.active){\n\t\t\tfrozenCols = this.table.modules.frozenColumns.getFrozenColumns();\n\n\t\t\tif(frozenCols.length > 1 || (frozenCols.length === 1 && frozenCols[0] !== this.rowHeader)){\n\t\t\t\tconsole.warn(\"Using frozen columns that are not the range header in combination with the selectRange option may result in unpredictable behavior\");\n\t\t\t}\n\t\t}\n\t}\n\t\n\t///////////////////////////////////\n\t/////// Table Functions ///////\n\t///////////////////////////////////\n\t\n\tgetRanges(){\n\t\treturn this.ranges.map((range) => range.getComponent());\n\t}\n\t\n\tgetRangesData() {\n\t\treturn this.ranges.map((range) => range.getData());\n\t}\n\t\n\taddRangeFromComponent(start, end){\n\t\tstart = start ? start._cell : null;\n\t\tend = end ? end._cell : null;\n\t\t\n\t\treturn this.addRange(start, end);\n\t}\n\t\n\t///////////////////////////////////\n\t/////// Component Functions ///////\n\t///////////////////////////////////\n\t\n\tcellGetRanges(cell){\n\t\tvar ranges = [];\n\t\t\n\t\tif (cell.column === this.rowHeader) {\n\t\t\tranges = this.ranges.filter((range) => range.occupiesRow(cell.row));\n\t\t} else {\n\t\t\tranges = this.ranges.filter((range) => range.occupies(cell));\n\t\t}\n\t\t\n\t\treturn ranges.map((range) => range.getComponent());\n\t}\n\t\n\trowGetRanges(row){\n\t\tvar ranges = this.ranges.filter((range) => range.occupiesRow(row));\n\t\t\n\t\treturn ranges.map((range) => range.getComponent());\n\t}\n\t\n\tcolGetRanges(col){\n\t\tvar ranges = this.ranges.filter((range) => range.occupiesColumn(col));\n\t\t\n\t\treturn ranges.map((range) => range.getComponent());\n\t}\n\t\n\t///////////////////////////////////\n\t////////// Event Handlers /////////\n\t///////////////////////////////////\n\t\n\t_handleMouseUp(e){\n\t\tthis.mousedown = false;\n\t\tdocument.removeEventListener(\"mouseup\", this.mouseUpEvent);\n\t}\n\t\n\t_handleKeyDown(e) {\n\t\tif (!this.blockKeydown && (!this.table.modules.edit || (this.table.modules.edit && !this.table.modules.edit.currentCell))) {\n\t\t\tif (e.key === \"Enter\") {\n\t\t\t\t// is editing a cell?\n\t\t\t\tif (this.table.modules.edit && this.table.modules.edit.currentCell) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.table.modules.edit.editCell(this.getActiveCell());\n\t\t\t\t\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t\t\n\t\t\tif ((e.key === \"Backspace\" || e.key === \"Delete\") && this.options(\"selectableRangeClearCells\")) {\n\t\t\t\tif(this.activeRange){\n\t\t\t\t\tthis.activeRange.clearValues();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tinitializeFocus(cell){\n\t\tvar range;\n\n\t\tthis.restoreFocus();\n\t\t\n\t\ttry{\n\t\t\tif (document.selection) { // IE\n\t\t\t\trange = document.body.createTextRange();\n\t\t\t\trange.moveToElementText(cell.getElement());\n\t\t\t\trange.select();\n\t\t\t} else if (window.getSelection) {\n\t\t\t\trange = document.createRange();\n\t\t\t\trange.selectNode(cell.getElement());\n\t\t\t\twindow.getSelection().removeAllRanges();\n\t\t\t\twindow.getSelection().addRange(range);\n\t\t\t}\n\t\t}catch(e){}\n\t}\n\t\n\trestoreFocus(element){\n\t\tthis.table.rowManager.element.focus();\n\t\t\n\t\treturn true;\n\t}\n\t\n\t///////////////////////////////////\n\t////// Column Functionality ///////\n\t///////////////////////////////////\n\t\n\thandleColumnResized(column) {\n\t\tvar selected;\n\t\t\n\t\tif (this.selecting !== \"column\" && this.selecting !== \"all\") {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tselected = this.ranges.some((range) => range.occupiesColumn(column));\n\t\t\n\t\tif (!selected) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tthis.ranges.forEach((range) => {\n\t\t\tvar selectedColumns = range.getColumns(true);\n\t\t\t\n\t\t\tselectedColumns.forEach((selectedColumn) => {\n\t\t\t\tif (selectedColumn !== column) {\n\t\t\t\t\tselectedColumn.setWidth(column.width);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\t\n\thandleColumnMoving(_event, column) {\n\t\tthis.resetRanges().setBounds(column);\n\t\tthis.overlay.style.visibility = \"hidden\";\n\t}\n\n\thandleColumnMoved(from, _to, _after) {\n\t\tthis.activeRange.setBounds(from);\n\t\tthis.layoutElement();\n\t}\n\n\thandleColumnMouseDown(event, column) {\n\t\tif (event.button === 2 && (this.selecting === \"column\" || this.selecting === \"all\") && this.activeRange.occupiesColumn(column)) {\n\t\t\treturn;\n\t\t}\n\n\t\t//If columns are movable, allow dragging columns only if they are not\n\t\t//selected. Dragging selected columns should move the columns instead.\n\t\tif(this.table.options.movableColumns && this.selecting === \"column\" && this.activeRange.occupiesColumn(column)){\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tthis.mousedown = true;\n\t\t\n\t\tdocument.addEventListener(\"mouseup\", this.mouseUpEvent);\n\t\t\n\t\tthis.newSelection(event, column);\n\t}\n\t\n\thandleColumnMouseMove(e, column) {\n\t\tif (column === this.rowHeader || !this.mousedown || this.selecting === 'all') {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tthis.activeRange.setBounds(false, column, true);\n\t}\n\t\n\t///////////////////////////////////\n\t//////// Cell Functionality ///////\n\t///////////////////////////////////\n\t\n\trenderCell(cell) {\n\t\tvar el = cell.getElement(),\n\t\trangeIdx = this.ranges.findIndex((range) => range.occupies(cell));\n\t\t\n\t\tel.classList.toggle(\"tabulator-range-selected\", rangeIdx !== -1);\n\t\tel.classList.toggle(\"tabulator-range-only-cell-selected\", this.ranges.length === 1 && this.ranges[0].atTopLeft(cell) &&\tthis.ranges[0].atBottomRight(cell));\n\t\t\n\t\tel.dataset.range = rangeIdx;\n\t}\n\t\n\thandleCellMouseDown(event, cell) {\n\t\tif (event.button === 2 && (this.activeRange.occupies(cell) || ((this.selecting === \"row\" || this.selecting === \"all\") && this.activeRange.occupiesRow(cell.row)))) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tthis.mousedown = true;\n\t\t\n\t\tdocument.addEventListener(\"mouseup\", this.mouseUpEvent);\n\t\t\n\t\tthis.newSelection(event, cell);\n\t}\n\t\n\thandleCellMouseMove(e, cell) {\n\t\tif (!this.mousedown || this.selecting === \"all\") {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tthis.activeRange.setBounds(false, cell, true);\n\t}\n\t\n\thandleCellClick(e, cell){\n\t\tthis.initializeFocus(cell);\n\t}\n\t\n\thandleEditingCell(cell) {\n\t\tif(this.activeRange){\n\t\t\tthis.activeRange.setBounds(cell);\n\t\t}\n\t}\n\t\n\tfinishEditingCell() {\n\t\tthis.blockKeydown = true;\n\t\tthis.table.rowManager.element.focus();\n\t\t\n\t\tsetTimeout(() => {\n\t\t\tthis.blockKeydown = false;\n\t\t}, 10);\n\t}\n\t\n\t///////////////////////////////////\n\t/////// Navigation ///////\n\t///////////////////////////////////\n\t\n\tkeyNavigate(dir, e){\n\t\tif(this.navigate(false, false, dir));\n\t\te.preventDefault();\n\t}\n\t\n\tkeyNavigateRange(e, dir, jump, expand){\n\t\tif(this.navigate(jump, expand, dir));\n\t\te.preventDefault();\n\t}\n\t\n\tnavigate(jump, expand, dir) {\n\t\tvar moved = false,\n\t\trange, rangeEdge, prevRect, nextRow, nextCol, row, column,\n\t\trowRect, rowManagerRect, columnRect, columnManagerRect;\n\t\t\n\t\t// Don't navigate while editing\n\t\tif (this.table.modules.edit && this.table.modules.edit.currentCell) {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\t// If there are more than 1 range, use the active range and destroy the others\n\t\tif (this.ranges.length > 1) {\n\t\t\tthis.ranges = this.ranges.filter((range) => {\n\t\t\t\tif (range === this.activeRange) {\n\t\t\t\t\trange.setEnd(range.start.row, range.start.col);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\trange.destroy();\n\t\t\t\treturn false;\n\t\t\t});\n\t\t}\n\t\t\n\t\trange = this.activeRange;\n\t\tprevRect = {\n\t\t\ttop: range.top,\n\t\t\tbottom: range.bottom,\n\t\t\tleft: range.left,\n\t\t\tright: range.right\n\t\t};\n\t\t\n\t\trangeEdge = expand ? range.end : range.start;\n\t\tnextRow = rangeEdge.row;\n\t\tnextCol = rangeEdge.col;\n\t\t\n\t\tif(jump){\n\t\t\tswitch(dir){\n\t\t\t\tcase \"left\":\n\t\t\t\t\tnextCol = this.findJumpCellLeft(range.start.row, rangeEdge.col);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"right\":\n\t\t\t\t\tnextCol = this.findJumpCellRight(range.start.row, rangeEdge.col);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"up\":\n\t\t\t\t\tnextRow = this.findJumpCellUp(rangeEdge.row, range.start.col);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"down\":\n\t\t\t\t\tnextRow = this.findJumpCellDown(rangeEdge.row, range.start.col);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}else {\n\t\t\tif(expand){\n\t\t\t\tif ((this.selecting === 'row' && (dir === 'left' || dir === 'right')) || (this.selecting === 'column' && (dir === 'up' || dir === 'down'))) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tswitch(dir){\n\t\t\t\tcase \"left\":\n\t\t\t\t\tnextCol = Math.max(nextCol - 1, 0);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"right\":\n\t\t\t\t\tnextCol = Math.min(nextCol + 1, this.getTableColumns().length - 1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"up\":\n\t\t\t\t\tnextRow = Math.max(nextRow - 1, 0);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"down\":\n\t\t\t\t\tnextRow = Math.min(nextRow + 1, this.getTableRows().length - 1);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif(this.rowHeader && nextCol === 0) {\n\t\t\tnextCol = 1;\n\t\t}\n\t\t\n\t\tif(!expand){\n\t\t\trange.setStart(nextRow, nextCol);\n\t\t}\n\t\t\n\t\trange.setEnd(nextRow, nextCol);\n\t\t\n\t\tif(!expand){\n\t\t\tthis.selecting = \"cell\";\n\t\t}\n\n\t\tmoved = prevRect.top !== range.top || prevRect.bottom !== range.bottom || prevRect.left !== range.left || prevRect.right !== range.right;\n\n\t\tif (moved) {\n\t\t\trow = this.getRowByRangePos(range.end.row);\n\t\t\tcolumn = this.getColumnByRangePos(range.end.col);\n\t\t\trowRect = row.getElement().getBoundingClientRect();\n\t\t\tcolumnRect = column.getElement().getBoundingClientRect();\n\t\t\trowManagerRect = this.table.rowManager.getElement().getBoundingClientRect();\n\t\t\tcolumnManagerRect = this.table.columnManager.getElement().getBoundingClientRect();\n\t\t\t\n\t\t\tif(!(rowRect.top >= rowManagerRect.top && rowRect.bottom <= rowManagerRect.bottom)){\n\t\t\t\tif(row.getElement().parentNode && column.getElement().parentNode){\n\t\t\t\t\t// Use faster autoScroll when the elements are on the DOM\n\t\t\t\t\tthis.autoScroll(range, row.getElement(), column.getElement());\n\t\t\t\t}else {\n\t\t\t\t\trow.getComponent().scrollTo(undefined, false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!(columnRect.left >= columnManagerRect.left + this.getRowHeaderWidth() && columnRect.right <= columnManagerRect.right)){\n\t\t\t\tif(row.getElement().parentNode && column.getElement().parentNode){\n\t\t\t\t\t// Use faster autoScroll when the elements are on the DOM\n\t\t\t\t\tthis.autoScroll(range, row.getElement(), column.getElement());\n\t\t\t\t}else {\n\t\t\t\t\tcolumn.getComponent().scrollTo(undefined, false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.layoutElement();\n\t\t\t\n\t\t\treturn true;\n\t\t}\n\t}\n\t\n\trangeRemoved(removed){\n\t\tthis.ranges = this.ranges.filter((range) => range !== removed);\n\t\t\n\t\tif(this.activeRange === removed){\n\t\t\tif(this.ranges.length){\n\t\t\t\tthis.activeRange = this.ranges[this.ranges.length - 1];\n\t\t\t}else {\n\t\t\t\tthis.addRange();\n\t\t\t}\n\t\t}\n\t\t\n\t\tthis.layoutElement();\n\t}\n\t\n\tfindJumpRow(column, rows, reverse, emptyStart, emptySide){\n\t\tif(reverse){\n\t\t\trows = rows.reverse();\n\t\t}\n\n\t\treturn this.findJumpItem(emptyStart, emptySide, rows, function(row){return row.getData()[column.getField()];});\n\t}\n\t\n\tfindJumpCol(row, columns, reverse, emptyStart, emptySide){\n\t\tif(reverse){\n\t\t\tcolumns = columns.reverse();\n\t\t}\n\n\t\treturn this.findJumpItem(emptyStart, emptySide, columns, function(column){return row.getData()[column.getField()];});\n\t}\n\n\tfindJumpItem(emptyStart, emptySide, items, valueResolver){\n\t\tvar nextItem;\n\n\t\tfor(let currentItem of items){\n\t\t\tlet currentValue = valueResolver(currentItem);\n\t\t\t\n\t\t\tif(emptyStart){\n\t\t\t\tnextItem = currentItem;\n\t\t\t\tif(currentValue){\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tif(emptySide){\n\t\t\t\t\tnextItem = currentItem;\n\t\t\t\t\t\n\t\t\t\t\tif(currentValue){\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}else {\n\t\t\t\t\tif(currentValue){\n\t\t\t\t\t\tnextItem = currentItem;\n\t\t\t\t\t}else {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn nextItem;\n\t}\n\n\tfindJumpCellLeft(rowPos, colPos){\n\t\tvar row = this.getRowByRangePos(rowPos),\n\t\tcolumns = this.getTableColumns(),\n\t\tisStartingCellEmpty = this.isEmpty(row.getData()[columns[colPos].getField()]),\n\t\tisLeftOfStartingCellEmpty = columns[colPos - 1] ? this.isEmpty(row.getData()[columns[colPos - 1].getField()]) : false,\n\t\ttargetCols = this.rowHeader ? columns.slice(1, colPos) : columns.slice(0, colPos),\n\t\tjumpCol = this.findJumpCol(row, targetCols, true, isStartingCellEmpty, isLeftOfStartingCellEmpty);\n\t\t\n\t\tif(jumpCol){\n\t\t\treturn jumpCol.getPosition() - 1;\n\t\t}\n\t\t\n\t\treturn colPos;\n\t}\n\t\n\tfindJumpCellRight(rowPos, colPos){\n\t\tvar row = this.getRowByRangePos(rowPos),\n\t\tcolumns = this.getTableColumns(),\n\t\tisStartingCellEmpty = this.isEmpty(row.getData()[columns[colPos].getField()]),\n\t\tisRightOfStartingCellEmpty = columns[colPos + 1] ? this.isEmpty(row.getData()[columns[colPos + 1].getField()]) : false,\n\t\tjumpCol = this.findJumpCol(row, columns.slice(colPos + 1, columns.length), false, isStartingCellEmpty, isRightOfStartingCellEmpty);\n\t\t\n\t\tif(jumpCol){\n\t\t\treturn jumpCol.getPosition() - 1;\n\t\t}\n\t\t\n\t\treturn colPos;\n\t}\n\t\n\tfindJumpCellUp(rowPos, colPos) {\n\t\tvar column = this.getColumnByRangePos(colPos),\n\t\trows = this.getTableRows(),\n\t\tisStartingCellEmpty = this.isEmpty(rows[rowPos].getData()[column.getField()]),\n\t\tisTopOfStartingCellEmpty = rows[rowPos - 1] ? this.isEmpty(rows[rowPos - 1].getData()[column.getField()]) : false,\n\t\tjumpRow = this.findJumpRow(column, rows.slice(0, rowPos), true, isStartingCellEmpty, isTopOfStartingCellEmpty);\n\t\t\n\t\tif(jumpRow){\n\t\t\treturn jumpRow.position - 1;\n\t\t}\n\t\t\n\t\treturn rowPos;\n\t}\n\t\n\tfindJumpCellDown(rowPos, colPos) {\n\t\tvar column = this.getColumnByRangePos(colPos),\n\t\trows = this.getTableRows(),\n\t\tisStartingCellEmpty = this.isEmpty(rows[rowPos].getData()[column.getField()]),\n\t\tisBottomOfStartingCellEmpty = rows[rowPos + 1] ? this.isEmpty(rows[rowPos + 1].getData()[column.getField()]) : false,\n\t\tjumpRow = this.findJumpRow(column, rows.slice(rowPos + 1, rows.length), false, isStartingCellEmpty, isBottomOfStartingCellEmpty);\n\t\t\n\t\tif(jumpRow){\n\t\t\treturn jumpRow.position - 1;\n\t\t}\n\t\t\n\t\treturn rowPos;\n\t}\n\t\n\t///////////////////////////////////\n\t/////// Selection ///////\n\t///////////////////////////////////\n\tnewSelection(event, element) {\n\t\tvar range;\n\t\t\n\t\tif (element.type === \"column\") {\n\t\t\tif(!this.columnSelection){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (element === this.rowHeader) {\n\t\t\t\trange = this.resetRanges();\n\t\t\t\tthis.selecting = \"all\";\n\t\t\t\t\n\t\t\t\tvar topLeftCell, bottomRightCell = this.getCell(-1, -1);\n\t\t\t\t\n\t\t\t\tif(this.rowHeader){\n\t\t\t\t\ttopLeftCell = this.getCell(0, 1);\n\t\t\t\t}else {\n\t\t\t\t\ttopLeftCell = this.getCell(0, 0);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\trange.setBounds(topLeftCell, bottomRightCell);\t\t\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tthis.selecting = \"column\";\n\t\t\t}\n\t\t} else if (element.column === this.rowHeader) {\n\t\t\tthis.selecting = \"row\";\n\t\t} else {\n\t\t\tthis.selecting = \"cell\";\n\t\t}\n\t\t\n\t\tif (event.shiftKey) {\n\t\t\tthis.activeRange.setBounds(false, element);\n\t\t} else if (event.ctrlKey) {\n\t\t\tthis.addRange().setBounds(element);\n\t\t} else {\n\t\t\tthis.resetRanges().setBounds(element);\n\t\t}\n\t}\n\t\n\tautoScroll(range, row, column) {\n\t\tvar tableHolder = this.table.rowManager.element,\n\t\trect, view, withinHorizontalView, withinVerticalView;\n\t\t\n\t\tif (typeof row === 'undefined') {\n\t\t\trow = this.getRowByRangePos(range.end.row).getElement();\n\t\t}\n\t\t\n\t\tif (typeof column === 'undefined') {\n\t\t\tcolumn = this.getColumnByRangePos(range.end.col).getElement();\n\t\t}\n\t\t\n\t\trect = {\n\t\t\tleft: column.offsetLeft,\n\t\t\tright: column.offsetLeft + column.offsetWidth,\n\t\t\ttop: row.offsetTop,\n\t\t\tbottom: row.offsetTop + row.offsetHeight,\n\t\t};\n\t\t\n\t\tview = {\n\t\t\tleft: tableHolder.scrollLeft + this.getRowHeaderWidth(),\n\t\t\tright: Math.ceil(tableHolder.scrollLeft + tableHolder.clientWidth),\n\t\t\ttop: tableHolder.scrollTop,\n\t\t\tbottom:\ttableHolder.scrollTop +\ttableHolder.offsetHeight - this.table.rowManager.scrollbarWidth,\n\t\t};\n\t\t\n\t\twithinHorizontalView = view.left < rect.left &&\trect.left < view.right && view.left < rect.right &&\trect.right < view.right;\n\t\t\n\t\twithinVerticalView = view.top < rect.top &&\trect.top < view.bottom && view.top < rect.bottom &&\trect.bottom < view.bottom;\n\t\t\n\t\tif (!withinHorizontalView) {\n\t\t\tif (rect.left < view.left) {\n\t\t\t\ttableHolder.scrollLeft = rect.left - this.getRowHeaderWidth();\n\t\t\t} else if (rect.right > view.right) {\n\t\t\t\ttableHolder.scrollLeft = Math.min(rect.right - tableHolder.clientWidth, rect.left - this.getRowHeaderWidth());\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (!withinVerticalView) {\n\t\t\tif (rect.top < view.top) {\n\t\t\t\ttableHolder.scrollTop = rect.top;\n\t\t\t} else if (rect.bottom > view.bottom) {\n\t\t\t\ttableHolder.scrollTop = rect.bottom - tableHolder.clientHeight;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t///////////////////////////////////\n\t/////// Layout ///////\n\t///////////////////////////////////\n\t\n\tlayoutChange(){\n\t\tthis.overlay.style.visibility = \"hidden\";\n\t\tclearTimeout(this.layoutChangeTimeout);\n\t\tthis.layoutChangeTimeout = setTimeout(this.layoutRanges.bind(this), 200);\n\t}\n\t\n\tredraw(force) {\n\t\tif (force) {\n\t\t\tthis.selecting = 'cell';\n\t\t\tthis.resetRanges();\n\t\t\tthis.layoutElement();\n\t\t}\n\t}\n\t\n\tlayoutElement(visibleRows) {\n\t\tvar rows;\n\t\t\n\t\tif (visibleRows) {\n\t\t\trows = this.table.rowManager.getVisibleRows(true);\n\t\t} else {\n\t\t\trows = this.table.rowManager.getRows();\n\t\t}\n\t\t\n\t\trows.forEach((row) => {\n\t\t\tif (row.type === \"row\") {\n\t\t\t\tthis.layoutRow(row);\n\t\t\t\trow.cells.forEach((cell) => this.renderCell(cell));\n\t\t\t}\n\t\t});\n\t\t\n\t\tthis.getTableColumns().forEach((column) => {\n\t\t\tthis.layoutColumn(column);\n\t\t});\n\t\t\n\t\tthis.layoutRanges();\n\t}\n\t\n\tlayoutRow(row) {\n\t\tvar el = row.getElement(),\n\t\tselected = false,\n\t\toccupied = this.ranges.some((range) => range.occupiesRow(row));\n\t\t\n\t\tif (this.selecting === \"row\") {\n\t\t\tselected = occupied;\n\t\t} else if (this.selecting === \"all\") {\n\t\t\tselected = true;\n\t\t}\n\t\t\n\t\tel.classList.toggle(\"tabulator-range-selected\", selected);\n\t\tel.classList.toggle(\"tabulator-range-highlight\", occupied);\n\t}\n\t\n\tlayoutColumn(column) {\n\t\tvar el = column.getElement(),\t\t\n\t\tselected = false,\n\t\toccupied = this.ranges.some((range) => range.occupiesColumn(column));\n\t\t\n\t\tif (this.selecting === \"column\") {\n\t\t\tselected = occupied;\n\t\t} else if (this.selecting === \"all\") {\n\t\t\tselected = true;\n\t\t}\n\t\t\n\t\tel.classList.toggle(\"tabulator-range-selected\", selected);\n\t\tel.classList.toggle(\"tabulator-range-highlight\", occupied);\n\t}\n\t\n\tlayoutRanges() {\n\t\tvar activeCell, activeCellEl, activeRowEl;\n\t\t\n\t\tif (!this.table.initialized) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tactiveCell = this.getActiveCell();\n\t\t\n\t\tif (!activeCell) {\n\t\t\treturn;\n\t\t}\n\n\t\tactiveCellEl = activeCell.getElement();\n\t\tactiveRowEl = activeCell.row.getElement();\n\n\t\tif(this.table.rtl){\n\t\t\tthis.activeRangeCellElement.style.right = activeRowEl.offsetWidth - activeCellEl.offsetLeft - activeCellEl.offsetWidth + \"px\";\n\t\t}else {\n\t\t\tthis.activeRangeCellElement.style.left = activeRowEl.offsetLeft + activeCellEl.offsetLeft + \"px\";\n\t\t}\n\n\t\tthis.activeRangeCellElement.style.top =\tactiveRowEl.offsetTop + \"px\";\n\t\tthis.activeRangeCellElement.style.width = activeCellEl.offsetWidth + \"px\";\n\t\tthis.activeRangeCellElement.style.height = activeRowEl.offsetHeight + \"px\";\n\t\t\n\t\tthis.ranges.forEach((range) => range.layout());\n\t\t\n\t\tthis.overlay.style.visibility = \"visible\";\n\t}\n\t\n\t\n\t///////////////////////////////////\n\t/////// Helper Functions ///////\n\t///////////////////////////////////\t\n\t\n\tgetCell(rowIdx, colIdx) {\n\t\tvar row;\n\t\t\n\t\tif (colIdx < 0) {\n\t\t\tcolIdx = this.getTableColumns().length + colIdx;\n\t\t\tif (colIdx < 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (rowIdx < 0) {\n\t\t\trowIdx = this.getTableRows().length + rowIdx;\n\t\t}\n\t\t\n\t\trow = this.table.rowManager.getRowFromPosition(rowIdx + 1);\n\t\t\n\t\treturn row ? row.getCells(false, true).filter((cell) => cell.column.visible)[colIdx] : null;\n\t}\n\t\n\t\n\tgetActiveCell() {\n\t\treturn this.getCell(this.activeRange.start.row, this.activeRange.start.col);\n\t}\n\t\n\tgetRowByRangePos(pos) {\n\t\treturn this.getTableRows()[pos];\n\t}\n\t\n\tgetColumnByRangePos(pos) {\n\t\treturn this.getTableColumns()[pos];\n\t}\n\t\n\tgetTableRows() {\n\t\treturn this.table.rowManager.getDisplayRows().filter(row=> row.type === \"row\");\n\t}\n\t\n\tgetTableColumns() {\n\t\treturn this.table.columnManager.getVisibleColumnsByIndex();\n\t}\n\t\n\taddRange(start, end) {\n\t\tvar range;\n\t\t\n\t\tif(this.maxRanges !== true && this.ranges.length >= this.maxRanges){\n\t\t\tthis.ranges.shift().destroy();\n\t\t}\n\t\t\n\t\trange = new Range(this.table, this, start, end);\n\t\t\n\t\tthis.activeRange = range;\n\t\tthis.ranges.push(range);\n\t\tthis.rangeContainer.appendChild(range.element);\n\t\t\n\t\treturn range;\n\t}\n\t\n\tresetRanges() {\n\t\tvar range, cell, visibleCells;\n\t\t\n\t\tthis.ranges.forEach((range) => range.destroy());\n\t\tthis.ranges = [];\n\t\t\n\t\trange = this.addRange();\n\t\t\n\t\tif(this.table.rowManager.activeRows.length){\n\t\t\tvisibleCells = this.table.rowManager.activeRows[0].cells.filter((cell) => cell.column.visible);\n\t\t\tcell = visibleCells[this.rowHeader ? 1 : 0];\n\n\t\t\tif(cell){\n\t\t\t\trange.setBounds(cell);\n\t\t\t\tif(this.options(\"selectableRangeAutoFocus\")){\n\t\t\t\t\tthis.initializeFocus(cell);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn range;\n\t}\n\t\n\ttableDestroyed(){\n\t\tdocument.removeEventListener(\"mouseup\", this.mouseUpEvent);\n\t\tthis.table.rowManager.element.removeEventListener(\"keydown\", this.keyDownEvent);\n\t}\n\t\n\tselectedRows(component) {\n\t\treturn component ? this.activeRange.getRows().map((row) => row.getComponent()) : this.activeRange.getRows();\n\t}\n\t\n\tselectedColumns(component) {\n\t\treturn component ? this.activeRange.getColumns().map((col) => col.getComponent()) : this.activeRange.getColumns();\n\t}\n\n\tgetRowHeaderWidth(){\n\t\tif(!this.rowHeader){\n\t\t\treturn 0;\n\t\t}\n\t\treturn this.rowHeader.getElement().offsetWidth;\n\t}\n\n\tisEmpty(value) {\n\t\treturn value === null || value === undefined || value === \"\";\n\t}\n}\n\n//sort numbers\nfunction number(a, b, aRow, bRow, column, dir, params){\n\tvar alignEmptyValues = params.alignEmptyValues;\n\tvar decimal = params.decimalSeparator;\n\tvar thousand = params.thousandSeparator;\n\tvar emptyAlign = 0;\n\n\ta = String(a);\n\tb = String(b);\n\n\tif(thousand){\n\t\ta = a.split(thousand).join(\"\");\n\t\tb = b.split(thousand).join(\"\");\n\t}\n\n\tif(decimal){\n\t\ta = a.split(decimal).join(\".\");\n\t\tb = b.split(decimal).join(\".\");\n\t}\n\n\ta = parseFloat(a);\n\tb = parseFloat(b);\n\n\t//handle non numeric values\n\tif(isNaN(a)){\n\t\temptyAlign = isNaN(b) ? 0 : -1;\n\t}else if(isNaN(b)){\n\t\temptyAlign = 1;\n\t}else {\n\t\t//compare valid values\n\t\treturn a - b;\n\t}\n\n\t//fix empty values in position\n\tif((alignEmptyValues === \"top\" && dir === \"desc\") || (alignEmptyValues === \"bottom\" && dir === \"asc\")){\n\t\temptyAlign *= -1;\n\t}\n\n\treturn emptyAlign;\n}\n\n//sort strings\nfunction string(a, b, aRow, bRow, column, dir, params){\n\tvar alignEmptyValues = params.alignEmptyValues;\n\tvar emptyAlign = 0;\n\tvar locale;\n\n\t//handle empty values\n\tif(!a){\n\t\temptyAlign = !b ? 0 : -1;\n\t}else if(!b){\n\t\temptyAlign = 1;\n\t}else {\n\t\t//compare valid values\n\t\tswitch(typeof params.locale){\n\t\t\tcase \"boolean\":\n\t\t\t\tif(params.locale){\n\t\t\t\t\tlocale = this.langLocale();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"string\":\n\t\t\t\tlocale = params.locale;\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn String(a).toLowerCase().localeCompare(String(b).toLowerCase(), locale);\n\t}\n\n\t//fix empty values in position\n\tif((alignEmptyValues === \"top\" && dir === \"desc\") || (alignEmptyValues === \"bottom\" && dir === \"asc\")){\n\t\temptyAlign *= -1;\n\t}\n\n\treturn emptyAlign;\n}\n\n//sort datetime\nfunction datetime(a, b, aRow, bRow, column, dir, params){\n\tvar DT = this.table.dependencyRegistry.lookup([\"luxon\", \"DateTime\"], \"DateTime\");\n\tvar format = params.format || \"dd/MM/yyyy HH:mm:ss\",\n\talignEmptyValues = params.alignEmptyValues,\n\temptyAlign = 0;\n\n\tif(typeof DT != \"undefined\"){\n\t\tif(!DT.isDateTime(a)){\n\t\t\tif(format === \"iso\"){\n\t\t\t\ta = DT.fromISO(String(a));\n\t\t\t}else {\n\t\t\t\ta = DT.fromFormat(String(a), format);\n\t\t\t}\n\t\t}\n\n\t\tif(!DT.isDateTime(b)){\n\t\t\tif(format === \"iso\"){\n\t\t\t\tb = DT.fromISO(String(b));\n\t\t\t}else {\n\t\t\t\tb = DT.fromFormat(String(b), format);\n\t\t\t}\n\t\t}\n\n\t\tif(!a.isValid){\n\t\t\temptyAlign = !b.isValid ? 0 : -1;\n\t\t}else if(!b.isValid){\n\t\t\temptyAlign = 1;\n\t\t}else {\n\t\t\t//compare valid values\n\t\t\treturn a - b;\n\t\t}\n\n\t\t//fix empty values in position\n\t\tif((alignEmptyValues === \"top\" && dir === \"desc\") || (alignEmptyValues === \"bottom\" && dir === \"asc\")){\n\t\t\temptyAlign *= -1;\n\t\t}\n\n\t\treturn emptyAlign;\n\n\t}else {\n\t\tconsole.error(\"Sort Error - 'datetime' sorter is dependant on luxon.js\");\n\t}\n}\n\n//sort date\nfunction date(a, b, aRow, bRow, column, dir, params){\n\tif(!params.format){\n\t\tparams.format = \"dd/MM/yyyy\";\n\t}\n\n\treturn datetime.call(this, a, b, aRow, bRow, column, dir, params);\n}\n\n//sort times\nfunction time(a, b, aRow, bRow, column, dir, params){\n\tif(!params.format){\n\t\tparams.format = \"HH:mm\";\n\t}\n\n\treturn datetime.call(this, a, b, aRow, bRow, column, dir, params);\n}\n\n//sort booleans\nfunction boolean(a, b, aRow, bRow, column, dir, params){\n\tvar el1 = a === true || a === \"true\" || a === \"True\" || a === 1 ? 1 : 0;\n\tvar el2 = b === true || b === \"true\" || b === \"True\" || b === 1 ? 1 : 0;\n\n\treturn el1 - el2;\n}\n\n//sort if element contains any data\nfunction array(a, b, aRow, bRow, column, dir, params){\n\tvar type = params.type || \"length\",\n\talignEmptyValues = params.alignEmptyValues,\n\temptyAlign = 0,\n\ttable = this.table,\n\tvalueMap;\n\n\tif(params.valueMap){\n\t\tif(typeof params.valueMap === \"string\"){\n\t\t\tvalueMap = function(value){\n\t\t\t\treturn value.map((item) => {\n\t\t\t\t\treturn Helpers.retrieveNestedData(table.options.nestedFieldSeparator, params.valueMap, item);\n\t\t\t\t});\n\t\t\t};\n\t\t}else {\n\t\t\tvalueMap = params.valueMap;\n\t\t}\n\t}\n\n\tfunction calc(value){\n\t\tvar result;\n\t\t\n\t\tif(valueMap){\n\t\t\tvalue = valueMap(value);\n\t\t}\n\n\t\tswitch(type){\n\t\t\tcase \"length\":\n\t\t\t\tresult = value.length;\n\t\t\t\tbreak;\n\n\t\t\tcase \"sum\":\n\t\t\t\tresult = value.reduce(function(c, d){\n\t\t\t\t\treturn c + d;\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tcase \"max\":\n\t\t\t\tresult = Math.max.apply(null, value) ;\n\t\t\t\tbreak;\n\n\t\t\tcase \"min\":\n\t\t\t\tresult = Math.min.apply(null, value) ;\n\t\t\t\tbreak;\n\n\t\t\tcase \"avg\":\n\t\t\t\tresult = value.reduce(function(c, d){\n\t\t\t\t\treturn c + d;\n\t\t\t\t}) / value.length;\n\t\t\t\tbreak;\n\n\t\t\tcase \"string\":\n\t\t\t\tresult = value.join(\"\");\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t//handle non array values\n\tif(!Array.isArray(a)){\n\t\temptyAlign = !Array.isArray(b) ? 0 : -1;\n\t}else if(!Array.isArray(b)){\n\t\temptyAlign = 1;\n\t}else {\n\t\tif(type === \"string\"){\n\t\t\treturn String(calc(a)).toLowerCase().localeCompare(String(calc(b)).toLowerCase());\n\t\t}else {\n\t\t\treturn calc(b) - calc(a);\n\t\t}\n\t}\n\n\t//fix empty values in position\n\tif((alignEmptyValues === \"top\" && dir === \"desc\") || (alignEmptyValues === \"bottom\" && dir === \"asc\")){\n\t\temptyAlign *= -1;\n\t}\n\n\treturn emptyAlign;\n}\n\n//sort if element contains any data\nfunction exists(a, b, aRow, bRow, column, dir, params){\n\tvar el1 = typeof a == \"undefined\" ? 0 : 1;\n\tvar el2 = typeof b == \"undefined\" ? 0 : 1;\n\n\treturn el1 - el2;\n}\n\n//sort alpha numeric strings\nfunction alphanum(as, bs, aRow, bRow, column, dir, params){\n\tvar a, b, a1, b1, i= 0, L, rx = /(\\d+)|(\\D+)/g, rd = /\\d/;\n\tvar alignEmptyValues = params.alignEmptyValues;\n\tvar emptyAlign = 0;\n\n\t//handle empty values\n\tif(!as && as!== 0){\n\t\temptyAlign = !bs && bs!== 0 ? 0 : -1;\n\t}else if(!bs && bs!== 0){\n\t\temptyAlign = 1;\n\t}else {\n\n\t\tif(isFinite(as) && isFinite(bs)) return as - bs;\n\t\ta = String(as).toLowerCase();\n\t\tb = String(bs).toLowerCase();\n\t\tif(a === b) return 0;\n\t\tif(!(rd.test(a) && rd.test(b))) return a > b ? 1 : -1;\n\t\ta = a.match(rx);\n\t\tb = b.match(rx);\n\t\tL = a.length > b.length ? b.length : a.length;\n\t\twhile(i < L){\n\t\t\ta1= a[i];\n\t\t\tb1= b[i++];\n\t\t\tif(a1 !== b1){\n\t\t\t\tif(isFinite(a1) && isFinite(b1)){\n\t\t\t\t\tif(a1.charAt(0) === \"0\") a1 = \".\" + a1;\n\t\t\t\t\tif(b1.charAt(0) === \"0\") b1 = \".\" + b1;\n\t\t\t\t\treturn a1 - b1;\n\t\t\t\t}\n\t\t\t\telse return a1 > b1 ? 1 : -1;\n\t\t\t}\n\t\t}\n\n\t\treturn a.length > b.length;\n\t}\n\n\t//fix empty values in position\n\tif((alignEmptyValues === \"top\" && dir === \"desc\") || (alignEmptyValues === \"bottom\" && dir === \"asc\")){\n\t\temptyAlign *= -1;\n\t}\n\n\treturn emptyAlign;\n}\n\nvar defaultSorters = {\n\tnumber:number,\n\tstring:string,\n\tdate:date,\n\ttime:time,\n\tdatetime:datetime,\n\tboolean:boolean,\n\tarray:array,\n\texists:exists,\n\talphanum:alphanum\n};\n\nclass Sort extends Module{\n\n\tstatic moduleName = \"sort\";\n\n\t//load defaults\n\tstatic sorters = defaultSorters;\n\t\n\tconstructor(table){\n\t\tsuper(table);\n\t\t\n\t\tthis.sortList = []; //holder current sort\n\t\tthis.changed = false; //has the sort changed since last render\n\t\t\n\t\tthis.registerTableOption(\"sortMode\", \"local\"); //local or remote sorting\n\t\t\n\t\tthis.registerTableOption(\"initialSort\", false); //initial sorting criteria\n\t\tthis.registerTableOption(\"columnHeaderSortMulti\", true); //multiple or single column sorting\n\t\tthis.registerTableOption(\"sortOrderReverse\", false); //reverse internal sort ordering\n\t\tthis.registerTableOption(\"headerSortElement\", \"<div class='tabulator-arrow'></div>\"); //header sort element\n\t\tthis.registerTableOption(\"headerSortClickElement\", \"header\"); //element which triggers sort when clicked\n\t\t\n\t\tthis.registerColumnOption(\"sorter\");\n\t\tthis.registerColumnOption(\"sorterParams\");\n\t\t\n\t\tthis.registerColumnOption(\"headerSort\", true);\n\t\tthis.registerColumnOption(\"headerSortStartingDir\");\n\t\tthis.registerColumnOption(\"headerSortTristate\");\n\t\t\n\t}\n\t\n\tinitialize(){\n\t\tthis.subscribe(\"column-layout\", this.initializeColumn.bind(this));\n\t\tthis.subscribe(\"table-built\", this.tableBuilt.bind(this));\n\t\tthis.registerDataHandler(this.sort.bind(this), 20);\n\t\t\n\t\tthis.registerTableFunction(\"setSort\", this.userSetSort.bind(this));\n\t\tthis.registerTableFunction(\"getSorters\", this.getSort.bind(this));\n\t\tthis.registerTableFunction(\"clearSort\", this.clearSort.bind(this));\n\t\t\n\t\tif(this.table.options.sortMode === \"remote\"){\n\t\t\tthis.subscribe(\"data-params\", this.remoteSortParams.bind(this));\n\t\t}\n\t}\n\t\n\ttableBuilt(){\n\t\tif(this.table.options.initialSort){\n\t\t\tthis.setSort(this.table.options.initialSort);\n\t\t}\n\t}\n\t\n\tremoteSortParams(data, config, silent, params){\n\t\tvar sorters = this.getSort();\n\t\t\n\t\tsorters.forEach((item) => {\n\t\t\tdelete item.column;\n\t\t});\n\t\t\n\t\tparams.sort = sorters;\n\t\t\n\t\treturn params;\n\t}\n\t\n\t\n\t///////////////////////////////////\n\t///////// Table Functions /////////\n\t///////////////////////////////////\n\t\n\tuserSetSort(sortList, dir){\n\t\tthis.setSort(sortList, dir);\n\t\t// this.table.rowManager.sorterRefresh();\n\t\tthis.refreshSort();\n\t}\n\t\n\tclearSort(){\n\t\tthis.clear();\n\t\t// this.table.rowManager.sorterRefresh();\n\t\tthis.refreshSort();\n\t}\n\t\n\t\n\t///////////////////////////////////\n\t///////// Internal Logic //////////\n\t///////////////////////////////////\n\t\n\t//initialize column header for sorting\n\tinitializeColumn(column){\n\t\tvar sorter = false,\n\t\tcolEl,\n\t\tarrowEl;\n\t\t\n\t\tswitch(typeof column.definition.sorter){\n\t\t\tcase \"string\":\n\t\t\t\tif(Sort.sorters[column.definition.sorter]){\n\t\t\t\t\tsorter = Sort.sorters[column.definition.sorter];\n\t\t\t\t}else {\n\t\t\t\t\tconsole.warn(\"Sort Error - No such sorter found: \", column.definition.sorter);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase \"function\":\n\t\t\t\tsorter = column.definition.sorter;\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\tcolumn.modules.sort = {\n\t\t\tsorter:sorter, dir:\"none\",\n\t\t\tparams:column.definition.sorterParams || {},\n\t\t\tstartingDir:column.definition.headerSortStartingDir || \"asc\",\n\t\t\ttristate: column.definition.headerSortTristate,\n\t\t};\n\t\t\n\t\tif(column.definition.headerSort !== false){\n\t\t\t\n\t\t\tcolEl = column.getElement();\n\t\t\t\n\t\t\tcolEl.classList.add(\"tabulator-sortable\");\n\t\t\t\n\t\t\tarrowEl = document.createElement(\"div\");\n\t\t\tarrowEl.classList.add(\"tabulator-col-sorter\");\n\t\t\t\n\t\t\tswitch(this.table.options.headerSortClickElement){\n\t\t\t\tcase \"icon\":\n\t\t\t\t\tarrowEl.classList.add(\"tabulator-col-sorter-element\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"header\":\n\t\t\t\t\tcolEl.classList.add(\"tabulator-col-sorter-element\");\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tcolEl.classList.add(\"tabulator-col-sorter-element\");\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tswitch(this.table.options.headerSortElement){\n\t\t\t\tcase \"function\":\n\t\t\t\t//do nothing\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"object\":\n\t\t\t\t\tarrowEl.appendChild(this.table.options.headerSortElement);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tdefault:\n\t\t\t\t\tarrowEl.innerHTML = this.table.options.headerSortElement;\n\t\t\t}\n\t\t\t\n\t\t\t//create sorter arrow\n\t\t\tcolumn.titleHolderElement.appendChild(arrowEl);\n\t\t\t\n\t\t\tcolumn.modules.sort.element = arrowEl;\n\t\t\t\n\t\t\tthis.setColumnHeaderSortIcon(column, \"none\");\n\t\t\t\n\t\t\tif(this.table.options.headerSortClickElement === \"icon\"){\n\t\t\t\tarrowEl.addEventListener(\"mousedown\", (e) => {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t});\n\t\t\t}\n\t\t\t\n\t\t\t//sort on click\n\t\t\t(this.table.options.headerSortClickElement === \"icon\" ? arrowEl : colEl).addEventListener(\"click\", (e) => {\n\t\t\t\tvar dir = \"\",\n\t\t\t\tsorters=[],\n\t\t\t\tmatch = false;\n\t\t\t\t\n\t\t\t\tif(column.modules.sort){\n\t\t\t\t\tif(column.modules.sort.tristate){\n\t\t\t\t\t\tif(column.modules.sort.dir == \"none\"){\n\t\t\t\t\t\t\tdir = column.modules.sort.startingDir;\n\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\tif(column.modules.sort.dir == column.modules.sort.startingDir){\n\t\t\t\t\t\t\t\tdir = column.modules.sort.dir == \"asc\" ? \"desc\" : \"asc\";\n\t\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\t\tdir = \"none\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}else {\n\t\t\t\t\t\tswitch(column.modules.sort.dir){\n\t\t\t\t\t\t\tcase \"asc\":\n\t\t\t\t\t\t\t\tdir = \"desc\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tcase \"desc\":\n\t\t\t\t\t\t\t\tdir = \"asc\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tdir = column.modules.sort.startingDir;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (this.table.options.columnHeaderSortMulti && (e.shiftKey || e.ctrlKey)) {\n\t\t\t\t\t\tsorters = this.getSort();\n\t\t\t\t\t\t\n\t\t\t\t\t\tmatch = sorters.findIndex((sorter) => {\n\t\t\t\t\t\t\treturn sorter.field === column.getField();\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(match > -1){\n\t\t\t\t\t\t\tsorters[match].dir = dir;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tmatch = sorters.splice(match, 1)[0];\n\t\t\t\t\t\t\tif(dir != \"none\"){\n\t\t\t\t\t\t\t\tsorters.push(match);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\tif(dir != \"none\"){\n\t\t\t\t\t\t\t\tsorters.push({column:column, dir:dir});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t//add to existing sort\n\t\t\t\t\t\tthis.setSort(sorters);\n\t\t\t\t\t}else {\n\t\t\t\t\t\tif(dir == \"none\"){\n\t\t\t\t\t\t\tthis.clear();\n\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\t//sort by column only\n\t\t\t\t\t\t\tthis.setSort(column, dir);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// this.table.rowManager.sorterRefresh(!this.sortList.length);\n\t\t\t\t\tthis.refreshSort();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\t\n\trefreshSort(){\n\t\tif(this.table.options.sortMode === \"remote\"){\n\t\t\tthis.reloadData(null, false, false);\n\t\t}else {\n\t\t\tthis.refreshData(true);\n\t\t}\n\t\t\n\t\t//TODO - Persist left position of row manager\n\t\t// left = this.scrollLeft;\n\t\t// this.scrollHorizontal(left);\n\t}\n\t\n\t//check if the sorters have changed since last use\n\thasChanged(){\n\t\tvar changed = this.changed;\n\t\tthis.changed = false;\n\t\treturn changed;\n\t}\n\t\n\t//return current sorters\n\tgetSort(){\n\t\tvar self = this,\n\t\tsorters = [];\n\t\t\n\t\tself.sortList.forEach(function(item){\n\t\t\tif(item.column){\n\t\t\t\tsorters.push({column:item.column.getComponent(), field:item.column.getField(), dir:item.dir});\n\t\t\t}\n\t\t});\n\t\t\n\t\treturn sorters;\n\t}\n\t\n\t//change sort list and trigger sort\n\tsetSort(sortList, dir){\n\t\tvar self = this,\n\t\tnewSortList = [];\n\t\t\n\t\tif(!Array.isArray(sortList)){\n\t\t\tsortList = [{column: sortList, dir:dir}];\n\t\t}\n\t\t\n\t\tsortList.forEach(function(item){\n\t\t\tvar column;\n\t\t\t\n\t\t\tcolumn = self.table.columnManager.findColumn(item.column);\n\t\t\t\n\t\t\tif(column){\n\t\t\t\titem.column = column;\n\t\t\t\tnewSortList.push(item);\n\t\t\t\tself.changed = true;\n\t\t\t}else {\n\t\t\t\tconsole.warn(\"Sort Warning - Sort field does not exist and is being ignored: \", item.column);\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tself.sortList = newSortList;\n\t\t\n\t\tthis.dispatch(\"sort-changed\");\n\t}\n\t\n\t//clear sorters\n\tclear(){\n\t\tthis.setSort([]);\n\t}\n\t\n\t//find appropriate sorter for column\n\tfindSorter(column){\n\t\tvar row = this.table.rowManager.activeRows[0],\n\t\tsorter = \"string\",\n\t\tfield, value;\n\t\t\n\t\tif(row){\n\t\t\trow = row.getData();\n\t\t\tfield = column.getField();\n\t\t\t\n\t\t\tif(field){\n\t\t\t\t\n\t\t\t\tvalue = column.getFieldValue(row);\n\t\t\t\t\n\t\t\t\tswitch(typeof value){\n\t\t\t\t\tcase \"undefined\":\n\t\t\t\t\t\tsorter = \"string\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"boolean\":\n\t\t\t\t\t\tsorter = \"boolean\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif(!isNaN(value) && value !== \"\"){\n\t\t\t\t\t\t\tsorter = \"number\";\n\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\tif(value.match(/((^[0-9]+[a-z]+)|(^[a-z]+[0-9]+))+$/i)){\n\t\t\t\t\t\t\t\tsorter = \"alphanum\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn Sort.sorters[sorter];\n\t}\n\t\n\t//work through sort list sorting data\n\tsort(data, sortOnly){\n\t\tvar self = this,\n\t\tsortList = this.table.options.sortOrderReverse ? self.sortList.slice().reverse() : self.sortList,\n\t\tsortListActual = [],\n\t\trowComponents = [];\n\t\t\n\t\tif(this.subscribedExternal(\"dataSorting\")){\n\t\t\tthis.dispatchExternal(\"dataSorting\", self.getSort());\n\t\t}\n\t\t\n\t\tif(!sortOnly) {\n\t\t\tself.clearColumnHeaders();\n\t\t}\n\t\t\n\t\tif(this.table.options.sortMode !== \"remote\"){\n\t\t\t\n\t\t\t//build list of valid sorters and trigger column specific callbacks before sort begins\n\t\t\tsortList.forEach(function(item, i){\n\t\t\t\tvar sortObj;\n\t\t\t\t\n\t\t\t\tif(item.column){\n\t\t\t\t\tsortObj = item.column.modules.sort;\n\t\t\t\t\t\n\t\t\t\t\tif(sortObj){\n\t\t\t\t\t\t\n\t\t\t\t\t\t//if no sorter has been defined, take a guess\n\t\t\t\t\t\tif(!sortObj.sorter){\n\t\t\t\t\t\t\tsortObj.sorter = self.findSorter(item.column);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\titem.params = typeof sortObj.params === \"function\" ? sortObj.params(item.column.getComponent(), item.dir) : sortObj.params;\n\t\t\t\t\t\t\n\t\t\t\t\t\tsortListActual.push(item);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif(!sortOnly) {\n\t\t\t\t\t\tself.setColumnHeader(item.column, item.dir);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\t//sort data\n\t\t\tif (sortListActual.length) {\n\t\t\t\tself._sortItems(data, sortListActual);\n\t\t\t}\n\t\t\t\n\t\t}else if(!sortOnly) {\n\t\t\tsortList.forEach(function(item, i){\n\t\t\t\tself.setColumnHeader(item.column, item.dir);\n\t\t\t});\n\t\t}\n\n\t\t\n\t\tif(this.subscribedExternal(\"dataSorted\")){\n\t\t\tdata.forEach((row) => {\n\t\t\t\trowComponents.push(row.getComponent());\n\t\t\t});\n\t\t\t\n\t\t\tthis.dispatchExternal(\"dataSorted\", self.getSort(), rowComponents);\n\t\t}\n\t\t\n\t\treturn data;\n\t}\n\t\n\t//clear sort arrows on columns\n\tclearColumnHeaders(){\n\t\tthis.table.columnManager.getRealColumns().forEach((column) => {\n\t\t\tif(column.modules.sort){\n\t\t\t\tcolumn.modules.sort.dir = \"none\";\n\t\t\t\tcolumn.getElement().setAttribute(\"aria-sort\", \"none\");\n\t\t\t\tthis.setColumnHeaderSortIcon(column, \"none\");\n\t\t\t}\n\t\t});\n\t}\n\t\n\t//set the column header sort direction\n\tsetColumnHeader(column, dir){\n\t\tcolumn.modules.sort.dir = dir;\n\t\tcolumn.getElement().setAttribute(\"aria-sort\", dir === \"asc\" ? \"ascending\" : \"descending\");\n\t\tthis.setColumnHeaderSortIcon(column, dir);\n\t}\n\t\n\tsetColumnHeaderSortIcon(column, dir){\n\t\tvar sortEl = column.modules.sort.element,\n\t\tarrowEl;\n\t\t\n\t\tif(column.definition.headerSort && typeof this.table.options.headerSortElement === \"function\"){\n\t\t\twhile(sortEl.firstChild) sortEl.removeChild(sortEl.firstChild);\n\t\t\t\n\t\t\tarrowEl = this.table.options.headerSortElement.call(this.table, column.getComponent(), dir);\n\t\t\t\n\t\t\tif(typeof arrowEl === \"object\"){\n\t\t\t\tsortEl.appendChild(arrowEl);\n\t\t\t}else {\n\t\t\t\tsortEl.innerHTML = arrowEl;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t//sort each item in sort list\n\t_sortItems(data, sortList){\n\t\tvar sorterCount = sortList.length - 1;\n\t\t\n\t\tdata.sort((a, b) => {\n\t\t\tvar result;\n\t\t\t\n\t\t\tfor(var i = sorterCount; i>= 0; i--){\n\t\t\t\tlet sortItem = sortList[i];\n\t\t\t\t\n\t\t\t\tresult = this._sortRow(a, b, sortItem.column, sortItem.dir, sortItem.params);\n\t\t\t\t\n\t\t\t\tif(result !== 0){\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn result;\n\t\t});\n\t}\n\t\n\t//process individual rows for a sort function on active data\n\t_sortRow(a, b, column, dir, params){\n\t\tvar el1Comp, el2Comp;\n\t\t\n\t\t//switch elements depending on search direction\n\t\tvar el1 = dir == \"asc\" ? a : b;\n\t\tvar el2 = dir == \"asc\" ? b : a;\n\t\t\n\t\ta = column.getFieldValue(el1.getData());\n\t\tb = column.getFieldValue(el2.getData());\n\t\t\n\t\ta = typeof a !== \"undefined\" ? a : \"\";\n\t\tb = typeof b !== \"undefined\" ? b : \"\";\n\t\t\n\t\tel1Comp = el1.getComponent();\n\t\tel2Comp = el2.getComponent();\n\t\t\n\t\treturn column.modules.sort.sorter.call(this, a, b, el1Comp, el2Comp, column.getComponent(), dir, params);\n\t}\n}\n\nclass GridCalculator{\r\n\tconstructor(columns, rows){\r\n\t\tthis.columnCount = columns;\r\n\t\tthis.rowCount = rows;\r\n\r\n\t\tthis.columnString = [];\r\n\t\tthis.columns = [];\r\n\t\tthis.rows = [];\r\n\t}\r\n\r\n\tgenColumns(data){\r\n\t\tvar colCount = Math.max(this.columnCount, Math.max(...data.map(item => item.length)));\r\n\r\n\t\tthis.columnString = [];\r\n\t\tthis.columns = [];\r\n\r\n\t\tfor(let i = 1; i <= colCount; i++){\r\n\t\t\tthis.incrementChar(this.columnString.length - 1);\r\n\t\t\tthis.columns.push(this.columnString.join(\"\"));\r\n\t\t}\r\n\r\n\t\treturn this.columns;\r\n\t}\r\n\r\n\tgenRows(data){\r\n\t\tvar rowCount = Math.max(this.rowCount, data.length);\r\n\r\n\t\tthis.rows = [];\r\n\r\n\t\tfor(let i = 1; i <= rowCount; i++){\r\n\t\t\tthis.rows.push(i);\r\n\t\t}\r\n\t\t\r\n\t\treturn this.rows;\r\n\t}\r\n\r\n\tincrementChar(i){\r\n\t\tlet char = this.columnString[i];\r\n\r\n\t\tif(char){\r\n\t\t\tif(char !== \"Z\"){\r\n\t\t\t\tthis.columnString[i] = String.fromCharCode(this.columnString[i].charCodeAt(0) + 1);\r\n\t\t\t}else {\r\n\t\t\t\tthis.columnString[i] = \"A\";\r\n\t\t\t\t\r\n\t\t\t\tif(i){\r\n\t\t\t\t\tthis.incrementChar(i-1);\r\n\t\t\t\t}else {\r\n\t\t\t\t\tthis.columnString.push(\"A\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}else {\r\n\t\t\tthis.columnString.push(\"A\");\r\n\t\t}\r\n\t}\r\n\r\n\tsetRowCount(count){\r\n\t\tthis.rowCount = count;\r\n\t}\r\n\r\n\tsetColumnCount(count){\r\n\t\tthis.columnCount = count;\r\n\t}\r\n}\n\nclass SheetComponent {\r\n\tconstructor(sheet) {\r\n\t\tthis._sheet = sheet;\r\n\r\n\t\treturn new Proxy(this, {\r\n\t\t\tget: function (target, name, receiver) {\r\n\t\t\t\tif (typeof target[name] !== \"undefined\") {\r\n\t\t\t\t\treturn target[name];\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn target._sheet.table.componentFunctionBinder.handle(\"sheet\", target._sheet, name);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t});\r\n\t}\r\n\r\n\tgetTitle(){\r\n\t\treturn this._sheet.title;\r\n\t}\r\n\r\n\tgetKey(){\r\n\t\treturn this._sheet.key;\r\n\t}\r\n\r\n\tgetDefinition(){\r\n\t\treturn this._sheet.getDefinition();\r\n\t}\r\n\r\n\tgetData() {\r\n\t\treturn this._sheet.getData();\r\n\t}\r\n\r\n\tsetData(data) {\r\n\t\treturn this._sheet.setData(data);\r\n\t}\r\n\r\n\tclear(){\r\n\t\treturn this._sheet.clear();\r\n\t}\r\n\r\n\tremove(){\r\n\t\treturn this._sheet.remove();\r\n\t}\r\n\t\r\n\tactive(){\r\n\t\treturn this._sheet.active();\r\n\t}\r\n\r\n\tsetTitle(title){\r\n\t\treturn this._sheet.setTitle(title);\r\n\t}\r\n\r\n\tsetRows(rows){\r\n\t\treturn this._sheet.setRows(rows);\r\n\t}\r\n\r\n\tsetColumns(columns){\r\n\t\treturn this._sheet.setColumns(columns);\r\n\t}\r\n}\n\nclass Sheet extends CoreFeature{\r\n\tconstructor(spreadsheetManager, definition) {\r\n\t\tsuper(spreadsheetManager.table);\r\n\t\t\r\n\t\tthis.spreadsheetManager = spreadsheetManager;\r\n\t\tthis.definition = definition;\r\n\t\t\r\n\t\tthis.title = this.definition.title || \"\";\r\n\t\tthis.key = this.definition.key || this.definition.title;\r\n\t\tthis.rowCount = this.definition.rows;\r\n\t\tthis.columnCount = this.definition.columns;\r\n\t\tthis.data = this.definition.data || [];\r\n\t\tthis.element = null;\r\n\t\tthis.isActive = false;\r\n\t\t\r\n\t\tthis.grid = new GridCalculator(this.columnCount, this.rowCount);\r\n\t\t\r\n\t\tthis.defaultColumnDefinition = {width:100, headerHozAlign:\"center\", headerSort:false};\r\n\t\tthis.columnDefinition = Object.assign(this.defaultColumnDefinition, this.options(\"spreadsheetColumnDefinition\"));\r\n\t\t\r\n\t\tthis.columnDefs = [];\r\n\t\tthis.rowDefs = [];\r\n\t\tthis.columnFields = [];\r\n\t\tthis.columns = [];\r\n\t\tthis.rows = [];\r\n\t\t\r\n\t\tthis.scrollTop = null;\r\n\t\tthis.scrollLeft = null;\r\n\t\t\r\n\t\tthis.initialize();\r\n\t\t\r\n\t\tthis.dispatchExternal(\"sheetAdded\", this.getComponent());\r\n\t}\r\n\t\r\n\t///////////////////////////////////\r\n\t///////// Initialization //////////\r\n\t///////////////////////////////////\r\n\t\r\n\tinitialize(){\r\n\t\tthis.initializeElement();\r\n\t\tthis.initializeColumns();\r\n\t\tthis.initializeRows();\r\n\t}\r\n\t\r\n\treinitialize(){\r\n\t\tthis.initializeColumns();\r\n\t\tthis.initializeRows();\r\n\t}\r\n\t\r\n\tinitializeElement(){\r\n\t\tthis.element = document.createElement(\"div\");\r\n\t\tthis.element.classList.add(\"tabulator-spreadsheet-tab\");\r\n\t\tthis.element.innerText = this.title;\r\n\t\t\r\n\t\tthis.element.addEventListener(\"click\", () => {\r\n\t\t\tthis.spreadsheetManager.loadSheet(this);\r\n\t\t});\r\n\t}\r\n\t\r\n\tinitializeColumns(){\r\n\t\tthis.grid.setColumnCount(this.columnCount);\r\n\t\tthis.columnFields = this.grid.genColumns(this.data);\r\n\t\t\r\n\t\tthis.columnDefs = [];\r\n\t\t\r\n\t\tthis.columnFields.forEach((ref) => {\r\n\t\t\tvar def = Object.assign({}, this.columnDefinition);\r\n\t\t\tdef.field = ref;\r\n\t\t\tdef.title = ref;\r\n\t\t\t\r\n\t\t\tthis.columnDefs.push(def);\r\n\t\t});\r\n\t}\r\n\t\r\n\tinitializeRows(){\r\n\t\tvar refs;\r\n\t\t\r\n\t\tthis.grid.setRowCount(this.rowCount);\r\n\t\t\r\n\t\trefs = this.grid.genRows(this.data);\r\n\t\t\r\n\t\tthis.rowDefs = [];\r\n\t\t\r\n\t\trefs.forEach((ref, i) => {\r\n\t\t\tvar def = {\"_id\":ref};\r\n\t\t\tvar data = this.data[i];\r\n\t\t\t\r\n\t\t\tif(data){\r\n\t\t\t\tdata.forEach((val, j) => {\r\n\t\t\t\t\tvar field = this.columnFields[j];\r\n\t\t\t\t\t\r\n\t\t\t\t\tif(field){\r\n\t\t\t\t\t\tdef[field] = val;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tthis.rowDefs.push(def);\r\n\t\t});\r\n\t}\r\n\t\r\n\tunload(){\r\n\t\tthis.isActive = false;\r\n\t\tthis.scrollTop = this.table.rowManager.scrollTop;\r\n\t\tthis.scrollLeft = this.table.rowManager.scrollLeft;\r\n\t\tthis.data = this.getData(true);\r\n\t\tthis.element.classList.remove(\"tabulator-spreadsheet-tab-active\");\r\n\t}\r\n\t\r\n\tload(){\r\n\t\t\r\n\t\tvar wasInactive = !this.isActive;\r\n\t\t\r\n\t\tthis.isActive = true;\r\n\t\tthis.table.blockRedraw();\r\n\t\tthis.table.setData([]);\r\n\t\tthis.table.setColumns(this.columnDefs);\r\n\t\tthis.table.setData(this.rowDefs);\r\n\t\tthis.table.restoreRedraw();\r\n\t\t\r\n\t\tif(wasInactive && this.scrollTop !== null){\r\n\t\t\tthis.table.rowManager.element.scrollLeft = this.scrollLeft;\r\n\t\t\tthis.table.rowManager.element.scrollTop = this.scrollTop;\r\n\t\t}\r\n\t\t\r\n\t\tthis.element.classList.add(\"tabulator-spreadsheet-tab-active\");\r\n\t\t\r\n\t\tthis.dispatchExternal(\"sheetLoaded\", this.getComponent());\r\n\t}\r\n\t\r\n\t///////////////////////////////////\r\n\t//////// Helper Functions /////////\r\n\t///////////////////////////////////\r\n\t\r\n\tgetComponent(){\r\n\t\treturn new SheetComponent(this);\r\n\t}\r\n\t\r\n\tgetDefinition(){\r\n\t\treturn {\r\n\t\t\ttitle:this.title,\r\n\t\t\tkey:this.key,\r\n\t\t\trows:this.rowCount,\r\n\t\t\tcolumns:this.columnCount,\r\n\t\t\tdata:this.getData(),\r\n\t\t};\r\n\t}\r\n\t\r\n\tgetData(full){\r\n\t\tvar output = [], \r\n\t\trowWidths,\r\n\t\toutputWidth, outputHeight;\r\n\t\t\r\n\t\t//map data to array format\r\n\t\tthis.rowDefs.forEach((rowData) => {\r\n\t\t\tvar row = [];\r\n\t\t\t\r\n\t\t\tthis.columnFields.forEach((field) => {\r\n\t\t\t\trow.push(rowData[field]);\r\n\t\t\t});\r\n\t\t\t\r\n\t\t\toutput.push(row);\r\n\t\t});\r\n\t\t\r\n\t\t//trim output\r\n\t\tif(!full && !this.options(\"spreadsheetOutputFull\")){\r\n\t\t\t\r\n\t\t\t//calculate used area of data\r\n\t\t\trowWidths = output.map(row => row.findLastIndex(val => typeof val !== 'undefined') + 1);\r\n\t\t\toutputWidth = Math.max(...rowWidths);\r\n\t\t\toutputHeight = rowWidths.findLastIndex(width => width > 0) + 1;\r\n\t\t\t\r\n\t\t\toutput = output.slice(0, outputHeight);\r\n\t\t\toutput = output.map(row => row.slice(0, outputWidth));\r\n\t\t}\r\n\t\t\r\n\t\treturn output;\r\n\t}\r\n\t\r\n\tsetData(data){\r\n\t\tthis.data = data;\r\n\t\tthis.reinitialize();\r\n\t\t\r\n\t\tthis.dispatchExternal(\"sheetUpdated\", this.getComponent());\r\n\t\t\r\n\t\tif(this.isActive){\r\n\t\t\tthis.load();\r\n\t\t}\r\n\t}\r\n\t\r\n\tclear(){\r\n\t\tthis.setData([]);\r\n\t}\r\n\t\r\n\tsetTitle(title){\r\n\t\tthis.title = title;\r\n\t\tthis.element.innerText = title;\r\n\t\t\r\n\t\tthis.dispatchExternal(\"sheetUpdated\", this.getComponent());\r\n\t}\r\n\t\r\n\tsetRows(rows){\r\n\t\tthis.rowCount = rows;\r\n\t\tthis.initializeRows();\r\n\t\t\r\n\t\tthis.dispatchExternal(\"sheetUpdated\", this.getComponent());\r\n\t\t\r\n\t\tif(this.isActive){\r\n\t\t\tthis.load();\r\n\t\t}\r\n\t}\r\n\t\r\n\tsetColumns(columns){\r\n\t\tthis.columnCount = columns;\r\n\t\tthis.reinitialize();\r\n\t\t\r\n\t\tthis.dispatchExternal(\"sheetUpdated\", this.getComponent());\r\n\t\t\r\n\t\tif(this.isActive){\r\n\t\t\tthis.load();\r\n\t\t}\r\n\t}\r\n\t\r\n\tremove(){\r\n\t\tthis.spreadsheetManager.removeSheet(this);\r\n\t}\r\n\t\r\n\tdestroy(){\r\n\t\tif(this.element.parentNode){\r\n\t\t\tthis.element.parentNode.removeChild(this.element);\r\n\t\t}\r\n\t\t\r\n\t\tthis.dispatchExternal(\"sheetRemoved\", this.getComponent());\r\n\t}\r\n\t\r\n\tactive(){\r\n\t\tthis.spreadsheetManager.loadSheet(this);\r\n\t}\r\n}\n\nclass Spreadsheet extends Module{\r\n\t\r\n\tstatic moduleName = \"spreadsheet\";\r\n\t\r\n\tconstructor(table){\r\n\t\tsuper(table);\r\n\t\t\r\n\t\tthis.sheets = [];\r\n\t\tthis.element = null;\r\n\t\t\r\n\t\tthis.registerTableOption(\"spreadsheet\", false); \r\n\t\tthis.registerTableOption(\"spreadsheetRows\", 50); \r\n\t\tthis.registerTableOption(\"spreadsheetColumns\", 50); \r\n\t\tthis.registerTableOption(\"spreadsheetColumnDefinition\", {}); \r\n\t\tthis.registerTableOption(\"spreadsheetOutputFull\", false); \r\n\t\tthis.registerTableOption(\"spreadsheetData\", false); \r\n\t\tthis.registerTableOption(\"spreadsheetSheets\", false); \r\n\t\tthis.registerTableOption(\"spreadsheetSheetTabs\", false); \r\n\t\tthis.registerTableOption(\"spreadsheetSheetTabsElement\", false); \r\n\t\t\r\n\t\tthis.registerTableFunction(\"setSheets\", this.setSheets.bind(this));\r\n\t\tthis.registerTableFunction(\"addSheet\", this.addSheet.bind(this));\r\n\t\tthis.registerTableFunction(\"getSheets\", this.getSheets.bind(this));\r\n\t\tthis.registerTableFunction(\"getSheetDefinitions\", this.getSheetDefinitions.bind(this));\r\n\t\tthis.registerTableFunction(\"setSheetData\", this.setSheetData.bind(this));\r\n\t\tthis.registerTableFunction(\"getSheet\", this.getSheet.bind(this));\r\n\t\tthis.registerTableFunction(\"getSheetData\", this.getSheetData.bind(this));\r\n\t\tthis.registerTableFunction(\"clearSheet\", this.clearSheet.bind(this));\r\n\t\tthis.registerTableFunction(\"removeSheet\", this.removeSheetFunc.bind(this));\r\n\t\tthis.registerTableFunction(\"activeSheet\", this.activeSheetFunc.bind(this));\r\n\t}\r\n\t\r\n\t///////////////////////////////////\r\n\t////// Module Initialization //////\r\n\t///////////////////////////////////\r\n\t\r\n\t\r\n\tinitialize(){\r\n\t\tif(this.options(\"spreadsheet\")){\t\r\n\t\t\tthis.subscribe(\"table-initialized\", this.tableInitialized.bind(this));\r\n\t\t\tthis.subscribe(\"data-loaded\", this.loadRemoteData.bind(this));\r\n\t\t\t\r\n\t\t\tthis.table.options.index = \"_id\";\r\n\t\t\t\r\n\t\t\tif(this.options(\"spreadsheetData\") && this.options(\"spreadsheetSheets\")){\r\n\t\t\t\tconsole.warn(\"You cannot use spreadsheetData and spreadsheetSheets at the same time, ignoring spreadsheetData\");\r\n\t\t\t\t\r\n\t\t\t\tthis.table.options.spreadsheetData = false;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tthis.compatibilityCheck();\r\n\t\t\t\r\n\t\t\tif(this.options(\"spreadsheetSheetTabs\")){\r\n\t\t\t\tthis.initializeTabset();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\tcompatibilityCheck(){\r\n\t\tif(this.options(\"data\")){\r\n\t\t\tconsole.warn(\"Do not use the data option when working with spreadsheets, use either spreadsheetData or spreadsheetSheets to pass data into the table\");\r\n\t\t}\r\n\t\t\r\n\t\tif(this.options(\"pagination\")){\r\n\t\t\tconsole.warn(\"The spreadsheet module is not compatible with the pagination module\");\r\n\t\t}\r\n\t\t\r\n\t\tif(this.options(\"groupBy\")){\r\n\t\t\tconsole.warn(\"The spreadsheet module is not compatible with the row grouping module\");\r\n\t\t}\r\n\t\t\r\n\t\tif(this.options(\"responsiveCollapse\")){\r\n\t\t\tconsole.warn(\"The spreadsheet module is not compatible with the responsive collapse module\");\r\n\t\t}\r\n\t}\r\n\tinitializeTabset(){\r\n\t\tthis.element = document.createElement(\"div\");\r\n\t\tthis.element.classList.add(\"tabulator-spreadsheet-tabs\");\r\n\t\tvar altContainer = this.options(\"spreadsheetSheetTabsElement\");\r\n\t\t\r\n\t\tif(altContainer && !(altContainer instanceof HTMLElement)){\r\n\t\t\taltContainer = document.querySelector(altContainer);\r\n\t\t\t\r\n\t\t\tif(!altContainer){\r\n\t\t\t\tconsole.warn(\"Unable to find element matching spreadsheetSheetTabsElement selector:\", this.options(\"spreadsheetSheetTabsElement\"));\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tif(altContainer){\r\n\t\t\taltContainer.appendChild(this.element);\r\n\t\t}else {\r\n\t\t\tthis.footerAppend(this.element);\r\n\t\t}\r\n\t}\r\n\t\r\n\ttableInitialized(){\r\n\t\tif(this.sheets.length){\r\n\t\t\tthis.loadSheet(this.sheets[0]);\r\n\t\t}else {\r\n\t\t\t\r\n\t\t\tif(this.options(\"spreadsheetSheets\")){\r\n\t\t\t\tthis.loadSheets(this.options(\"spreadsheetSheets\"));\r\n\t\t\t}else if(this.options(\"spreadsheetData\")){\r\n\t\t\t\tthis.loadData(this.options(\"spreadsheetData\"));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t///////////////////////////////////\r\n\t/////////// Ajax Parsing //////////\r\n\t///////////////////////////////////\r\n\r\n\tloadRemoteData(data, data1, data2){\r\n\t\tconsole.log(\"data\", data, data1, data2);\r\n\r\n\t\tif(Array.isArray(data)){\r\n\r\n\t\t\tthis.table.dataLoader.clearAlert();\r\n\t\t\tthis.dispatchExternal(\"dataLoaded\", data);\r\n\r\n\t\t\tif(!data.length || Array.isArray(data[0])){\r\n\t\t\t\tthis.loadData(data);\r\n\t\t\t}else {\r\n\t\t\t\tthis.loadSheets(data);\r\n\t\t\t}\r\n\t\t}else {\r\n\t\t\tconsole.error(\"Spreadsheet Loading Error - Unable to process remote data due to invalid data type \\nExpecting: array \\nReceived: \", typeof data, \"\\nData: \", data);\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\t///////////////////////////////////\r\n\t///////// Sheet Management ////////\r\n\t///////////////////////////////////\r\n\t\r\n\t\r\n\tloadData(data){\r\n\t\tvar def = {\r\n\t\t\tdata:data,\r\n\t\t};\r\n\t\t\r\n\t\tthis.loadSheet(this.newSheet(def));\r\n\t}\r\n\t\r\n\tdestroySheets(){\r\n\t\tthis.sheets.forEach((sheet) => {\r\n\t\t\tsheet.destroy();\r\n\t\t});\r\n\t\t\r\n\t\tthis.sheets = [];\r\n\t\tthis.activeSheet = null;\r\n\t}\r\n\t\r\n\tloadSheets(sheets){\t\r\n\t\tif(!Array.isArray(sheets)){\r\n\t\t\tsheets = [];\r\n\t\t}\r\n\t\t\r\n\t\tthis.destroySheets();\r\n\t\t\r\n\t\tsheets.forEach((def) => {\r\n\t\t\tthis.newSheet(def);\r\n\t\t});\r\n\t\t\r\n\t\tthis.loadSheet(this.sheets[0]);\r\n\t}\r\n\t\r\n\tloadSheet(sheet){\r\n\t\tif(this.activeSheet !== sheet){\r\n\t\t\tif(this.activeSheet){\r\n\t\t\t\tthis.activeSheet.unload();\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tthis.activeSheet = sheet;\r\n\t\t\t\r\n\t\t\tsheet.load();\r\n\t\t}\r\n\t}\r\n\t\r\n\tnewSheet(definition = {}){\r\n\t\tvar sheet;\r\n\t\t\r\n\t\tif(!definition.rows){\r\n\t\t\tdefinition.rows = this.options(\"spreadsheetRows\");\r\n\t\t}\r\n\t\t\r\n\t\tif(!definition.columns){\r\n\t\t\tdefinition.columns = this.options(\"spreadsheetColumns\");\r\n\t\t}\r\n\t\t\r\n\t\tsheet = new Sheet(this, definition);\r\n\t\t\r\n\t\tthis.sheets.push(sheet);\r\n\t\t\r\n\t\tif(this.element){\r\n\t\t\tthis.element.appendChild(sheet.element);\r\n\t\t}\r\n\t\t\r\n\t\treturn sheet;\r\n\t}\r\n\t\r\n\tremoveSheet(sheet){\r\n\t\tvar index = this.sheets.indexOf(sheet),\r\n\t\tprevSheet;\r\n\t\t\r\n\t\tif(this.sheets.length > 1){\r\n\t\t\tif(index > -1){\r\n\t\t\t\tthis.sheets.splice(index, 1);\r\n\t\t\t\tsheet.destroy();\r\n\t\t\t\t\r\n\t\t\t\tif(this.activeSheet === sheet){\r\n\t\t\t\t\t\r\n\t\t\t\t\tprevSheet = this.sheets[index - 1] || this.sheets[0];\r\n\t\t\t\t\t\r\n\t\t\t\t\tif(prevSheet){\r\n\t\t\t\t\t\tthis.loadSheet(prevSheet);\r\n\t\t\t\t\t}else {\r\n\t\t\t\t\t\tthis.activeSheet = null;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}else {\r\n\t\t\tconsole.warn(\"Unable to remove sheet, at least one sheet must be active\");\r\n\t\t}\r\n\t}\r\n\t\r\n\tlookupSheet(key){\r\n\t\tif(!key){\r\n\t\t\treturn this.activeSheet;\r\n\t\t}else if(key instanceof Sheet){\r\n\t\t\treturn key;\r\n\t\t}else if(key instanceof SheetComponent){\r\n\t\t\treturn key._sheet;\r\n\t\t}else {\r\n\t\t\treturn this.sheets.find(sheet => sheet.key === key) || false;\r\n\t\t}\r\n\t}\r\n\t\r\n\t\r\n\t///////////////////////////////////\r\n\t//////// Public Functions /////////\r\n\t///////////////////////////////////\r\n\t\r\n\tsetSheets(sheets){\r\n\t\tthis.loadSheets(sheets);\r\n\r\n\t\treturn this.getSheets();\r\n\t}\r\n\r\n\taddSheet(sheet){\r\n\t\treturn this.newSheet(sheet).getComponent();\r\n\t}\r\n\t\r\n\tgetSheetDefinitions(){\r\n\t\treturn this.sheets.map(sheet => sheet.getDefinition());\r\n\t}\r\n\t\r\n\tgetSheets(){\r\n\t\treturn this.sheets.map(sheet => sheet.getComponent());\r\n\t}\r\n\t\r\n\tgetSheet(key){\r\n\t\tvar sheet = this.lookupSheet(key);\r\n\t\t\r\n\t\treturn sheet ? sheet.getComponent() : false;\r\n\t}\r\n\t\r\n\tsetSheetData(key, data){\r\n\t\tif (key && !data){\r\n\t\t\tdata = key;\r\n\t\t\tkey = false;\r\n\t\t}\r\n\t\t\r\n\t\tvar sheet = this.lookupSheet(key);\r\n\t\t\r\n\t\treturn sheet ? sheet.setData(data) : false;\t\r\n\t}\r\n\t\r\n\tgetSheetData(key){\r\n\t\tvar sheet = this.lookupSheet(key);\r\n\t\t\r\n\t\treturn sheet ? sheet.getData() : false;\t\r\n\t}\r\n\t\r\n\tclearSheet(key){\r\n\t\tvar sheet = this.lookupSheet(key);\r\n\t\t\r\n\t\treturn sheet ? sheet.clear() : false;\r\n\t}\r\n\t\r\n\tremoveSheetFunc(key){\r\n\t\tvar sheet = this.lookupSheet(key);\r\n\t\t\r\n\t\tif(sheet){\r\n\t\t\tthis.removeSheet(sheet);\r\n\t\t}\r\n\t}\r\n\t\r\n\tactiveSheetFunc(key){\r\n\t\tvar sheet = this.lookupSheet(key);\r\n\t\t\r\n\t\treturn sheet ? this.loadSheet(sheet) : false;\r\n\t}\r\n}\n\nclass Tooltip extends Module{\n\n\tstatic moduleName = \"tooltip\";\n\t\n\tconstructor(table){\n\t\tsuper(table);\n\t\t\n\t\tthis.tooltipSubscriber = null,\n\t\tthis.headerSubscriber = null,\n\t\t\n\t\tthis.timeout = null;\n\t\tthis.popupInstance = null;\n\t\t\n\t\t// this.registerTableOption(\"tooltipGenerationMode\", undefined); //deprecated\n\t\tthis.registerTableOption(\"tooltipDelay\", 300); \n\t\t\n\t\tthis.registerColumnOption(\"tooltip\");\n\t\tthis.registerColumnOption(\"headerTooltip\");\n\t}\n\t\n\tinitialize(){\n\t\tthis.deprecatedOptionsCheck();\n\t\t\n\t\tthis.subscribe(\"column-init\", this.initializeColumn.bind(this));\n\t}\n\t\n\tdeprecatedOptionsCheck(){\n\t\t// this.deprecationCheckMsg(\"tooltipGenerationMode\", \"This option is no longer needed as tooltips are always generated on hover now\");\n\t}\t\n\t\n\tinitializeColumn(column){\n\t\tif(column.definition.headerTooltip && !this.headerSubscriber){\n\t\t\tthis.headerSubscriber = true;\n\t\t\t\n\t\t\tthis.subscribe(\"column-mousemove\", this.mousemoveCheck.bind(this, \"headerTooltip\"));\n\t\t\tthis.subscribe(\"column-mouseout\", this.mouseoutCheck.bind(this, \"headerTooltip\"));\n\t\t}\n\t\t\n\t\tif(column.definition.tooltip && !this.tooltipSubscriber){\n\t\t\tthis.tooltipSubscriber = true;\n\t\t\t\n\t\t\tthis.subscribe(\"cell-mousemove\", this.mousemoveCheck.bind(this, \"tooltip\"));\n\t\t\tthis.subscribe(\"cell-mouseout\", this.mouseoutCheck.bind(this, \"tooltip\"));\n\t\t}\n\t}\n\t\n\tmousemoveCheck(action, e, component){\n\t\tvar tooltip = action === \"tooltip\" ? component.column.definition.tooltip : component.definition.headerTooltip;\n\t\t\n\t\tif(tooltip){\n\t\t\tthis.clearPopup();\n\t\t\tthis.timeout = setTimeout(this.loadTooltip.bind(this, e, component, tooltip), this.table.options.tooltipDelay);\n\t\t}\n\t}\n\n\tmouseoutCheck(action, e, component){\n\t\tif(!this.popupInstance){\n\t\t\tthis.clearPopup();\n\t\t}\n\t}\n\t\n\tclearPopup(action, e, component){\n\t\tclearTimeout(this.timeout);\n\t\tthis.timeout = null;\n\t\t\n\t\tif(this.popupInstance){\n\t\t\tthis.popupInstance.hide();\n\t\t}\n\t}\n\t\n\tloadTooltip(e, component, tooltip){\n\t\tvar contentsEl, renderedCallback, coords;\n\n\t\tfunction onRendered(callback){\n\t\t\trenderedCallback = callback;\n\t\t}\n\t\t\n\t\tif(typeof tooltip === \"function\"){\n\t\t\ttooltip = tooltip(e, component.getComponent(), onRendered);\n\t\t}\n\t\t\n\t\tif(tooltip instanceof HTMLElement){\n\t\t\tcontentsEl = tooltip;\n\t\t}else {\n\t\t\tcontentsEl = document.createElement(\"div\");\n\t\t\t\n\t\t\tif(tooltip === true){\n\t\t\t\tif(component instanceof Cell){\n\t\t\t\t\ttooltip = component.value;\n\t\t\t\t}else {\n\t\t\t\t\tif(component.definition.field){\n\t\t\t\t\t\tthis.langBind(\"columns|\" + component.definition.field, (value) => {\n\t\t\t\t\t\t\tcontentsEl.innerHTML = tooltip = value || component.definition.title;\n\t\t\t\t\t\t});\n\t\t\t\t\t}else {\n\t\t\t\t\t\ttooltip = component.definition.title;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tcontentsEl.innerHTML = tooltip;\n\t\t}\n\t\t\n\t\tif(tooltip || tooltip === 0 || tooltip === false){\n\t\t\tcontentsEl.classList.add(\"tabulator-tooltip\");\n\n\t\t\tcontentsEl.addEventListener(\"mousemove\", e => e.preventDefault());\n\t\t\t\n\t\t\tthis.popupInstance = this.popup(contentsEl);\n\t\t\t\n\t\t\tif(typeof renderedCallback === \"function\"){\n\t\t\t\tthis.popupInstance.renderCallback(renderedCallback);\n\t\t\t}\n\n\t\t\tcoords = this.popupInstance.containerEventCoords(e);\n\t\t\t\n\t\t\tthis.popupInstance.show(coords.x + 15, coords.y + 15).hideOnBlur(() => {\n\t\t\t\tthis.dispatchExternal(\"TooltipClosed\", component.getComponent());\n\t\t\t\tthis.popupInstance = null;\n\t\t\t});\n\t\t\t\n\t\t\tthis.dispatchExternal(\"TooltipOpened\", component.getComponent());\n\t\t}\n\t}\n}\n\nvar defaultValidators = {\n\t//is integer\n\tinteger: function(cell, value, parameters){\n\t\tif(value === \"\" || value === null || typeof value === \"undefined\"){\n\t\t\treturn true;\n\t\t}\n\n\t\tvalue = Number(value);\n\n\t\treturn !isNaN(value) && isFinite(value) && Math.floor(value) === value;\n\t},\n\n\t//is float\n\tfloat: function(cell, value, parameters){\n\t\tif(value === \"\" || value === null || typeof value === \"undefined\"){\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\tvalue = Number(value);\n\n\t\treturn !isNaN(value) && isFinite(value) && value % 1 !== 0;\n\t},\n\n\t//must be a number\n\tnumeric: function(cell, value, parameters){\n\t\tif(value === \"\" || value === null || typeof value === \"undefined\"){\n\t\t\treturn true;\n\t\t}\n\t\treturn !isNaN(value);\n\t},\n\n\t//must be a string\n\tstring: function(cell, value, parameters){\n\t\tif(value === \"\" || value === null || typeof value === \"undefined\"){\n\t\t\treturn true;\n\t\t}\n\t\treturn isNaN(value);\n\t},\n\n\t//must be alphanumeric\n\talphanumeric: function(cell, value, parameters){\n\t\tif(value === \"\" || value === null || typeof value === \"undefined\"){\n\t\t\treturn true;\n\t\t}\n\n\t\tvar reg = new RegExp(/^[a-z0-9]+$/i);\n\n\t\treturn reg.test(value);\n\t},\n\n\t//maximum value\n\tmax: function(cell, value, parameters){\n\t\tif(value === \"\" || value === null || typeof value === \"undefined\"){\n\t\t\treturn true;\n\t\t}\n\t\treturn parseFloat(value) <= parameters;\n\t},\n\n\t//minimum value\n\tmin: function(cell, value, parameters){\n\t\tif(value === \"\" || value === null || typeof value === \"undefined\"){\n\t\t\treturn true;\n\t\t}\n\t\treturn parseFloat(value) >= parameters;\n\t},\n\n\t//starts with value\n\tstarts: function(cell, value, parameters){\n\t\tif(value === \"\" || value === null || typeof value === \"undefined\"){\n\t\t\treturn true;\n\t\t}\n\t\treturn String(value).toLowerCase().startsWith(String(parameters).toLowerCase());\n\t},\n\n\t//ends with value\n\tends: function(cell, value, parameters){\n\t\tif(value === \"\" || value === null || typeof value === \"undefined\"){\n\t\t\treturn true;\n\t\t}\n\t\treturn String(value).toLowerCase().endsWith(String(parameters).toLowerCase());\n\t},\n\n\n\t//minimum string length\n\tminLength: function(cell, value, parameters){\n\t\tif(value === \"\" || value === null || typeof value === \"undefined\"){\n\t\t\treturn true;\n\t\t}\n\t\treturn String(value).length >= parameters;\n\t},\n\n\t//maximum string length\n\tmaxLength: function(cell, value, parameters){\n\t\tif(value === \"\" || value === null || typeof value === \"undefined\"){\n\t\t\treturn true;\n\t\t}\n\t\treturn String(value).length <= parameters;\n\t},\n\n\t//in provided value list\n\tin: function(cell, value, parameters){\n\t\tif(value === \"\" || value === null || typeof value === \"undefined\"){\n\t\t\treturn true;\n\t\t}\n\n\t\tif(typeof parameters == \"string\"){\n\t\t\tparameters = parameters.split(\"|\");\n\t\t}\n\n\t\treturn parameters.indexOf(value) > -1;\n\t},\n\n\t//must match provided regex\n\tregex: function(cell, value, parameters){\n\t\tif(value === \"\" || value === null || typeof value === \"undefined\"){\n\t\t\treturn true;\n\t\t}\n\t\tvar reg = new RegExp(parameters);\n\n\t\treturn reg.test(value);\n\t},\n\n\t//value must be unique in this column\n\tunique: function(cell, value, parameters){\n\t\tif(value === \"\" || value === null || typeof value === \"undefined\"){\n\t\t\treturn true;\n\t\t}\n\t\tvar unique = true;\n\n\t\tvar cellData = cell.getData();\n\t\tvar column = cell.getColumn()._getSelf();\n\n\t\tthis.table.rowManager.rows.forEach(function(row){\n\t\t\tvar data = row.getData();\n\n\t\t\tif(data !== cellData){\n\t\t\t\tif(value == column.getFieldValue(data)){\n\t\t\t\t\tunique = false;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn unique;\n\t},\n\n\t//must have a value\n\trequired:function(cell, value, parameters){\n\t\treturn value !== \"\" && value !== null && typeof value !== \"undefined\";\n\t},\n};\n\nclass Validate extends Module{\n\n\tstatic moduleName = \"validate\";\n\n\t//load defaults\n\tstatic validators = defaultValidators;\n\t\n\tconstructor(table){\n\t\tsuper(table);\n\t\t\n\t\tthis.invalidCells = [];\n\t\t\n\t\tthis.registerTableOption(\"validationMode\", \"blocking\");\n\t\t\n\t\tthis.registerColumnOption(\"validator\");\n\t\t\n\t\tthis.registerTableFunction(\"getInvalidCells\", this.getInvalidCells.bind(this));\n\t\tthis.registerTableFunction(\"clearCellValidation\", this.userClearCellValidation.bind(this));\n\t\tthis.registerTableFunction(\"validate\", this.userValidate.bind(this));\n\t\t\n\t\tthis.registerComponentFunction(\"cell\", \"isValid\", this.cellIsValid.bind(this));\n\t\tthis.registerComponentFunction(\"cell\", \"clearValidation\", this.clearValidation.bind(this));\n\t\tthis.registerComponentFunction(\"cell\", \"validate\", this.cellValidate.bind(this));\n\t\t\n\t\tthis.registerComponentFunction(\"column\", \"validate\", this.columnValidate.bind(this));\n\t\tthis.registerComponentFunction(\"row\", \"validate\", this.rowValidate.bind(this));\n\t}\n\t\n\t\n\tinitialize(){\n\t\tthis.subscribe(\"cell-delete\", this.clearValidation.bind(this));\n\t\tthis.subscribe(\"column-layout\", this.initializeColumnCheck.bind(this));\n\t\t\n\t\tthis.subscribe(\"edit-success\", this.editValidate.bind(this));\n\t\tthis.subscribe(\"edit-editor-clear\", this.editorClear.bind(this));\n\t\tthis.subscribe(\"edit-edited-clear\", this.editedClear.bind(this));\n\t}\n\t\n\t///////////////////////////////////\n\t///////// Event Handling //////////\n\t///////////////////////////////////\n\t\n\teditValidate(cell, value, previousValue){\n\t\tvar valid = this.table.options.validationMode !== \"manual\" ? this.validate(cell.column.modules.validate, cell, value) : true;\n\t\t\n\t\t// allow time for editor to make render changes then style cell\n\t\tif(valid !== true){\n\t\t\tsetTimeout(() => {\n\t\t\t\tcell.getElement().classList.add(\"tabulator-validation-fail\");\n\t\t\t\tthis.dispatchExternal(\"validationFailed\", cell.getComponent(), value, valid);\n\t\t\t});\n\t\t}\n\t\t\n\t\treturn valid;\n\t}\n\t\n\teditorClear(cell, cancelled){\n\t\tif(cancelled){\n\t\t\tif(cell.column.modules.validate){\n\t\t\t\tthis.cellValidate(cell);\n\t\t\t}\n\t\t}\n\n\t\tcell.getElement().classList.remove(\"tabulator-validation-fail\");\n\t}\n\t\n\teditedClear(cell){\n\t\tif(cell.modules.validate){\n\t\t\tcell.modules.validate.invalid = false;\n\t\t}\n\t}\n\t\n\t///////////////////////////////////\n\t////////// Cell Functions /////////\n\t///////////////////////////////////\n\t\n\tcellIsValid(cell){\n\t\treturn cell.modules.validate ? (cell.modules.validate.invalid || true) : true;\n\t}\n\t\n\tcellValidate(cell){\n\t\treturn this.validate(cell.column.modules.validate, cell, cell.getValue());\n\t}\n\t\n\t///////////////////////////////////\n\t///////// Column Functions ////////\n\t///////////////////////////////////\n\t\n\tcolumnValidate(column){\n\t\tvar invalid = [];\n\t\t\n\t\tcolumn.cells.forEach((cell) => {\n\t\t\tif(this.cellValidate(cell) !== true){\n\t\t\t\tinvalid.push(cell.getComponent());\n\t\t\t}\n\t\t});\n\t\t\n\t\treturn invalid.length ? invalid : true;\n\t}\n\t\n\t///////////////////////////////////\n\t////////// Row Functions //////////\n\t///////////////////////////////////\n\t\n\trowValidate(row){\n\t\tvar invalid = [];\n\t\t\n\t\trow.cells.forEach((cell) => {\n\t\t\tif(this.cellValidate(cell) !== true){\n\t\t\t\tinvalid.push(cell.getComponent());\n\t\t\t}\n\t\t});\n\t\t\n\t\treturn invalid.length ? invalid : true;\n\t}\n\t\n\t///////////////////////////////////\n\t///////// Table Functions /////////\n\t///////////////////////////////////\n\t\n\t\n\tuserClearCellValidation(cells){\n\t\tif(!cells){\n\t\t\tcells = this.getInvalidCells();\n\t\t}\n\t\t\n\t\tif(!Array.isArray(cells)){\n\t\t\tcells = [cells];\n\t\t}\n\t\t\n\t\tcells.forEach((cell) => {\n\t\t\tthis.clearValidation(cell._getSelf());\n\t\t});\n\t}\n\t\n\tuserValidate(cells){\n\t\tvar output = [];\n\t\t\n\t\t//clear row data\n\t\tthis.table.rowManager.rows.forEach((row) => {\n\t\t\trow = row.getComponent();\n\t\t\t\n\t\t\tvar valid = row.validate();\n\t\t\t\n\t\t\tif(valid !== true){\n\t\t\t\toutput = output.concat(valid);\n\t\t\t}\n\t\t});\n\t\t\n\t\treturn output.length ? output : true;\n\t}\n\t\n\t///////////////////////////////////\n\t///////// Internal Logic //////////\n\t///////////////////////////////////\n\t\n\tinitializeColumnCheck(column){\n\t\tif(typeof column.definition.validator !== \"undefined\"){\n\t\t\tthis.initializeColumn(column);\n\t\t}\n\t}\n\t\n\t//validate\n\tinitializeColumn(column){\n\t\tvar self = this,\n\t\tconfig = [],\n\t\tvalidator;\n\t\t\n\t\tif(column.definition.validator){\n\t\t\t\n\t\t\tif(Array.isArray(column.definition.validator)){\n\t\t\t\tcolumn.definition.validator.forEach((item) => {\n\t\t\t\t\tvalidator = self._extractValidator(item);\n\t\t\t\t\t\n\t\t\t\t\tif(validator){\n\t\t\t\t\t\tconfig.push(validator);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n\t\t\t}else {\n\t\t\t\tvalidator = this._extractValidator(column.definition.validator);\n\t\t\t\t\n\t\t\t\tif(validator){\n\t\t\t\t\tconfig.push(validator);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tcolumn.modules.validate = config.length ? config : false;\n\t\t}\n\t}\n\t\n\t_extractValidator(value){\n\t\tvar type, params, pos;\n\t\t\n\t\tswitch(typeof value){\n\t\t\tcase \"string\":\n\t\t\t\tpos = value.indexOf(':');\n\t\t\t\n\t\t\t\tif(pos > -1){\n\t\t\t\t\ttype = value.substring(0,pos);\n\t\t\t\t\tparams = value.substring(pos+1);\n\t\t\t\t}else {\n\t\t\t\t\ttype = value;\n\t\t\t\t}\n\t\t\t\n\t\t\t\treturn this._buildValidator(type, params);\n\t\t\t\n\t\t\tcase \"function\":\n\t\t\t\treturn this._buildValidator(value);\n\t\t\t\n\t\t\tcase \"object\":\n\t\t\t\treturn this._buildValidator(value.type, value.parameters);\n\t\t}\n\t}\n\t\n\t_buildValidator(type, params){\n\t\t\n\t\tvar func = typeof type == \"function\" ? type : Validate.validators[type];\n\t\t\n\t\tif(!func){\n\t\t\tconsole.warn(\"Validator Setup Error - No matching validator found:\", type);\n\t\t\treturn false;\n\t\t}else {\n\t\t\treturn {\n\t\t\t\ttype:typeof type == \"function\" ? \"function\" : type,\n\t\t\t\tfunc:func,\n\t\t\t\tparams:params,\n\t\t\t};\n\t\t}\n\t}\n\t\n\tvalidate(validators, cell, value){\n\t\tvar self = this,\n\t\tfailedValidators = [],\n\t\tinvalidIndex = this.invalidCells.indexOf(cell);\n\t\t\n\t\tif(validators){\n\t\t\tvalidators.forEach((item) => {\n\t\t\t\tif(!item.func.call(self, cell.getComponent(), value, item.params)){\n\t\t\t\t\tfailedValidators.push({\n\t\t\t\t\t\ttype:item.type,\n\t\t\t\t\t\tparameters:item.params\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t\n\t\tif(!cell.modules.validate){\n\t\t\tcell.modules.validate = {};\n\t\t}\n\t\t\n\t\tif(!failedValidators.length){\n\t\t\tcell.modules.validate.invalid = false;\n\t\t\tcell.getElement().classList.remove(\"tabulator-validation-fail\");\n\t\t\t\n\t\t\tif(invalidIndex > -1){\n\t\t\t\tthis.invalidCells.splice(invalidIndex, 1);\n\t\t\t}\n\t\t}else {\n\t\t\tcell.modules.validate.invalid = failedValidators;\n\t\t\t\n\t\t\tif(this.table.options.validationMode !== \"manual\"){\n\t\t\t\tcell.getElement().classList.add(\"tabulator-validation-fail\");\n\t\t\t}\n\t\t\t\n\t\t\tif(invalidIndex == -1){\n\t\t\t\tthis.invalidCells.push(cell);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn failedValidators.length ? failedValidators : true;\n\t}\n\t\n\tgetInvalidCells(){\n\t\tvar output = [];\n\t\t\n\t\tthis.invalidCells.forEach((cell) => {\n\t\t\toutput.push(cell.getComponent());\n\t\t});\n\t\t\n\t\treturn output;\n\t}\n\t\n\tclearValidation(cell){\n\t\tvar invalidIndex;\n\t\t\n\t\tif(cell.modules.validate && cell.modules.validate.invalid){\n\t\t\t\n\t\t\tcell.getElement().classList.remove(\"tabulator-validation-fail\");\n\t\t\tcell.modules.validate.invalid = false;\n\t\t\t\n\t\t\tinvalidIndex = this.invalidCells.indexOf(cell);\n\t\t\t\n\t\t\tif(invalidIndex > -1){\n\t\t\t\tthis.invalidCells.splice(invalidIndex, 1);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvar allModules = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tAccessorModule: Accessor,\n\tAjaxModule: Ajax,\n\tClipboardModule: Clipboard,\n\tColumnCalcsModule: ColumnCalcs,\n\tDataTreeModule: DataTree,\n\tDownloadModule: Download,\n\tEditModule: Edit,\n\tExportModule: Export,\n\tFilterModule: Filter,\n\tFormatModule: Format,\n\tFrozenColumnsModule: FrozenColumns,\n\tFrozenRowsModule: FrozenRows,\n\tGroupRowsModule: GroupRows,\n\tHistoryModule: History,\n\tHtmlTableImportModule: HtmlTableImport,\n\tImportModule: Import,\n\tInteractionModule: Interaction,\n\tKeybindingsModule: Keybindings,\n\tMenuModule: Menu,\n\tMoveColumnsModule: MoveColumns,\n\tMoveRowsModule: MoveRows,\n\tMutatorModule: Mutator,\n\tPageModule: Page,\n\tPersistenceModule: Persistence,\n\tPopupModule: Popup,\n\tPrintModule: Print,\n\tReactiveDataModule: ReactiveData,\n\tResizeColumnsModule: ResizeColumns,\n\tResizeRowsModule: ResizeRows,\n\tResizeTableModule: ResizeTable,\n\tResponsiveLayoutModule: ResponsiveLayout,\n\tSelectRangeModule: SelectRange,\n\tSelectRowModule: SelectRow,\n\tSortModule: Sort,\n\tSpreadsheetModule: Spreadsheet,\n\tTooltipModule: Tooltip,\n\tValidateModule: Validate\n});\n\nvar defaultOptions = {\n\n\tdebugEventsExternal:false, //flag to console log events\n\tdebugEventsInternal:false, //flag to console log events\n\tdebugInvalidOptions:true, //allow toggling of invalid option warnings\n\tdebugInvalidComponentFuncs:true, //allow toggling of invalid component warnings\n\tdebugInitialization:true, //allow toggling of pre initialization function call warnings\n\tdebugDeprecation:true, //allow toggling of deprecation warnings\n\n\theight:false, //height of tabulator\n\tminHeight:false, //minimum height of tabulator\n\tmaxHeight:false, //maximum height of tabulator\n\n\tcolumnHeaderVertAlign:\"top\", //vertical alignment of column headers\n\n\tpopupContainer:false,\n\n\tcolumns:[],//store for colum header info\n\tcolumnDefaults:{}, //store column default props\n\trowHeader:false,\n\n\tdata:false, //default starting data\n\n\tautoColumns:false, //build columns from data row structure\n\tautoColumnsDefinitions:false,\n\n\tnestedFieldSeparator:\".\", //separator for nested data\n\n\tfooterElement:false, //hold footer element\n\n\tindex:\"id\", //filed for row index\n\n\ttextDirection:\"auto\",\n\n\taddRowPos:\"bottom\", //position to insert blank rows, top|bottom\n\n\theaderVisible:true, //hide header\n\n\trenderVertical:\"virtual\",\n\trenderHorizontal:\"basic\",\n\trenderVerticalBuffer:0, // set virtual DOM buffer size\n\n\tscrollToRowPosition:\"top\",\n\tscrollToRowIfVisible:true,\n\n\tscrollToColumnPosition:\"left\",\n\tscrollToColumnIfVisible:true,\n\n\trowFormatter:false,\n\trowFormatterPrint:null,\n\trowFormatterClipboard:null,\n\trowFormatterHtmlOutput:null,\n\n\trowHeight:null,\n\n\tplaceholder:false,\n\n\tdataLoader:true,\n\tdataLoaderLoading:false,\n\tdataLoaderError:false,\n\tdataLoaderErrorTimeout:3000,\n\tdataSendParams:{},\n\tdataReceiveParams:{},\n\n\tdependencies:{},\n};\n\nclass OptionsList {\n\tconstructor(table, msgType, defaults = {}){\n\t\tthis.table = table;\n\t\tthis.msgType = msgType;\n\t\tthis.registeredDefaults = Object.assign({}, defaults);\n\t}\n\t\n\tregister(option, value){\n\t\tthis.registeredDefaults[option] = value;\n\t}\n\t\n\tgenerate(defaultOptions, userOptions = {}){\n\t\tvar output = Object.assign({}, this.registeredDefaults),\n\t\twarn = this.table.options.debugInvalidOptions || userOptions.debugInvalidOptions === true;\n\t\t\n\t\tObject.assign(output, defaultOptions);\n\t\t\n\t\tfor (let key in userOptions){\n\t\t\tif(!output.hasOwnProperty(key)){\n\t\t\t\tif(warn){\n\t\t\t\t\tconsole.warn(\"Invalid \" + this.msgType + \" option:\", key);\n\t\t\t\t}\n\n\t\t\t\toutput[key] = userOptions.key;\n\t\t\t}\n\t\t}\n\t\n\t\t\n\t\tfor (let key in output){\n\t\t\tif(key in userOptions){\n\t\t\t\toutput[key] = userOptions[key];\n\t\t\t}else {\n\t\t\t\tif(Array.isArray(output[key])){\n\t\t\t\t\toutput[key] = Object.assign([], output[key]);\n\t\t\t\t}else if(typeof output[key] === \"object\" && output[key] !== null){\n\t\t\t\t\toutput[key] = Object.assign({}, output[key]);\n\t\t\t\t}else if (typeof output[key] === \"undefined\"){\n\t\t\t\t\tdelete output[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn output;\n\t}\n}\n\nclass Renderer extends CoreFeature{\n\tconstructor(table){\n\t\tsuper(table);\n\n\t\tthis.elementVertical = table.rowManager.element;\n\t\tthis.elementHorizontal = table.columnManager.element;\n\t\tthis.tableElement = table.rowManager.tableElement;\n\n\t\tthis.verticalFillMode = \"fit\"; // used by row manager to determine how to size the render area (\"fit\" - fits container to the contents, \"fill\" - fills the container without resizing it)\n\t}\n\n\n\t///////////////////////////////////\n\t/////// Internal Bindings /////////\n\t///////////////////////////////////\n\n\tinitialize(){\n\t\t//initialize core functionality\n\t}\n\n\tclearRows(){\n\t\t//clear down existing rows layout\n\t}\n\n\tclearColumns(){\n\t\t//clear down existing columns layout\n\t}\n\n\n\treinitializeColumnWidths(columns){\n\t\t//resize columns to fit data\n\t}\n\n\n\trenderRows(){\n\t\t//render rows from a clean slate\n\t}\n\n\trenderColumns(){\n\t\t//render columns from a clean slate\n\t}\n\n\trerenderRows(callback){\n\t\t// rerender rows and keep position\n\t\tif(callback){\n\t\t\tcallback();\n\t\t}\n\t}\n\n\trerenderColumns(update, blockRedraw){\n\t\t//rerender columns\n\t}\n\n\trenderRowCells(row){\n\t\t//render the cells in a row\n\t}\n\n\trerenderRowCells(row, force){\n\t\t//rerender the cells in a row\n\t}\n\n\tscrollColumns(left, dir){\n\t\t//handle horizontal scrolling\n\t}\n\n\tscrollRows(top, dir){\n\t\t//handle vertical scrolling\n\t}\n\n\tresize(){\n\t\t//container has resized, carry out any needed recalculations (DO NOT RERENDER IN THIS FUNCTION)\n\t}\n\n\tscrollToRow(row){\n\t\t//scroll to a specific row\n\t}\n\n\tscrollToRowNearestTop(row){\n\t\t//determine weather the row is nearest the top or bottom of the table, return true for top or false for bottom\n\t}\n\n\tvisibleRows(includingBuffer){\n\t\t//return the visible rows\n\t\treturn [];\n\t}\n\n\t///////////////////////////////////\n\t//////// Helper Functions /////////\n\t///////////////////////////////////\n\n\trows(){\n\t\treturn this.table.rowManager.getDisplayRows();\n\t}\n\n\tstyleRow(row, index){\n\t\tvar rowEl = row.getElement();\n\n\t\tif(index % 2){\n\t\t\trowEl.classList.add(\"tabulator-row-even\");\n\t\t\trowEl.classList.remove(\"tabulator-row-odd\");\n\t\t}else {\n\t\t\trowEl.classList.add(\"tabulator-row-odd\");\n\t\t\trowEl.classList.remove(\"tabulator-row-even\");\n\t\t}\n\t}\n\n\t///////////////////////////////////\n\t/////// External Triggers /////////\n\t/////// (DO NOT OVERRIDE) /////////\n\t///////////////////////////////////\n\n\tclear(){\n\t\t//clear down existing layout\n\t\tthis.clearRows();\n\t\tthis.clearColumns();\n\t}\n\n\trender(){\n\t\t//render from a clean slate\n\t\tthis.renderRows();\n\t\tthis.renderColumns();\n\t}\n\n\trerender(callback){\n\t\t// rerender and keep position\n\t\tthis.rerenderRows();\n\t\tthis.rerenderColumns();\n\t}\n\n\tscrollToRowPosition(row, position, ifVisible){\n\t\tvar rowIndex = this.rows().indexOf(row),\n\t\trowEl = row.getElement(),\n\t\toffset = 0;\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif(rowIndex > -1){\n\n\t\t\t\tif(typeof ifVisible === \"undefined\"){\n\t\t\t\t\tifVisible = this.table.options.scrollToRowIfVisible;\n\t\t\t\t}\n\n\t\t\t\t//check row visibility\n\t\t\t\tif(!ifVisible){\n\t\t\t\t\tif(Helpers.elVisible(rowEl)){\n\t\t\t\t\t\toffset = Helpers.elOffset(rowEl).top - Helpers.elOffset(this.elementVertical).top;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(offset > 0 && offset < this.elementVertical.clientHeight - rowEl.offsetHeight){\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(typeof position === \"undefined\"){\n\t\t\t\t\tposition = this.table.options.scrollToRowPosition;\n\t\t\t\t}\n\n\t\t\t\tif(position === \"nearest\"){\n\t\t\t\t\tposition = this.scrollToRowNearestTop(row) ? \"top\" : \"bottom\";\n\t\t\t\t}\n\n\t\t\t\t//scroll to row\n\t\t\t\tthis.scrollToRow(row);\n\n\t\t\t\t//align to correct position\n\t\t\t\tswitch(position){\n\t\t\t\t\tcase \"middle\":\n\t\t\t\t\tcase \"center\":\n\n\t\t\t\t\t\tif(this.elementVertical.scrollHeight - this.elementVertical.scrollTop == this.elementVertical.clientHeight){\n\t\t\t\t\t\t\tthis.elementVertical.scrollTop = this.elementVertical.scrollTop + (rowEl.offsetTop - this.elementVertical.scrollTop) - ((this.elementVertical.scrollHeight - rowEl.offsetTop) / 2);\n\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\tthis.elementVertical.scrollTop = this.elementVertical.scrollTop - (this.elementVertical.clientHeight / 2);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"bottom\":\n\n\t\t\t\t\t\tif(this.elementVertical.scrollHeight - this.elementVertical.scrollTop == this.elementVertical.clientHeight){\n\t\t\t\t\t\t\tthis.elementVertical.scrollTop = this.elementVertical.scrollTop - (this.elementVertical.scrollHeight - rowEl.offsetTop) + rowEl.offsetHeight;\n\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\tthis.elementVertical.scrollTop = this.elementVertical.scrollTop - this.elementVertical.clientHeight + rowEl.offsetHeight;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"top\":\n\t\t\t\t\t\tthis.elementVertical.scrollTop = rowEl.offsetTop;\t\t\t\t\t\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tresolve();\n\n\t\t\t}else {\n\t\t\t\tconsole.warn(\"Scroll Error - Row not visible\");\n\t\t\t\treject(\"Scroll Error - Row not visible\");\n\t\t\t}\n\t\t});\n\t}\n}\n\nclass BasicHorizontal extends Renderer{\n\tconstructor(table){\n\t\tsuper(table);\n\t}\n\t\n\trenderRowCells(row, inFragment) {\n\t\tconst rowFrag = document.createDocumentFragment();\n\t\trow.cells.forEach((cell) => {\n\t\t\trowFrag.appendChild(cell.getElement());\n\t\t});\n\t\trow.element.appendChild(rowFrag);\n\t\t\n\t\tif(!inFragment){\n\t\t\trow.cells.forEach((cell) => {\n\t\t\t\tcell.cellRendered();\n\t\t\t});\n\t\t}\n\t}\n\t\n\treinitializeColumnWidths(columns){\n\t\tcolumns.forEach(function(column){\n\t\t\tcolumn.reinitializeWidth();\n\t\t});\n\t}\n}\n\nclass VirtualDomHorizontal extends Renderer{\n\tconstructor(table){\n\t\tsuper(table);\n\t\t\n\t\tthis.leftCol = 0;\n\t\tthis.rightCol = 0;\n\t\tthis.scrollLeft = 0;\n\t\t\n\t\tthis.vDomScrollPosLeft = 0;\n\t\tthis.vDomScrollPosRight = 0;\n\t\t\n\t\tthis.vDomPadLeft = 0;\n\t\tthis.vDomPadRight = 0;\n\t\t\n\t\tthis.fitDataColAvg = 0;\n\t\t\n\t\tthis.windowBuffer = 200; //pixel margin to make column visible before it is shown on screen\n\t\t\n\t\tthis.visibleRows = null;\n\t\t\n\t\tthis.initialized = false;\n\t\tthis.isFitData = false;\n\t\t\n\t\tthis.columns = [];\n\t}\n\t\n\tinitialize(){\n\t\tthis.compatibilityCheck();\n\t\tthis.layoutCheck();\n\t\tthis.vertScrollListen();\n\t}\n\t\n\tcompatibilityCheck(){\t\t\n\t\tif(this.options(\"layout\") == \"fitDataTable\"){\n\t\t\tconsole.warn(\"Horizontal Virtual DOM is not compatible with fitDataTable layout mode\");\n\t\t}\n\t\t\n\t\tif(this.options(\"responsiveLayout\")){\n\t\t\tconsole.warn(\"Horizontal Virtual DOM is not compatible with responsive columns\");\n\t\t}\n\t\t\n\t\tif(this.options(\"rtl\")){\n\t\t\tconsole.warn(\"Horizontal Virtual DOM is not currently compatible with RTL text direction\");\n\t\t}\n\t}\n\t\n\tlayoutCheck(){\n\t\tthis.isFitData = this.options(\"layout\").startsWith('fitData');\n\t}\n\t\n\tvertScrollListen(){\n\t\tthis.subscribe(\"scroll-vertical\", this.clearVisRowCache.bind(this));\n\t\tthis.subscribe(\"data-refreshed\", this.clearVisRowCache.bind(this));\n\t}\n\t\n\tclearVisRowCache(){\n\t\tthis.visibleRows = null;\n\t}\n\t\n\t//////////////////////////////////////\n\t///////// Public Functions ///////////\n\t//////////////////////////////////////\n\t\n\trenderColumns(row, force){\n\t\tthis.dataChange();\n\t}\n\t\n\t\n\tscrollColumns(left, dir){\n\t\tif(this.scrollLeft != left){\n\t\t\tthis.scrollLeft = left;\n\t\t\t\n\t\t\tthis.scroll(left - (this.vDomScrollPosLeft + this.windowBuffer));\n\t\t}\n\t}\n\t\n\tcalcWindowBuffer(){\n\t\tvar buffer = this.elementVertical.clientWidth;\n\t\t\n\t\tthis.table.columnManager.columnsByIndex.forEach((column) => {\n\t\t\tif(column.visible){\n\t\t\t\tvar width = column.getWidth();\n\t\t\t\t\n\t\t\t\tif(width > buffer){\n\t\t\t\t\tbuffer = width;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t\n\t\tthis.windowBuffer = buffer * 2;\n\t}\n\t\n\trerenderColumns(update, blockRedraw){\t\t\n\t\tvar old = {\n\t\t\tcols:this.columns,\n\t\t\tleftCol:this.leftCol,\n\t\t\trightCol:this.rightCol,\n\t\t},\n\t\tcolPos = 0;\n\t\t\n\t\tif(update && !this.initialized){\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tthis.clear();\n\t\t\n\t\tthis.calcWindowBuffer();\n\t\t\n\t\tthis.scrollLeft = this.elementVertical.scrollLeft;\n\t\t\n\t\tthis.vDomScrollPosLeft = this.scrollLeft - this.windowBuffer;\n\t\tthis.vDomScrollPosRight = this.scrollLeft + this.elementVertical.clientWidth + this.windowBuffer;\n\t\t\n\t\tthis.table.columnManager.columnsByIndex.forEach((column) => {\n\t\t\tvar config = {},\n\t\t\twidth;\n\t\t\t\n\t\t\tif(column.visible){\n\t\t\t\tif(!column.modules.frozen){\t\t\t\n\t\t\t\t\twidth = column.getWidth();\n\t\t\t\t\t\n\t\t\t\t\tconfig.leftPos = colPos;\n\t\t\t\t\tconfig.rightPos = colPos + width;\n\t\t\t\t\t\n\t\t\t\t\tconfig.width = width;\n\t\t\t\t\t\n\t\t\t\t\tif (this.isFitData) {\n\t\t\t\t\t\tconfig.fitDataCheck = column.modules.vdomHoz ? column.modules.vdomHoz.fitDataCheck : true;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif((colPos + width > this.vDomScrollPosLeft) && (colPos < this.vDomScrollPosRight)){\n\t\t\t\t\t\t//column is visible\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(this.leftCol == -1){\n\t\t\t\t\t\t\tthis.leftCol = this.columns.length;\n\t\t\t\t\t\t\tthis.vDomPadLeft = colPos;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.rightCol = this.columns.length;\n\t\t\t\t\t}else {\n\t\t\t\t\t\t// column is hidden\n\t\t\t\t\t\tif(this.leftCol !== -1){\n\t\t\t\t\t\t\tthis.vDomPadRight += width;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tthis.columns.push(column);\n\t\t\t\t\t\n\t\t\t\t\tcolumn.modules.vdomHoz = config;\n\t\t\t\t\t\n\t\t\t\t\tcolPos += width;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t\n\t\tthis.tableElement.style.paddingLeft = this.vDomPadLeft + \"px\";\n\t\tthis.tableElement.style.paddingRight = this.vDomPadRight + \"px\";\n\t\t\n\t\tthis.initialized = true;\n\t\t\n\t\tif(!blockRedraw){\n\t\t\tif(!update || this.reinitChanged(old)){\n\t\t\t\tthis.reinitializeRows();\n\t\t\t}\n\t\t}\n\t\t\n\t\tthis.elementVertical.scrollLeft = this.scrollLeft;\n\t}\n\t\n\trenderRowCells(row){\n\t\tif(this.initialized){\n\t\t\tthis.initializeRow(row);\n\t\t}else {\n\t\t\tconst rowFrag = document.createDocumentFragment();\n\t\t\trow.cells.forEach((cell) => {\n\t\t\t\trowFrag.appendChild(cell.getElement());\n\t\t\t});\n\t\t\trow.element.appendChild(rowFrag);\n\t\t\t\n\t\t\trow.cells.forEach((cell) => {\n\t\t\t\tcell.cellRendered();\n\t\t\t});\n\t\t}\n\t}\n\t\n\trerenderRowCells(row, force){\n\t\tthis.reinitializeRow(row, force);\n\t}\n\t\n\treinitializeColumnWidths(columns){\n\t\tfor(let i = this.leftCol; i <= this.rightCol; i++){\n\t\t\tlet col = this.columns[i];\n\t\t\t\n\t\t\tif(col){\n\t\t\t\tcol.reinitializeWidth();\n\t\t\t}\n\t\t}\n\t}\n\t\n\t//////////////////////////////////////\n\t//////// Internal Rendering //////////\n\t//////////////////////////////////////\n\t\n\tdeinitialize(){\n\t\tthis.initialized = false;\n\t}\n\t\n\tclear(){\n\t\tthis.columns = [];\n\t\t\n\t\tthis.leftCol = -1;\n\t\tthis.rightCol = 0;\n\t\t\n\t\tthis.vDomScrollPosLeft = 0;\n\t\tthis.vDomScrollPosRight = 0;\n\t\tthis.vDomPadLeft = 0;\n\t\tthis.vDomPadRight = 0;\n\t}\n\t\n\tdataChange(){\n\t\tvar change = false,\n\t\trow, rowEl;\n\t\t\n\t\tif(this.isFitData){\n\t\t\tthis.table.columnManager.columnsByIndex.forEach((column) => {\n\t\t\t\tif(!column.definition.width && column.visible){\n\t\t\t\t\tchange = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tif(change && this.table.rowManager.getDisplayRows().length){\n\t\t\t\tthis.vDomScrollPosRight = this.scrollLeft + this.elementVertical.clientWidth + this.windowBuffer;\n\t\t\t\t\n\t\t\t\trow = this.chain(\"rows-sample\", [1], [], () => {\n\t\t\t\t\treturn this.table.rowManager.getDisplayRows();\n\t\t\t\t})[0];\n\t\t\t\t\n\t\t\t\tif(row){\n\t\t\t\t\trowEl = row.getElement();\n\t\t\t\t\t\n\t\t\t\t\trow.generateCells();\n\t\t\t\t\t\n\t\t\t\t\tthis.tableElement.appendChild(rowEl);\n\t\t\t\t\t\n\t\t\t\t\tfor(let colEnd = 0; colEnd < row.cells.length; colEnd++){\n\t\t\t\t\t\tlet cell = row.cells[colEnd];\n\t\t\t\t\t\trowEl.appendChild(cell.getElement());\n\t\t\t\t\t\t\n\t\t\t\t\t\tcell.column.reinitializeWidth();\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\trowEl.parentNode.removeChild(rowEl);\n\t\t\t\t\t\n\t\t\t\t\tthis.rerenderColumns(false, true);\n\t\t\t\t}\n\t\t\t}\n\t\t}else {\n\t\t\tif(this.options(\"layout\") === \"fitColumns\"){\n\t\t\t\tthis.layoutRefresh();\n\t\t\t\tthis.rerenderColumns(false, true);\n\t\t\t}\n\t\t}\n\t}\n\t\n\treinitChanged(old){\n\t\tvar match = true;\n\t\t\n\t\tif(old.cols.length !== this.columns.length || old.leftCol !== this.leftCol || old.rightCol !== this.rightCol){\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\told.cols.forEach((col, i) => {\n\t\t\tif(col !== this.columns[i]){\n\t\t\t\tmatch = false;\n\t\t\t}\n\t\t});\n\t\t\n\t\treturn !match;\n\t}\n\t\n\treinitializeRows(){\n\t\tvar visibleRows = this.getVisibleRows(),\n\t\totherRows = this.table.rowManager.getRows().filter(row => !visibleRows.includes(row));\n\t\t\n\t\tvisibleRows.forEach((row) => {\n\t\t\tthis.reinitializeRow(row, true);\n\t\t});\n\t\t\n\t\totherRows.forEach((row) =>{\n\t\t\trow.deinitialize();\n\t\t});\n\t}\n\t\n\tgetVisibleRows(){\n\t\tif (!this.visibleRows){\n\t\t\tthis.visibleRows = this.table.rowManager.getVisibleRows();\n\t\t}\n\t\t\n\t\treturn this.visibleRows;\t\n\t}\n\t\n\tscroll(diff){\n\t\tthis.vDomScrollPosLeft += diff;\n\t\tthis.vDomScrollPosRight += diff;\n\t\t\n\t\tif(Math.abs(diff) > (this.windowBuffer / 2)){\n\t\t\tthis.rerenderColumns();\n\t\t}else {\n\t\t\tif(diff > 0){\n\t\t\t\t//scroll right\n\t\t\t\tthis.addColRight();\n\t\t\t\tthis.removeColLeft();\n\t\t\t}else {\n\t\t\t\t//scroll left\n\t\t\t\tthis.addColLeft();\n\t\t\t\tthis.removeColRight();\n\t\t\t}\n\t\t}\n\t}\n\t\n\tcolPositionAdjust (start, end, diff){\n\t\tfor(let i = start; i < end; i++){\n\t\t\tlet column = this.columns[i];\n\t\t\t\n\t\t\tcolumn.modules.vdomHoz.leftPos += diff;\n\t\t\tcolumn.modules.vdomHoz.rightPos += diff;\n\t\t}\n\t}\n\t\n\taddColRight(){\n\t\tvar changes = false,\n\t\tworking = true;\n\t\t\n\t\twhile(working){\n\t\t\t\n\t\t\tlet column = this.columns[this.rightCol + 1];\n\t\t\t\n\t\t\tif(column){\n\t\t\t\tif(column.modules.vdomHoz.leftPos <= this.vDomScrollPosRight){\n\t\t\t\t\tchanges = true;\n\t\t\t\t\t\n\t\t\t\t\tthis.getVisibleRows().forEach((row) => {\n\t\t\t\t\t\tif(row.type !== \"group\"){\n\t\t\t\t\t\t\tvar cell = row.getCell(column);\n\t\t\t\t\t\t\trow.getElement().insertBefore(cell.getElement(), row.getCell(this.columns[this.rightCol]).getElement().nextSibling);\n\t\t\t\t\t\t\tcell.cellRendered();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tthis.fitDataColActualWidthCheck(column);\n\t\t\t\t\t\n\t\t\t\t\tthis.rightCol++; // Don't move this below the >= check below\n\t\t\t\t\t\n\t\t\t\t\tthis.getVisibleRows().forEach((row) => {\n\t\t\t\t\t\tif(row.type !== \"group\"){\n\t\t\t\t\t\t\trow.modules.vdomHoz.rightCol = this.rightCol;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tif(this.rightCol >= (this.columns.length - 1)){\n\t\t\t\t\t\tthis.vDomPadRight = 0;\n\t\t\t\t\t}else {\n\t\t\t\t\t\tthis.vDomPadRight -= column.getWidth();\n\t\t\t\t\t}\t\n\t\t\t\t}else {\n\t\t\t\t\tworking = false;\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tworking = false;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif(changes){\n\t\t\tthis.tableElement.style.paddingRight = this.vDomPadRight + \"px\";\n\t\t}\n\t}\n\t\n\taddColLeft(){\n\t\tvar changes = false,\n\t\tworking = true;\n\t\t\n\t\twhile(working){\n\t\t\tlet column = this.columns[this.leftCol - 1];\n\t\t\t\n\t\t\tif(column){\n\t\t\t\tif(column.modules.vdomHoz.rightPos >= this.vDomScrollPosLeft){\n\t\t\t\t\tchanges = true;\n\t\t\t\t\t\n\t\t\t\t\tthis.getVisibleRows().forEach((row) => {\n\t\t\t\t\t\tif(row.type !== \"group\"){\n\t\t\t\t\t\t\tvar cell = row.getCell(column);\n\t\t\t\t\t\t\trow.getElement().insertBefore(cell.getElement(), row.getCell(this.columns[this.leftCol]).getElement());\n\t\t\t\t\t\t\tcell.cellRendered();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tthis.leftCol--; // don't move this below the <= check below\n\t\t\t\t\t\n\t\t\t\t\tthis.getVisibleRows().forEach((row) => {\n\t\t\t\t\t\tif(row.type !== \"group\"){\n\t\t\t\t\t\t\trow.modules.vdomHoz.leftCol = this.leftCol;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tif(this.leftCol <= 0){ // replicating logic in addColRight\n\t\t\t\t\t\tthis.vDomPadLeft = 0;\n\t\t\t\t\t}else {\n\t\t\t\t\t\tthis.vDomPadLeft -= column.getWidth();\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet diff = this.fitDataColActualWidthCheck(column);\n\t\t\t\t\t\n\t\t\t\t\tif(diff){\n\t\t\t\t\t\tthis.scrollLeft = this.elementVertical.scrollLeft = this.elementVertical.scrollLeft + diff;\n\t\t\t\t\t\tthis.vDomPadRight -= diff;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}else {\n\t\t\t\t\tworking = false;\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tworking = false;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif(changes){\n\t\t\tthis.tableElement.style.paddingLeft = this.vDomPadLeft + \"px\";\n\t\t}\n\t}\n\t\n\tremoveColRight(){\n\t\tvar changes = false,\n\t\tworking = true;\n\t\t\n\t\twhile(working){\n\t\t\tlet column = this.columns[this.rightCol];\n\t\t\t\n\t\t\tif(column){\n\t\t\t\tif(column.modules.vdomHoz.leftPos > this.vDomScrollPosRight){\n\t\t\t\t\tchanges = true;\n\t\t\t\t\t\n\t\t\t\t\tthis.getVisibleRows().forEach((row) => {\n\t\t\t\t\t\tif(row.type !== \"group\"){\n\t\t\t\t\t\t\tvar cell = row.getCell(column);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\trow.getElement().removeChild(cell.getElement());\n\t\t\t\t\t\t\t} catch (ex) {\n\t\t\t\t\t\t\t\tconsole.warn(\"Could not removeColRight\", ex.message);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tthis.vDomPadRight += column.getWidth();\n\t\t\t\t\tthis.rightCol --;\n\t\t\t\t\t\n\t\t\t\t\tthis.getVisibleRows().forEach((row) => {\n\t\t\t\t\t\tif(row.type !== \"group\"){\n\t\t\t\t\t\t\trow.modules.vdomHoz.rightCol = this.rightCol;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}else {\n\t\t\t\t\tworking = false;\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tworking = false;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif(changes){\n\t\t\tthis.tableElement.style.paddingRight = this.vDomPadRight + \"px\";\n\t\t}\n\t}\n\t\n\tremoveColLeft(){\n\t\tvar changes = false,\n\t\tworking = true;\n\t\t\n\t\twhile(working){\n\t\t\tlet column = this.columns[this.leftCol];\n\t\t\t\n\t\t\tif(column){\n\t\t\t\tif(column.modules.vdomHoz.rightPos < this.vDomScrollPosLeft){\n\t\t\t\t\tchanges = true;\n\t\t\t\t\t\n\t\t\t\t\tthis.getVisibleRows().forEach((row) => {\t\t\t\t\t\n\t\t\t\t\t\tif(row.type !== \"group\"){\n\t\t\t\t\t\t\tvar cell = row.getCell(column);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\trow.getElement().removeChild(cell.getElement());\n\t\t\t\t\t\t\t} catch (ex) {\n\t\t\t\t\t\t\t\tconsole.warn(\"Could not removeColLeft\", ex.message);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tthis.vDomPadLeft += column.getWidth();\n\t\t\t\t\tthis.leftCol ++;\n\t\t\t\t\t\n\t\t\t\t\tthis.getVisibleRows().forEach((row) => {\n\t\t\t\t\t\tif(row.type !== \"group\"){\n\t\t\t\t\t\t\trow.modules.vdomHoz.leftCol = this.leftCol;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}else {\n\t\t\t\t\tworking = false;\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tworking = false;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif(changes){\n\t\t\tthis.tableElement.style.paddingLeft = this.vDomPadLeft + \"px\";\n\t\t}\n\t}\n\t\n\tfitDataColActualWidthCheck(column){\n\t\tvar newWidth, widthDiff;\n\t\t\n\t\tif(column.modules.vdomHoz.fitDataCheck){\n\t\t\tcolumn.reinitializeWidth();\n\t\t\t\n\t\t\tnewWidth = column.getWidth();\n\t\t\twidthDiff = newWidth - column.modules.vdomHoz.width;\n\t\t\t\n\t\t\tif(widthDiff){\n\t\t\t\tcolumn.modules.vdomHoz.rightPos += widthDiff;\n\t\t\t\tcolumn.modules.vdomHoz.width = newWidth;\n\t\t\t\tthis.colPositionAdjust(this.columns.indexOf(column) + 1, this.columns.length, widthDiff);\n\t\t\t}\n\t\t\t\n\t\t\tcolumn.modules.vdomHoz.fitDataCheck = false;\n\t\t}\n\t\t\n\t\treturn widthDiff;\n\t}\n\t\n\tinitializeRow(row){\n\t\tif(row.type !== \"group\"){\n\t\t\trow.modules.vdomHoz = {\n\t\t\t\tleftCol:this.leftCol,\n\t\t\t\trightCol:this.rightCol,\n\t\t\t};\n\t\t\t\n\t\t\tif(this.table.modules.frozenColumns){\n\t\t\t\tthis.table.modules.frozenColumns.leftColumns.forEach((column) => {\n\t\t\t\t\tthis.appendCell(row, column);\n\t\t\t\t});\n\t\t\t}\n\t\t\t\n\t\t\tfor(let i = this.leftCol; i <= this.rightCol; i++){\n\t\t\t\tthis.appendCell(row, this.columns[i]);\n\t\t\t}\n\t\t\t\n\t\t\tif(this.table.modules.frozenColumns){\n\t\t\t\tthis.table.modules.frozenColumns.rightColumns.forEach((column) => {\n\t\t\t\t\tthis.appendCell(row, column);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\t\n\tappendCell(row, column){\n\t\tif(column && column.visible){\n\t\t\tlet cell = row.getCell(column);\n\t\t\t\n\t\t\trow.getElement().appendChild(cell.getElement());\n\t\t\tcell.cellRendered();\n\t\t}\n\t}\n\t\n\treinitializeRow(row, force){\n\t\tif(row.type !== \"group\"){\n\t\t\tif(force || !row.modules.vdomHoz || row.modules.vdomHoz.leftCol !== this.leftCol || row.modules.vdomHoz.rightCol !== this.rightCol){\n\t\t\t\t\n\t\t\t\tvar rowEl = row.getElement();\n\t\t\t\twhile(rowEl.firstChild) rowEl.removeChild(rowEl.firstChild);\n\t\t\t\t\n\t\t\t\tthis.initializeRow(row);\n\t\t\t}\n\t\t}\n\t}\n}\n\nclass ColumnManager extends CoreFeature {\n\t\n\tconstructor (table){\n\t\tsuper(table);\n\t\t\n\t\tthis.blockHozScrollEvent = false;\n\t\tthis.headersElement = null;\n\t\tthis.contentsElement = null;\n\t\tthis.rowHeader = null;\n\t\tthis.element = null ; //containing element\n\t\tthis.columns = []; // column definition object\n\t\tthis.columnsByIndex = []; //columns by index\n\t\tthis.columnsByField = {}; //columns by field\n\t\tthis.scrollLeft = 0;\n\t\tthis.optionsList = new OptionsList(this.table, \"column definition\", defaultColumnOptions);\n\t\t\n\t\tthis.redrawBlock = false; //prevent redraws to allow multiple data manipulations before continuing\n\t\tthis.redrawBlockUpdate = null; //store latest redraw update only status\n\t\t\n\t\tthis.renderer = null;\n\t}\n\t\n\t////////////// Setup Functions /////////////////\n\t\n\tinitialize(){\n\t\tthis.initializeRenderer();\n\t\t\n\t\tthis.headersElement = this.createHeadersElement();\n\t\tthis.contentsElement = this.createHeaderContentsElement();\n\t\tthis.element = this.createHeaderElement();\n\t\t\n\t\tthis.contentsElement.insertBefore(this.headersElement, this.contentsElement.firstChild);\n\t\tthis.element.insertBefore(this.contentsElement, this.element.firstChild);\n\t\t\n\t\tthis.initializeScrollWheelWatcher();\n\t\t\n\t\tthis.subscribe(\"scroll-horizontal\", this.scrollHorizontal.bind(this));\n\t\tthis.subscribe(\"scrollbar-vertical\", this.padVerticalScrollbar.bind(this));\n\t}\n\t\n\tpadVerticalScrollbar(width){\n\t\tif(this.table.rtl){\n\t\t\tthis.headersElement.style.marginLeft = width + \"px\";\n\t\t}else {\n\t\t\tthis.headersElement.style.marginRight = width + \"px\";\n\t\t}\n\t}\n\t\n\tinitializeRenderer(){\n\t\tvar renderClass;\n\t\t\n\t\tvar renderers = {\n\t\t\t\"virtual\": VirtualDomHorizontal,\n\t\t\t\"basic\": BasicHorizontal,\n\t\t};\n\t\t\n\t\tif(typeof this.table.options.renderHorizontal === \"string\"){\n\t\t\trenderClass = renderers[this.table.options.renderHorizontal];\n\t\t}else {\n\t\t\trenderClass = this.table.options.renderHorizontal;\n\t\t}\n\t\t\n\t\tif(renderClass){\n\t\t\tthis.renderer = new renderClass(this.table, this.element, this.tableElement);\n\t\t\tthis.renderer.initialize();\n\t\t}else {\n\t\t\tconsole.error(\"Unable to find matching renderer:\", this.table.options.renderHorizontal);\n\t\t}\n\t}\n\t\n\t\n\tcreateHeadersElement (){\n\t\tvar el = document.createElement(\"div\");\n\t\t\n\t\tel.classList.add(\"tabulator-headers\");\n\t\tel.setAttribute(\"role\", \"row\");\n\t\t\n\t\treturn el;\n\t}\n\t\n\tcreateHeaderContentsElement (){\n\t\tvar el = document.createElement(\"div\");\n\t\t\n\t\tel.classList.add(\"tabulator-header-contents\");\n\t\tel.setAttribute(\"role\", \"rowgroup\");\n\t\t\n\t\treturn el;\n\t}\n\t\n\tcreateHeaderElement (){\n\t\tvar el = document.createElement(\"div\");\n\t\t\n\t\tel.classList.add(\"tabulator-header\");\n\t\tel.setAttribute(\"role\", \"rowgroup\");\n\t\t\n\t\tif(!this.table.options.headerVisible){\n\t\t\tel.classList.add(\"tabulator-header-hidden\");\n\t\t}\n\t\t\n\t\treturn el;\n\t}\n\t\n\t//return containing element\n\tgetElement(){\n\t\treturn this.element;\n\t}\n\t\n\t//return containing contents element\n\tgetContentsElement(){\n\t\treturn this.contentsElement;\n\t}\n\t\n\t\n\t//return header containing element\n\tgetHeadersElement(){\n\t\treturn this.headersElement;\n\t}\n\t\n\t//scroll horizontally to match table body\n\tscrollHorizontal(left){\n\t\tthis.contentsElement.scrollLeft = left;\n\t\t\n\t\tthis.scrollLeft = left;\n\t\t\n\t\tthis.renderer.scrollColumns(left);\n\t}\n\t\n\tinitializeScrollWheelWatcher(){\n\t\tthis.contentsElement.addEventListener(\"wheel\", (e) => {\n\t\t\tvar left;\n\t\t\t\n\t\t\tif(e.deltaX){\n\t\t\t\tleft = this.contentsElement.scrollLeft + e.deltaX;\n\t\t\t\t\n\t\t\t\tthis.table.rowManager.scrollHorizontal(left);\n\t\t\t\tthis.table.columnManager.scrollHorizontal(left);\n\t\t\t}\n\t\t});\n\t}\n\t\n\t///////////// Column Setup Functions /////////////\n\tgenerateColumnsFromRowData(data){\n\t\tvar cols = [],\n\t\tcollProgress = {},\n\t\trowSample = this.table.options.autoColumns === \"full\" ? data : [data[0]],\n\t\tdefinitions = this.table.options.autoColumnsDefinitions;\n\t\t\n\t\tif(data && data.length){\n\t\t\t\n\t\t\trowSample.forEach((row) => {\n\t\t\t\t\n\t\t\t\tObject.keys(row).forEach((key, index) => {\n\t\t\t\t\tlet value = row[key],\n\t\t\t\t\tcol;\n\t\t\t\t\t\n\t\t\t\t\tif(!collProgress[key]){\n\t\t\t\t\t\tcol = {\n\t\t\t\t\t\t\tfield:key,\n\t\t\t\t\t\t\ttitle:key,\n\t\t\t\t\t\t\tsorter:this.calculateSorterFromValue(value),\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tcols.splice(index, 0, col);\n\t\t\t\t\t\tcollProgress[key] = typeof value === \"undefined\" ? col : true;\n\t\t\t\t\t}else if(collProgress[key] !== true){\n\t\t\t\t\t\tif(typeof value !== \"undefined\"){\n\t\t\t\t\t\t\tcollProgress[key].sorter = this.calculateSorterFromValue(value);\n\t\t\t\t\t\t\tcollProgress[key] = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t\t\n\t\t\tif(definitions){\n\t\t\t\t\n\t\t\t\tswitch(typeof definitions){\n\t\t\t\t\tcase \"function\":\n\t\t\t\t\t\tthis.table.options.columns = definitions.call(this.table, cols);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"object\":\n\t\t\t\t\t\tif(Array.isArray(definitions)){\n\t\t\t\t\t\t\tcols.forEach((col) => {\n\t\t\t\t\t\t\t\tvar match = definitions.find((def) => {\n\t\t\t\t\t\t\t\t\treturn def.field === col.field;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif(match){\n\t\t\t\t\t\t\t\t\tObject.assign(col, match);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\tcols.forEach((col) => {\n\t\t\t\t\t\t\t\tif(definitions[col.field]){\n\t\t\t\t\t\t\t\t\tObject.assign(col, definitions[col.field]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.table.options.columns = cols;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tthis.table.options.columns = cols;\n\t\t\t}\n\t\t\t\n\t\t\tthis.setColumns(this.table.options.columns);\n\t\t}\n\t}\n\t\n\tcalculateSorterFromValue(value){\n\t\tvar sorter;\n\t\t\n\t\tswitch(typeof value){\n\t\t\tcase \"undefined\":\n\t\t\t\tsorter = \"string\";\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase \"boolean\":\n\t\t\t\tsorter = \"boolean\";\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase \"number\":\n\t\t\t\tsorter = \"number\";\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase \"object\":\n\t\t\t\tif(Array.isArray(value)){\n\t\t\t\t\tsorter = \"array\";\n\t\t\t\t}else {\n\t\t\t\t\tsorter = \"string\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tdefault:\n\t\t\t\tif(!isNaN(value) && value !== \"\"){\n\t\t\t\t\tsorter = \"number\";\n\t\t\t\t}else {\n\t\t\t\t\tif(value.match(/((^[0-9]+[a-z]+)|(^[a-z]+[0-9]+))+$/i)){\n\t\t\t\t\t\tsorter = \"alphanum\";\n\t\t\t\t\t}else {\n\t\t\t\t\t\tsorter = \"string\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\treturn sorter;\n\t}\n\t\n\tsetColumns(cols, row){\n\t\twhile(this.headersElement.firstChild) this.headersElement.removeChild(this.headersElement.firstChild);\n\t\t\n\t\tthis.columns = [];\n\t\tthis.columnsByIndex = [];\n\t\tthis.columnsByField = {};\n\t\t\n\t\tthis.dispatch(\"columns-loading\");\n\t\tthis.dispatchExternal(\"columnsLoading\");\n\t\t\n\t\tif(this.table.options.rowHeader){\n\t\t\tthis.rowHeader = new Column(this.table.options.rowHeader === true ? {} : this.table.options.rowHeader, this, true);\n\t\t\tthis.columns.push(this.rowHeader);\n\t\t\tthis.headersElement.appendChild(this.rowHeader.getElement());\n\t\t\tthis.rowHeader.columnRendered();\n\t\t}\n\t\t\n\t\tcols.forEach((def, i) => {\n\t\t\tthis._addColumn(def);\n\t\t});\n\t\t\n\t\tthis._reIndexColumns();\n\t\t\n\t\tthis.dispatch(\"columns-loaded\");\n\n\t\tif(this.subscribedExternal(\"columnsLoaded\")){\n\t\t\tthis.dispatchExternal(\"columnsLoaded\", this.getComponents());\n\t\t}\n\t\t\n\t\tthis.rerenderColumns(false, true);\n\t\t\n\t\tthis.redraw(true);\n\t}\n\t\n\t_addColumn(definition, before, nextToColumn){\n\t\tvar column = new Column(definition, this),\n\t\tcolEl = column.getElement(),\n\t\tindex = nextToColumn ? this.findColumnIndex(nextToColumn) : nextToColumn;\n\t\t\n\t\t//prevent adding of rows in front of row header\n\t\tif(before && this.rowHeader && (!nextToColumn || nextToColumn === this.rowHeader)){\n\t\t\tbefore = false;\n\t\t\tnextToColumn = this.rowHeader;\n\t\t\tindex = 0;\n\t\t}\n\t\t\n\t\tif(nextToColumn && index > -1){\n\t\t\tvar topColumn = nextToColumn.getTopColumn();\n\t\t\tvar parentIndex = this.columns.indexOf(topColumn);\n\t\t\tvar nextEl = topColumn.getElement();\n\t\t\t\n\t\t\tif(before){\n\t\t\t\tthis.columns.splice(parentIndex, 0, column);\n\t\t\t\tnextEl.parentNode.insertBefore(colEl, nextEl);\n\t\t\t}else {\n\t\t\t\tthis.columns.splice(parentIndex + 1, 0, column);\n\t\t\t\tnextEl.parentNode.insertBefore(colEl, nextEl.nextSibling);\n\t\t\t}\n\t\t}else {\n\t\t\tif(before){\n\t\t\t\tthis.columns.unshift(column);\n\t\t\t\tthis.headersElement.insertBefore(column.getElement(), this.headersElement.firstChild);\n\t\t\t}else {\n\t\t\t\tthis.columns.push(column);\n\t\t\t\tthis.headersElement.appendChild(column.getElement());\n\t\t\t}\n\t\t}\n\t\t\n\t\tcolumn.columnRendered();\n\t\t\n\t\treturn column;\n\t}\n\t\n\tregisterColumnField(col){\n\t\tif(col.definition.field){\n\t\t\tthis.columnsByField[col.definition.field] = col;\n\t\t}\n\t}\n\t\n\tregisterColumnPosition(col){\n\t\tthis.columnsByIndex.push(col);\n\t}\n\t\n\t_reIndexColumns(){\n\t\tthis.columnsByIndex = [];\n\t\t\n\t\tthis.columns.forEach(function(column){\n\t\t\tcolumn.reRegisterPosition();\n\t\t});\n\t}\n\t\n\t//ensure column headers take up the correct amount of space in column groups\n\tverticalAlignHeaders(){\n\t\tvar minHeight = 0;\n\t\t\n\t\tif(!this.redrawBlock){\n\t\t\t\n\t\t\tthis.headersElement.style.height=\"\";\n\t\t\t\n\t\t\tthis.columns.forEach((column) => {\n\t\t\t\tcolumn.clearVerticalAlign();\n\t\t\t});\n\t\t\t\n\t\t\tthis.columns.forEach((column) => {\n\t\t\t\tvar height = column.getHeight();\n\t\t\t\t\n\t\t\t\tif(height > minHeight){\n\t\t\t\t\tminHeight = height;\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tthis.headersElement.style.height = minHeight + \"px\";\n\t\t\t\n\t\t\tthis.columns.forEach((column) => {\n\t\t\t\tcolumn.verticalAlign(this.table.options.columnHeaderVertAlign, minHeight);\n\t\t\t});\n\t\t\t\n\t\t\tthis.table.rowManager.adjustTableSize();\n\t\t}\n\t}\n\t\n\t//////////////// Column Details /////////////////\n\tfindColumn(subject){\n\t\tvar columns;\n\t\t\n\t\tif(typeof subject == \"object\"){\n\t\t\t\n\t\t\tif(subject instanceof Column){\n\t\t\t\t//subject is column element\n\t\t\t\treturn subject;\n\t\t\t}else if(subject instanceof ColumnComponent){\n\t\t\t\t//subject is public column component\n\t\t\t\treturn subject._getSelf() || false;\n\t\t\t}else if(typeof HTMLElement !== \"undefined\" && subject instanceof HTMLElement){\n\t\t\t\t\n\t\t\t\tcolumns = [];\n\t\t\t\t\n\t\t\t\tthis.columns.forEach((column) => {\n\t\t\t\t\tcolumns.push(column);\n\t\t\t\t\tcolumns = columns.concat(column.getColumns(true));\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\t//subject is a HTML element of the column header\n\t\t\t\tlet match = columns.find((column) => {\n\t\t\t\t\treturn column.element === subject;\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\treturn match || false;\n\t\t\t}\n\t\t\t\n\t\t}else {\n\t\t\t//subject should be treated as the field name of the column\n\t\t\treturn this.columnsByField[subject] || false;\n\t\t}\n\t\t\n\t\t//catch all for any other type of input\n\t\treturn false;\n\t}\n\t\n\tgetColumnByField(field){\n\t\treturn this.columnsByField[field];\n\t}\n\t\n\tgetColumnsByFieldRoot(root){\n\t\tvar matches = [];\n\t\t\n\t\tObject.keys(this.columnsByField).forEach((field) => {\n\t\t\tvar fieldRoot = this.table.options.nestedFieldSeparator ? field.split(this.table.options.nestedFieldSeparator)[0] : field;\n\t\t\tif(fieldRoot === root){\n\t\t\t\tmatches.push(this.columnsByField[field]);\n\t\t\t}\n\t\t});\n\t\t\n\t\treturn matches;\n\t}\n\t\n\tgetColumnByIndex(index){\n\t\treturn this.columnsByIndex[index];\n\t}\n\t\n\tgetFirstVisibleColumn(){\n\t\tvar index = this.columnsByIndex.findIndex((col) => {\n\t\t\treturn col.visible;\n\t\t});\n\t\t\n\t\treturn index > -1 ? this.columnsByIndex[index] : false;\n\t}\n\t\n\tgetVisibleColumnsByIndex() {\n\t\treturn this.columnsByIndex.filter((col) => col.visible);\n\t}\n\t\n\tgetColumns(){\n\t\treturn this.columns;\n\t}\n\t\n\tfindColumnIndex(column){\n\t\treturn this.columnsByIndex.findIndex((col) => {\n\t\t\treturn column === col;\n\t\t});\n\t}\n\t\n\t//return all columns that are not groups\n\tgetRealColumns(){\n\t\treturn this.columnsByIndex;\n\t}\n\t\n\t//traverse across columns and call action\n\ttraverse(callback){\n\t\tthis.columnsByIndex.forEach((column,i) =>{\n\t\t\tcallback(column, i);\n\t\t});\n\t}\n\t\n\t//get definitions of actual columns\n\tgetDefinitions(active){\n\t\tvar output = [];\n\t\t\n\t\tthis.columnsByIndex.forEach((column) => {\n\t\t\tif(!active || (active && column.visible)){\n\t\t\t\toutput.push(column.getDefinition());\n\t\t\t}\n\t\t});\n\t\t\n\t\treturn output;\n\t}\n\t\n\t//get full nested definition tree\n\tgetDefinitionTree(){\n\t\tvar output = [];\n\t\t\n\t\tthis.columns.forEach((column) => {\n\t\t\toutput.push(column.getDefinition(true));\n\t\t});\n\t\t\n\t\treturn output;\n\t}\n\t\n\tgetComponents(structured){\n\t\tvar output = [],\n\t\tcolumns = structured ? this.columns : this.columnsByIndex;\n\t\t\n\t\tcolumns.forEach((column) => {\n\t\t\toutput.push(column.getComponent());\n\t\t});\n\t\t\n\t\treturn output;\n\t}\n\t\n\tgetWidth(){\n\t\tvar width = 0;\n\t\t\n\t\tthis.columnsByIndex.forEach((column) => {\n\t\t\tif(column.visible){\n\t\t\t\twidth += column.getWidth();\n\t\t\t}\n\t\t});\n\t\t\n\t\treturn width;\n\t}\n\t\n\tmoveColumn(from, to, after){\n\t\tto.element.parentNode.insertBefore(from.element, to.element);\n\t\t\n\t\tif(after){\n\t\t\tto.element.parentNode.insertBefore(to.element, from.element);\n\t\t}\n\t\t\n\t\tthis.moveColumnActual(from, to, after);\n\t\t\n\t\tthis.verticalAlignHeaders();\n\t\t\n\t\tthis.table.rowManager.reinitialize();\n\t}\n\t\n\tmoveColumnActual(from, to, after){\n\t\tif(from.parent.isGroup){\n\t\t\tthis._moveColumnInArray(from.parent.columns, from, to, after);\n\t\t}else {\n\t\t\tthis._moveColumnInArray(this.columns, from, to, after);\n\t\t}\n\t\t\n\t\tthis._moveColumnInArray(this.columnsByIndex, from, to, after, true);\n\t\t\n\t\tthis.rerenderColumns(true);\n\t\t\n\t\tthis.dispatch(\"column-moved\", from, to, after);\n\t\t\n\t\tif(this.subscribedExternal(\"columnMoved\")){\n\t\t\tthis.dispatchExternal(\"columnMoved\", from.getComponent(), this.table.columnManager.getComponents());\n\t\t}\n\t}\n\t\n\t_moveColumnInArray(columns, from, to, after, updateRows){\n\t\tvar\tfromIndex = columns.indexOf(from),\n\t\ttoIndex, rows = [];\n\t\t\n\t\tif (fromIndex > -1) {\n\t\t\t\n\t\t\tcolumns.splice(fromIndex, 1);\n\t\t\t\n\t\t\ttoIndex = columns.indexOf(to);\n\t\t\t\n\t\t\tif (toIndex > -1) {\n\t\t\t\t\n\t\t\t\tif(after){\n\t\t\t\t\ttoIndex = toIndex+1;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}else {\n\t\t\t\ttoIndex = fromIndex;\n\t\t\t}\n\t\t\t\n\t\t\tcolumns.splice(toIndex, 0, from);\n\t\t\t\n\t\t\tif(updateRows){\n\t\t\t\t\n\t\t\t\trows = this.chain(\"column-moving-rows\", [from, to, after], null, []) || [];\n\t\t\t\t\n\t\t\t\trows = rows.concat(this.table.rowManager.rows);\n\t\t\t\t\n\t\t\t\trows.forEach(function(row){\n\t\t\t\t\tif(row.cells.length){\n\t\t\t\t\t\tvar cell = row.cells.splice(fromIndex, 1)[0];\n\t\t\t\t\t\trow.cells.splice(toIndex, 0, cell);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n\t\n\tscrollToColumn(column, position, ifVisible){\n\t\tvar left = 0,\n\t\toffset = column.getLeftOffset(),\n\t\tadjust = 0,\n\t\tcolEl = column.getElement();\n\t\t\n\t\t\n\t\treturn new Promise((resolve, reject) => {\n\t\t\t\n\t\t\tif(typeof position === \"undefined\"){\n\t\t\t\tposition = this.table.options.scrollToColumnPosition;\n\t\t\t}\n\t\t\t\n\t\t\tif(typeof ifVisible === \"undefined\"){\n\t\t\t\tifVisible = this.table.options.scrollToColumnIfVisible;\n\t\t\t}\n\t\t\t\n\t\t\tif(column.visible){\n\t\t\t\t\n\t\t\t\t//align to correct position\n\t\t\t\tswitch(position){\n\t\t\t\t\tcase \"middle\":\n\t\t\t\t\tcase \"center\":\n\t\t\t\t\t\tadjust = -this.element.clientWidth / 2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"right\":\n\t\t\t\t\t\tadjust = colEl.clientWidth - this.headersElement.clientWidth;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t//check column visibility\n\t\t\t\tif(!ifVisible){\n\t\t\t\t\tif(offset > 0 && offset + colEl.offsetWidth < this.element.clientWidth){\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t//calculate scroll position\n\t\t\t\tleft = offset + adjust;\n\t\t\t\t\n\t\t\t\tleft = Math.max(Math.min(left, this.table.rowManager.element.scrollWidth - this.table.rowManager.element.clientWidth),0);\n\t\t\t\t\n\t\t\t\tthis.table.rowManager.scrollHorizontal(left);\n\t\t\t\tthis.scrollHorizontal(left);\n\t\t\t\t\n\t\t\t\tresolve();\n\t\t\t}else {\n\t\t\t\tconsole.warn(\"Scroll Error - Column not visible\");\n\t\t\t\treject(\"Scroll Error - Column not visible\");\n\t\t\t}\n\t\t\t\n\t\t});\n\t}\n\t\n\t//////////////// Cell Management /////////////////\n\tgenerateCells(row){\n\t\tvar cells = [];\n\t\t\n\t\tthis.columnsByIndex.forEach((column) => {\n\t\t\tcells.push(column.generateCell(row));\n\t\t});\n\t\t\n\t\treturn cells;\n\t}\n\t\n\t//////////////// Column Management /////////////////\n\tgetFlexBaseWidth(){\n\t\tvar totalWidth = this.table.element.clientWidth, //table element width\n\t\tfixedWidth = 0;\n\t\t\n\t\t//adjust for vertical scrollbar if present\n\t\tif(this.table.rowManager.element.scrollHeight > this.table.rowManager.element.clientHeight){\n\t\t\ttotalWidth -= this.table.rowManager.element.offsetWidth - this.table.rowManager.element.clientWidth;\n\t\t}\n\t\t\n\t\tthis.columnsByIndex.forEach(function(column){\n\t\t\tvar width, minWidth, colWidth;\n\t\t\t\n\t\t\tif(column.visible){\n\t\t\t\t\n\t\t\t\twidth = column.definition.width || 0;\n\t\t\t\t\n\t\t\t\tminWidth = parseInt(column.minWidth);\n\t\t\t\t\n\t\t\t\tif(typeof(width) == \"string\"){\n\t\t\t\t\tif(width.indexOf(\"%\") > -1){\n\t\t\t\t\t\tcolWidth = (totalWidth / 100) * parseInt(width) ;\n\t\t\t\t\t}else {\n\t\t\t\t\t\tcolWidth = parseInt(width);\n\t\t\t\t\t}\n\t\t\t\t}else {\n\t\t\t\t\tcolWidth = width;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfixedWidth += colWidth > minWidth ? colWidth : minWidth;\n\t\t\t\t\n\t\t\t}\n\t\t});\n\t\t\n\t\treturn fixedWidth;\n\t}\n\t\n\taddColumn(definition, before, nextToColumn){\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tvar column = this._addColumn(definition, before, nextToColumn);\n\t\t\t\n\t\t\tthis._reIndexColumns();\n\t\t\t\n\t\t\tthis.dispatch(\"column-add\", definition, before, nextToColumn);\n\t\t\t\n\t\t\tif(this.layoutMode() != \"fitColumns\"){\n\t\t\t\tcolumn.reinitializeWidth();\n\t\t\t}\n\t\t\t\n\t\t\tthis.redraw(true);\n\t\t\t\n\t\t\tthis.table.rowManager.reinitialize();\n\t\t\t\n\t\t\tthis.rerenderColumns();\n\t\t\t\n\t\t\tresolve(column);\n\t\t});\n\t}\n\t\n\t//remove column from system\n\tderegisterColumn(column){\n\t\tvar field = column.getField(),\n\t\tindex;\n\t\t\n\t\t//remove from field list\n\t\tif(field){\n\t\t\tdelete this.columnsByField[field];\n\t\t}\n\t\t\n\t\t//remove from index list\n\t\tindex = this.columnsByIndex.indexOf(column);\n\t\t\n\t\tif(index > -1){\n\t\t\tthis.columnsByIndex.splice(index, 1);\n\t\t}\n\t\t\n\t\t//remove from column list\n\t\tindex = this.columns.indexOf(column);\n\t\t\n\t\tif(index > -1){\n\t\t\tthis.columns.splice(index, 1);\n\t\t}\n\t\t\n\t\tthis.verticalAlignHeaders();\n\t\t\n\t\tthis.redraw();\n\t}\n\t\n\trerenderColumns(update, silent){\n\t\tif(!this.redrawBlock){\n\t\t\tthis.renderer.rerenderColumns(update, silent);\n\t\t}else {\n\t\t\tif(update === false || (update === true && this.redrawBlockUpdate === null)){\n\t\t\t\tthis.redrawBlockUpdate = update;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tblockRedraw(){\n\t\tthis.redrawBlock = true;\n\t\tthis.redrawBlockUpdate = null;\n\t}\n\t\n\trestoreRedraw(){\n\t\tthis.redrawBlock = false;\n\t\tthis.verticalAlignHeaders();\n\t\tthis.renderer.rerenderColumns(this.redrawBlockUpdate);\n\t\t\n\t}\n\t\n\t//redraw columns\n\tredraw(force){\n\t\tif(Helpers.elVisible(this.element)){\n\t\t\tthis.verticalAlignHeaders();\n\t\t}\n\t\t\n\t\tif(force){\n\t\t\tthis.table.rowManager.resetScroll();\n\t\t\tthis.table.rowManager.reinitialize();\n\t\t}\n\t\t\n\t\tif(!this.confirm(\"table-redrawing\", force)){\n\t\t\tthis.layoutRefresh(force);\n\t\t}\n\t\t\n\t\tthis.dispatch(\"table-redraw\", force);\n\t\t\n\t\tthis.table.footerManager.redraw();\n\t}\n}\n\nclass BasicVertical extends Renderer{\n\tconstructor(table){\n\t\tsuper(table);\n\t\t\n\t\tthis.verticalFillMode = \"fill\";\n\t\t\n\t\tthis.scrollTop = 0;\n\t\tthis.scrollLeft = 0;\n\t\t\n\t\tthis.scrollTop = 0;\n\t\tthis.scrollLeft = 0;\n\t}\n\t\n\tclearRows(){\n\t\tvar element = this.tableElement;\n\t\t\n\t\t// element.children.detach();\n\t\twhile(element.firstChild) element.removeChild(element.firstChild);\n\t\t\n\t\telement.scrollTop = 0;\n\t\telement.scrollLeft = 0;\n\t\t\n\t\telement.style.minWidth = \"\";\n\t\telement.style.minHeight = \"\";\n\t\telement.style.display = \"\";\n\t\telement.style.visibility = \"\";\n\t}\n\t\n\trenderRows() {\n\t\tvar element = this.tableElement,\n\t\tonlyGroupHeaders = true,\n\t\ttableFrag = document.createDocumentFragment(),\n\t\trows = this.rows();\n\t\t\n\t\trows.forEach((row, index) => {\n\t\t\tthis.styleRow(row, index);\n\t\t\trow.initialize(false, true);\n\t\t\t\n\t\t\tif (row.type !== \"group\") {\n\t\t\t\tonlyGroupHeaders = false;\n\t\t\t}\n\t\t\t\n\t\t\ttableFrag.appendChild(row.getElement());\n\t\t});\n\t\t\n\t\telement.appendChild(tableFrag);\n\t\t\n\t\trows.forEach((row) => {\n\t\t\trow.rendered();\n\t\t\t\n\t\t\tif(!row.heightInitialized) {\n\t\t\t\trow.calcHeight(true);\n\t\t\t}\n\t\t});\n\t\t\n\t\trows.forEach((row) => {\n\t\t\tif(!row.heightInitialized) {\n\t\t\t\trow.setCellHeight();\n\t\t\t}\n\t\t});\n\t\t\n\t\tif(onlyGroupHeaders){\n\t\t\telement.style.minWidth = this.table.columnManager.getWidth() + \"px\";\n\t\t}else {\n\t\t\telement.style.minWidth = \"\";\n\t\t}\n\t}\n\t\n\t\n\trerenderRows(callback){\t\n\t\tthis.clearRows();\n\t\t\n\t\tif(callback){\n\t\t\tcallback();\n\t\t}\n\t\t\n\t\tthis.renderRows();\n\n\t\tif(!this.rows().length){\n\t\t\tthis.table.rowManager.tableEmpty();\n\t\t}\n\t}\n\t\n\tscrollToRowNearestTop(row){\n\t\tvar rowTop = Helpers.elOffset(row.getElement()).top;\n\t\t\n\t\treturn !(Math.abs(this.elementVertical.scrollTop - rowTop) > Math.abs(this.elementVertical.scrollTop + this.elementVertical.clientHeight - rowTop));\n\t}\n\t\n\tscrollToRow(row){\n\t\tvar rowEl = row.getElement();\n\t\t\n\t\tthis.elementVertical.scrollTop = Helpers.elOffset(rowEl).top - Helpers.elOffset(this.elementVertical).top + this.elementVertical.scrollTop;\n\t}\n\t\n\tvisibleRows(includingBuffer){\n\t\treturn this.rows();\n\t}\n\t\n}\n\nclass VirtualDomVertical extends Renderer{\n\tconstructor(table){\n\t\tsuper(table);\n\n\t\tthis.verticalFillMode = \"fill\";\n\n\t\tthis.scrollTop = 0;\n\t\tthis.scrollLeft = 0;\n\n\t\tthis.vDomRowHeight = 20; //approximation of row heights for padding\n\n\t\tthis.vDomTop = 0; //hold position for first rendered row in the virtual DOM\n\t\tthis.vDomBottom = 0; //hold position for last rendered row in the virtual DOM\n\n\t\tthis.vDomScrollPosTop = 0; //last scroll position of the vDom top;\n\t\tthis.vDomScrollPosBottom = 0; //last scroll position of the vDom bottom;\n\n\t\tthis.vDomTopPad = 0; //hold value of padding for top of virtual DOM\n\t\tthis.vDomBottomPad = 0; //hold value of padding for bottom of virtual DOM\n\n\t\tthis.vDomMaxRenderChain = 90; //the maximum number of dom elements that can be rendered in 1 go\n\n\t\tthis.vDomWindowBuffer = 0; //window row buffer before removing elements, to smooth scrolling\n\n\t\tthis.vDomWindowMinTotalRows = 20; //minimum number of rows to be generated in virtual dom (prevent buffering issues on tables with tall rows)\n\t\tthis.vDomWindowMinMarginRows = 5; //minimum number of rows to be generated in virtual dom margin\n\n\t\tthis.vDomTopNewRows = []; //rows to normalize after appending to optimize render speed\n\t\tthis.vDomBottomNewRows = []; //rows to normalize after appending to optimize render speed\n\t}\n\n\t//////////////////////////////////////\n\t///////// Public Functions ///////////\n\t//////////////////////////////////////\n\n\tclearRows(){\n\t\tvar element = this.tableElement;\n\n\t\t// element.children.detach();\n\t\twhile(element.firstChild) element.removeChild(element.firstChild);\n\n\t\telement.style.paddingTop = \"\";\n\t\telement.style.paddingBottom = \"\";\n\t\telement.style.minHeight = \"\";\n\t\telement.style.display = \"\";\n\t\telement.style.visibility = \"\";\n\n\t\tthis.elementVertical.scrollTop = 0;\n\t\tthis.elementVertical.scrollLeft = 0;\n\n\t\tthis.scrollTop = 0;\n\t\tthis.scrollLeft = 0;\n\n\t\tthis.vDomTop = 0;\n\t\tthis.vDomBottom = 0;\n\t\tthis.vDomTopPad = 0;\n\t\tthis.vDomBottomPad = 0;\n\t\tthis.vDomScrollPosTop = 0;\n\t\tthis.vDomScrollPosBottom = 0;\n\t}\n\n\trenderRows(){\n\t\tthis._virtualRenderFill();\n\t}\n\n\trerenderRows(callback){\n\t\tvar scrollTop = this.elementVertical.scrollTop;\n\t\tvar topRow = false;\n\t\tvar topOffset = false;\n\n\t\tvar left = this.table.rowManager.scrollLeft;\n\n\t\tvar rows = this.rows();\n\n\t\tfor(var i = this.vDomTop; i <= this.vDomBottom; i++){\n\n\t\t\tif(rows[i]){\n\t\t\t\tvar diff = scrollTop - rows[i].getElement().offsetTop;\n\n\t\t\t\tif(topOffset === false || Math.abs(diff) < topOffset){\n\t\t\t\t\ttopOffset = diff;\n\t\t\t\t\ttopRow = i;\n\t\t\t\t}else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\trows.forEach((row) => {\n\t\t\trow.deinitializeHeight();\n\t\t});\n\n\t\tif(callback){\n\t\t\tcallback();\n\t\t}\n\n\t\tif(this.rows().length){\n\t\t\tthis._virtualRenderFill((topRow === false ? this.rows.length - 1 : topRow), true, topOffset || 0);\n\t\t}else {\n\t\t\tthis.clear();\n\t\t\tthis.table.rowManager.tableEmpty();\n\t\t}\n\n\t\tthis.scrollColumns(left);\n\t}\n\n\tscrollColumns(left){\n\t\tthis.table.rowManager.scrollHorizontal(left);\n\t}\n\n\tscrollRows(top, dir){\n\t\tvar topDiff = top - this.vDomScrollPosTop;\n\t\tvar bottomDiff = top - this.vDomScrollPosBottom;\n\t\tvar margin = this.vDomWindowBuffer * 2;\n\t\tvar rows = this.rows();\n\n\t\tthis.scrollTop = top;\n\n\t\tif(-topDiff > margin || bottomDiff > margin){\n\t\t\t//if big scroll redraw table;\n\t\t\tvar left = this.table.rowManager.scrollLeft;\n\t\t\tthis._virtualRenderFill(Math.floor((this.elementVertical.scrollTop / this.elementVertical.scrollHeight) * rows.length));\n\t\t\tthis.scrollColumns(left);\n\t\t}else {\n\n\t\t\tif(dir){\n\t\t\t\t//scrolling up\n\t\t\t\tif(topDiff < 0){\n\t\t\t\t\tthis._addTopRow(rows, -topDiff);\n\t\t\t\t}\n\n\t\t\t\tif(bottomDiff < 0){\n\t\t\t\t\t//hide bottom row if needed\n\t\t\t\t\tif(this.vDomScrollHeight - this.scrollTop > this.vDomWindowBuffer){\n\t\t\t\t\t\tthis._removeBottomRow(rows, -bottomDiff);\n\t\t\t\t\t}else {\n\t\t\t\t\t\tthis.vDomScrollPosBottom = this.scrollTop;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}else {\n\n\t\t\t\tif(bottomDiff >= 0){\n\t\t\t\t\tthis._addBottomRow(rows, bottomDiff);\n\t\t\t\t}\n\n\t\t\t\t//scrolling down\n\t\t\t\tif(topDiff >= 0){\n\t\t\t\t\t//hide top row if needed\n\t\t\t\t\tif(this.scrollTop > this.vDomWindowBuffer){\n\t\t\t\t\t\tthis._removeTopRow(rows, topDiff);\n\t\t\t\t\t}else {\n\t\t\t\t\t\tthis.vDomScrollPosTop = this.scrollTop;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tresize(){\n\t\tthis.vDomWindowBuffer = this.table.options.renderVerticalBuffer || this.elementVertical.clientHeight;\n\t}\n\n\tscrollToRowNearestTop(row){\n\t\tvar rowIndex = this.rows().indexOf(row);\n\n\t\treturn !(Math.abs(this.vDomTop - rowIndex) > Math.abs(this.vDomBottom - rowIndex));\n\t}\n\n\tscrollToRow(row){\n\t\tvar index = this.rows().indexOf(row);\n\n\t\tif(index > -1){\n\t\t\tthis._virtualRenderFill(index, true);\n\t\t}\n\t}\n\n\tvisibleRows(includingBuffer){\n\t\tvar topEdge = this.elementVertical.scrollTop,\n\t\tbottomEdge = this.elementVertical.clientHeight + topEdge,\n\t\ttopFound = false,\n\t\ttopRow = 0,\n\t\tbottomRow = 0,\n\t\trows = this.rows();\n\n\t\tif(includingBuffer){\n\t\t\ttopRow = this.vDomTop;\n\t\t\tbottomRow = this.vDomBottom;\n\t\t}else {\n\t\t\tfor(var i = this.vDomTop; i <= this.vDomBottom; i++){\n\t\t\t\tif(rows[i]){\n\t\t\t\t\tif(!topFound){\n\t\t\t\t\t\tif((topEdge - rows[i].getElement().offsetTop) >= 0){\n\t\t\t\t\t\t\ttopRow = i;\n\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\ttopFound = true;\n\n\t\t\t\t\t\t\tif(bottomEdge - rows[i].getElement().offsetTop >= 0){\n\t\t\t\t\t\t\t\tbottomRow = i;\n\t\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}else {\n\t\t\t\t\t\tif(bottomEdge - rows[i].getElement().offsetTop >= 0){\n\t\t\t\t\t\t\tbottomRow = i;\n\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn rows.slice(topRow, bottomRow + 1);\n\t}\n\n\t//////////////////////////////////////\n\t//////// Internal Rendering //////////\n\t//////////////////////////////////////\n\n\t//full virtual render\n\t_virtualRenderFill(position, forceMove, offset) {\n\t\tvar\telement = this.tableElement,\n\t\tholder = this.elementVertical,\n\t\ttopPad = 0,\n\t\trowsHeight = 0,\n\t\trowHeight = 0,\n\t\theightOccupied = 0,\n\t\ttopPadHeight = 0,\n\t\ti = 0,\n\t\trows = this.rows(),\n\t\trowsCount = rows.length,\n\t\tindex = 0,\n\t\trow,\n\t\trowFragment,\n\t\trenderedRows = [],\n\t\ttotalRowsRendered = 0,\n\t\trowsToRender = 0,\n\t\tfixedHeight = this.table.rowManager.fixedHeight,\n\t\tcontainerHeight = this.elementVertical.clientHeight, \n\t\tavgRowHeight = this.table.options.rowHeight, \n\t\tresized = true;\n\n\t\tposition = position || 0;\n\n\t\toffset = offset || 0;\n\n\t\tif(!position){\n\t\t\tthis.clear();\n\t\t}else {\n\t\t\twhile(element.firstChild) element.removeChild(element.firstChild);\n\n\t\t\t//check if position is too close to bottom of table\n\t\t\theightOccupied = (rowsCount - position + 1) * this.vDomRowHeight;\n\n\t\t\tif(heightOccupied < containerHeight){\n\t\t\t\tposition -= Math.ceil((containerHeight - heightOccupied) / this.vDomRowHeight);\n\t\t\t\tif(position < 0){\n\t\t\t\t\tposition = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//calculate initial pad\n\t\t\ttopPad = Math.min(Math.max(Math.floor(this.vDomWindowBuffer / this.vDomRowHeight), this.vDomWindowMinMarginRows), position);\n\t\t\tposition -= topPad;\n\t\t}\n\n\t\tif(rowsCount && Helpers.elVisible(this.elementVertical)){\n\t\t\tthis.vDomTop = position;\n\t\t\tthis.vDomBottom = position -1;\n\n\t\t\tif(fixedHeight || this.table.options.maxHeight) {\n\t\t\t\tif(avgRowHeight) {\n\t\t\t\t\trowsToRender = (containerHeight / avgRowHeight) + (this.vDomWindowBuffer / avgRowHeight);\n\t\t\t\t}\n\t\t\t\trowsToRender = Math.max(this.vDomWindowMinTotalRows, Math.ceil(rowsToRender));\n\t\t\t}\n\t\t\telse {\n\t\t\t\trowsToRender = rowsCount;\n\t\t\t}\n\n\t\t\twhile(((rowsToRender == rowsCount || rowsHeight <= containerHeight + this.vDomWindowBuffer) || totalRowsRendered < this.vDomWindowMinTotalRows) && this.vDomBottom < rowsCount -1) {\n\t\t\t\trenderedRows = [];\n\t\t\t\trowFragment = document.createDocumentFragment();\n\n\t\t\t\ti = 0;\n\n\t\t\t\twhile ((i < rowsToRender) && this.vDomBottom < rowsCount -1) {\t\n\t\t\t\t\tindex = this.vDomBottom + 1,\n\t\t\t\t\trow = rows[index];\n\n\t\t\t\t\tthis.styleRow(row, index);\n\n\t\t\t\t\trow.initialize(false, true);\n\t\t\t\t\tif(!row.heightInitialized && !this.table.options.rowHeight){\n\t\t\t\t\t\trow.clearCellHeight();\n\t\t\t\t\t}\n\n\t\t\t\t\trowFragment.appendChild(row.getElement());\n\t\t\t\t\trenderedRows.push(row);\n\t\t\t\t\tthis.vDomBottom ++;\n\t\t\t\t\ti++;\n\t\t\t\t}\n\n\t\t\t\tif(!renderedRows.length){\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\telement.appendChild(rowFragment);\n\t\t\t\t\n\t\t\t\t// NOTE: The next 3 loops are separate on purpose\n\t\t\t\t// This is to batch up the dom writes and reads which drastically improves performance \n\n\t\t\t\trenderedRows.forEach((row) => {\n\t\t\t\t\trow.rendered();\n\n\t\t\t\t\tif(!row.heightInitialized) {\n\t\t\t\t\t\trow.calcHeight(true);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\trenderedRows.forEach((row) => {\n\t\t\t\t\tif(!row.heightInitialized) {\n\t\t\t\t\t\trow.setCellHeight();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\trenderedRows.forEach((row) => {\n\t\t\t\t\trowHeight = row.getHeight();\n\t\t\t\t\t\n\t\t\t\t\tif(totalRowsRendered < topPad){\n\t\t\t\t\t\ttopPadHeight += rowHeight;\n\t\t\t\t\t}else {\n\t\t\t\t\t\trowsHeight += rowHeight;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(rowHeight > this.vDomWindowBuffer){\n\t\t\t\t\t\tthis.vDomWindowBuffer = rowHeight * 2;\n\t\t\t\t\t}\n\t\t\t\t\ttotalRowsRendered++;\n\t\t\t\t});\n\n\t\t\t\tresized = this.table.rowManager.adjustTableSize();\n\t\t\t\tcontainerHeight = this.elementVertical.clientHeight;\n\t\t\t\tif(resized && (fixedHeight || this.table.options.maxHeight))\n\t\t\t\t{\n\t\t\t\t\tavgRowHeight = rowsHeight / totalRowsRendered;\n\t\t\t\t\trowsToRender = Math.max(this.vDomWindowMinTotalRows, Math.ceil((containerHeight / avgRowHeight) + (this.vDomWindowBuffer / avgRowHeight)));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!position){\n\t\t\t\tthis.vDomTopPad = 0;\n\t\t\t\t//adjust row height to match average of rendered elements\n\t\t\t\tthis.vDomRowHeight = Math.floor((rowsHeight + topPadHeight) / totalRowsRendered);\n\t\t\t\tthis.vDomBottomPad = this.vDomRowHeight * (rowsCount - this.vDomBottom -1);\n\n\t\t\t\tthis.vDomScrollHeight = topPadHeight + rowsHeight + this.vDomBottomPad - containerHeight;\n\t\t\t}else {\n\t\t\t\tthis.vDomTopPad = !forceMove ? this.scrollTop - topPadHeight : (this.vDomRowHeight * this.vDomTop) + offset;\n\t\t\t\tthis.vDomBottomPad = this.vDomBottom == rowsCount-1 ? 0 : Math.max(this.vDomScrollHeight - this.vDomTopPad - rowsHeight - topPadHeight, 0);\n\t\t\t}\n\t\t\t\n\t\t\telement.style.paddingTop = this.vDomTopPad+\"px\";\n\t\t\telement.style.paddingBottom = this.vDomBottomPad+\"px\";\n\n\t\t\tif(forceMove){\n\t\t\t\tthis.scrollTop = this.vDomTopPad + (topPadHeight) + offset - (this.elementVertical.scrollWidth > this.elementVertical.clientWidth ? this.elementVertical.offsetHeight - containerHeight : 0);\n\t\t\t}\n\n\t\t\tthis.scrollTop = Math.min(this.scrollTop, this.elementVertical.scrollHeight - containerHeight);\n\n\t\t\t//adjust for horizontal scrollbar if present (and not at top of table)\n\t\t\tif(this.elementVertical.scrollWidth > this.elementVertical.clientWidth && forceMove){\n\t\t\t\tthis.scrollTop += this.elementVertical.offsetHeight - containerHeight;\n\t\t\t}\n\n\t\t\tthis.vDomScrollPosTop = this.scrollTop;\n\t\t\tthis.vDomScrollPosBottom = this.scrollTop;\n\n\t\t\tholder.scrollTop = this.scrollTop;\n\n\t\t\tthis.dispatch(\"render-virtual-fill\");\n\t\t}\n\t}\n\n\t_addTopRow(rows, fillableSpace){\n\t\tvar table = this.tableElement,\n\t\taddedRows = [],\n\t\tpaddingAdjust = 0,\n\t\tindex = this.vDomTop -1,\n\t\ti = 0,\n\t\tworking = true;\n\n\t\twhile(working){\n\t\t\tif(this.vDomTop){\n\t\t\t\tlet row = rows[index],\n\t\t\t\trowHeight, initialized;\n\n\t\t\t\tif(row && i < this.vDomMaxRenderChain){\n\t\t\t\t\trowHeight = row.getHeight() || this.vDomRowHeight;\n\t\t\t\t\tinitialized = row.initialized;\n\n\t\t\t\t\tif(fillableSpace >= rowHeight){\n\n\t\t\t\t\t\tthis.styleRow(row, index);\n\t\t\t\t\t\ttable.insertBefore(row.getElement(), table.firstChild);\n\n\t\t\t\t\t\tif(!row.initialized || !row.heightInitialized){\n\t\t\t\t\t\t\taddedRows.push(row);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\trow.initialize();\n\n\t\t\t\t\t\tif(!initialized){\n\t\t\t\t\t\t\trowHeight = row.getElement().offsetHeight;\n\n\t\t\t\t\t\t\tif(rowHeight > this.vDomWindowBuffer){\n\t\t\t\t\t\t\t\tthis.vDomWindowBuffer = rowHeight * 2;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfillableSpace -= rowHeight;\n\t\t\t\t\t\tpaddingAdjust += rowHeight;\n\n\t\t\t\t\t\tthis.vDomTop--;\n\t\t\t\t\t\tindex--;\n\t\t\t\t\t\ti++;\n\n\t\t\t\t\t}else {\n\t\t\t\t\t\tworking = false;\n\t\t\t\t\t}\n\n\t\t\t\t}else {\n\t\t\t\t\tworking = false;\n\t\t\t\t}\n\n\t\t\t}else {\n\t\t\t\tworking = false;\n\t\t\t}\n\t\t}\n\n\t\tfor (let row of addedRows){\n\t\t\trow.clearCellHeight();\n\t\t}\n\n\t\tthis._quickNormalizeRowHeight(addedRows);\n\n\t\tif(paddingAdjust){\n\t\t\tthis.vDomTopPad -= paddingAdjust;\n\n\t\t\tif(this.vDomTopPad < 0){\n\t\t\t\tthis.vDomTopPad = index * this.vDomRowHeight;\n\t\t\t}\n\n\t\t\tif(index < 1){\n\t\t\t\tthis.vDomTopPad = 0;\n\t\t\t}\n\n\t\t\ttable.style.paddingTop = this.vDomTopPad + \"px\";\n\t\t\tthis.vDomScrollPosTop -= paddingAdjust;\n\t\t}\n\t}\n\n\t_removeTopRow(rows, fillableSpace){\n\t\tvar removableRows = [],\n\t\tpaddingAdjust = 0,\n\t\ti = 0,\n\t\tworking = true;\n\n\t\twhile(working){\n\t\t\tlet row = rows[this.vDomTop],\n\t\t\trowHeight;\n\n\t\t\tif(row && i < this.vDomMaxRenderChain){\n\t\t\t\trowHeight = row.getHeight() || this.vDomRowHeight;\n\n\t\t\t\tif(fillableSpace >= rowHeight){\n\t\t\t\t\tthis.vDomTop++;\n\n\t\t\t\t\tfillableSpace -= rowHeight;\n\t\t\t\t\tpaddingAdjust += rowHeight;\n\n\t\t\t\t\tremovableRows.push(row);\n\t\t\t\t\ti++;\n\t\t\t\t}else {\n\t\t\t\t\tworking = false;\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tworking = false;\n\t\t\t}\n\t\t}\n\n\t\tfor (let row of removableRows){\n\t\t\tlet rowEl = row.getElement();\n\n\t\t\tif(rowEl.parentNode){\n\t\t\t\trowEl.parentNode.removeChild(rowEl);\n\t\t\t}\n\t\t}\n\n\t\tif(paddingAdjust){\n\t\t\tthis.vDomTopPad += paddingAdjust;\n\t\t\tthis.tableElement.style.paddingTop = this.vDomTopPad + \"px\";\n\t\t\tthis.vDomScrollPosTop += this.vDomTop ? paddingAdjust : paddingAdjust + this.vDomWindowBuffer;\n\t\t}\n\t}\n\n\t_addBottomRow(rows, fillableSpace){\n\t\tvar table = this.tableElement,\n\t\taddedRows = [],\n\t\tpaddingAdjust = 0,\n\t\tindex = this.vDomBottom + 1,\n\t\ti = 0,\n\t\tworking = true;\n\n\t\twhile(working){\n\t\t\tlet row = rows[index],\n\t\t\trowHeight, initialized;\n\n\t\t\tif(row && i < this.vDomMaxRenderChain){\n\t\t\t\trowHeight = row.getHeight() || this.vDomRowHeight;\n\t\t\t\tinitialized = row.initialized;\n\n\t\t\t\tif(fillableSpace >= rowHeight){\n\n\t\t\t\t\tthis.styleRow(row, index);\n\t\t\t\t\ttable.appendChild(row.getElement());\n\n\t\t\t\t\tif(!row.initialized || !row.heightInitialized){\n\t\t\t\t\t\taddedRows.push(row);\n\t\t\t\t\t}\n\n\t\t\t\t\trow.initialize();\n\n\t\t\t\t\tif(!initialized){\n\t\t\t\t\t\trowHeight = row.getElement().offsetHeight;\n\n\t\t\t\t\t\tif(rowHeight > this.vDomWindowBuffer){\n\t\t\t\t\t\t\tthis.vDomWindowBuffer = rowHeight * 2;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tfillableSpace -= rowHeight;\n\t\t\t\t\tpaddingAdjust += rowHeight;\n\n\t\t\t\t\tthis.vDomBottom++;\n\t\t\t\t\tindex++;\n\t\t\t\t\ti++;\n\t\t\t\t}else {\n\t\t\t\t\tworking = false;\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tworking = false;\n\t\t\t}\n\t\t}\n\n\t\tfor (let row of addedRows){\n\t\t\trow.clearCellHeight();\n\t\t}\n\n\t\tthis._quickNormalizeRowHeight(addedRows);\n\n\t\tif(paddingAdjust){\n\t\t\tthis.vDomBottomPad -= paddingAdjust;\n\n\t\t\tif(this.vDomBottomPad < 0 || index == rows.length -1){\n\t\t\t\tthis.vDomBottomPad = 0;\n\t\t\t}\n\n\t\t\ttable.style.paddingBottom = this.vDomBottomPad + \"px\";\n\t\t\tthis.vDomScrollPosBottom += paddingAdjust;\n\t\t}\n\t}\n\n\t_removeBottomRow(rows, fillableSpace){\n\t\tvar removableRows = [],\n\t\tpaddingAdjust = 0,\n\t\ti = 0,\n\t\tworking = true;\n\n\t\twhile(working){\n\t\t\tlet row = rows[this.vDomBottom],\n\t\t\trowHeight;\n\n\t\t\tif(row && i < this.vDomMaxRenderChain){\n\t\t\t\trowHeight = row.getHeight() || this.vDomRowHeight;\n\n\t\t\t\tif(fillableSpace >= rowHeight){\n\t\t\t\t\tthis.vDomBottom --;\n\n\t\t\t\t\tfillableSpace -= rowHeight;\n\t\t\t\t\tpaddingAdjust += rowHeight;\n\n\t\t\t\t\tremovableRows.push(row);\n\t\t\t\t\ti++;\n\t\t\t\t}else {\n\t\t\t\t\tworking = false;\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tworking = false;\n\t\t\t}\n\t\t}\n\n\t\tfor (let row of removableRows){\n\t\t\tlet rowEl = row.getElement();\n\n\t\t\tif(rowEl.parentNode){\n\t\t\t\trowEl.parentNode.removeChild(rowEl);\n\t\t\t}\n\t\t}\n\n\t\tif(paddingAdjust){\n\t\t\tthis.vDomBottomPad += paddingAdjust;\n\n\t\t\tif(this.vDomBottomPad < 0){\n\t\t\t\tthis.vDomBottomPad = 0;\n\t\t\t}\n\n\t\t\tthis.tableElement.style.paddingBottom = this.vDomBottomPad + \"px\";\n\t\t\tthis.vDomScrollPosBottom -= paddingAdjust;\n\t\t}\n\t}\n\n\t_quickNormalizeRowHeight(rows){\n\t\tfor(let row of rows){\n\t\t\trow.calcHeight();\n\t\t}\n\n\t\tfor(let row of rows){\n\t\t\trow.setCellHeight();\n\t\t}\n\t}\n}\n\nclass RowManager extends CoreFeature{\n\t\n\tconstructor(table){\n\t\tsuper(table);\n\t\t\n\t\tthis.element = this.createHolderElement(); //containing element\n\t\tthis.tableElement = this.createTableElement(); //table element\n\t\tthis.heightFixer = this.createTableElement(); //table element\n\t\tthis.placeholder = null; //placeholder element\n\t\tthis.placeholderContents = null; //placeholder element\n\t\t\n\t\tthis.firstRender = false; //handle first render\n\t\tthis.renderMode = \"virtual\"; //current rendering mode\n\t\tthis.fixedHeight = false; //current rendering mode\n\t\t\n\t\tthis.rows = []; //hold row data objects\n\t\tthis.activeRowsPipeline = []; //hold calculation of active rows\n\t\tthis.activeRows = []; //rows currently available to on display in the table\n\t\tthis.activeRowsCount = 0; //count of active rows\n\t\t\n\t\tthis.displayRows = []; //rows currently on display in the table\n\t\tthis.displayRowsCount = 0; //count of display rows\n\t\t\n\t\tthis.scrollTop = 0;\n\t\tthis.scrollLeft = 0;\n\t\t\n\t\tthis.redrawBlock = false; //prevent redraws to allow multiple data manipulations before continuing\n\t\tthis.redrawBlockRestoreConfig = false; //store latest redraw function calls for when redraw is needed\n\t\tthis.redrawBlockRenderInPosition = false; //store latest redraw function calls for when redraw is needed\n\t\t\n\t\tthis.dataPipeline = []; //hold data pipeline tasks\n\t\tthis.displayPipeline = []; //hold data display pipeline tasks\n\t\t\n\t\tthis.scrollbarWidth = 0;\n\t\t\n\t\tthis.renderer = null;\n\t}\n\t\n\t//////////////// Setup Functions /////////////////\n\t\n\tcreateHolderElement (){\n\t\tvar el = document.createElement(\"div\");\n\t\t\n\t\tel.classList.add(\"tabulator-tableholder\");\n\t\tel.setAttribute(\"tabindex\", 0);\n\t\t// el.setAttribute(\"role\", \"rowgroup\");\n\t\t\n\t\treturn el;\n\t}\n\t\n\tcreateTableElement (){\n\t\tvar el = document.createElement(\"div\");\n\t\t\n\t\tel.classList.add(\"tabulator-table\");\n\t\tel.setAttribute(\"role\", \"rowgroup\");\n\t\t\n\t\treturn el;\n\t}\n\t\n\tinitializePlaceholder(){\n\t\tvar placeholder = this.table.options.placeholder;\n\t\t\n\t\tif(typeof placeholder === \"function\"){\n\t\t\tplaceholder = placeholder.call(this.table);\n\t\t}\n\t\t\n\t\tplaceholder = this.chain(\"placeholder\", [placeholder], placeholder, placeholder) || placeholder;\n\t\t\n\t\t//configure placeholder element\n\t\tif(placeholder){\t\n\t\t\tlet el = document.createElement(\"div\");\n\t\t\tel.classList.add(\"tabulator-placeholder\");\n\t\t\t\n\t\t\tif(typeof placeholder == \"string\"){\n\t\t\t\tlet contents = document.createElement(\"div\");\n\t\t\t\tcontents.classList.add(\"tabulator-placeholder-contents\");\n\t\t\t\tcontents.innerHTML = placeholder;\n\t\t\t\t\n\t\t\t\tel.appendChild(contents);\n\t\t\t\t\n\t\t\t\tthis.placeholderContents = contents;\n\t\t\t\t\n\t\t\t}else if(typeof HTMLElement !== \"undefined\" && placeholder instanceof HTMLElement){\n\t\t\t\t\n\t\t\t\tel.appendChild(placeholder);\n\t\t\t\tthis.placeholderContents = placeholder;\n\t\t\t}else {\n\t\t\t\tconsole.warn(\"Invalid placeholder provided, must be string or HTML Element\", placeholder);\n\t\t\t\t\n\t\t\t\tthis.el = null;\n\t\t\t}\n\t\t\t\n\t\t\tthis.placeholder = el;\n\t\t}\n\t}\n\t\n\t//return containing element\n\tgetElement(){\n\t\treturn this.element;\n\t}\n\t\n\t//return table element\n\tgetTableElement(){\n\t\treturn this.tableElement;\n\t}\n\t\n\tinitialize(){\n\t\tthis.initializePlaceholder();\n\t\tthis.initializeRenderer();\n\t\t\n\t\t//initialize manager\n\t\tthis.element.appendChild(this.tableElement);\n\t\t\n\t\tthis.firstRender = true;\n\t\t\n\t\t//scroll header along with table body\n\t\tthis.element.addEventListener(\"scroll\", () => {\n\t\t\tvar left = this.element.scrollLeft,\n\t\t\tleftDir = this.scrollLeft > left,\n\t\t\ttop = this.element.scrollTop,\n\t\t\ttopDir = this.scrollTop > top;\n\t\t\t\n\t\t\t//handle horizontal scrolling\n\t\t\tif(this.scrollLeft != left){\n\t\t\t\tthis.scrollLeft = left;\n\t\t\t\t\n\t\t\t\tthis.dispatch(\"scroll-horizontal\", left, leftDir);\n\t\t\t\tthis.dispatchExternal(\"scrollHorizontal\", left, leftDir);\n\t\t\t\t\n\t\t\t\tthis._positionPlaceholder();\n\t\t\t}\n\t\t\t\n\t\t\t//handle vertical scrolling\n\t\t\tif(this.scrollTop != top){\n\t\t\t\tthis.scrollTop = top;\n\t\t\t\t\n\t\t\t\tthis.renderer.scrollRows(top, topDir);\n\t\t\t\t\n\t\t\t\tthis.dispatch(\"scroll-vertical\", top, topDir);\n\t\t\t\tthis.dispatchExternal(\"scrollVertical\", top, topDir);\n\t\t\t}\n\t\t});\n\t}\n\t\n\t////////////////// Row Manipulation //////////////////\n\tfindRow(subject){\n\t\tif(typeof subject == \"object\"){\n\t\t\tif(subject instanceof Row){\n\t\t\t\t//subject is row element\n\t\t\t\treturn subject;\n\t\t\t}else if(subject instanceof RowComponent){\n\t\t\t\t//subject is public row component\n\t\t\t\treturn subject._getSelf() || false;\n\t\t\t}else if(typeof HTMLElement !== \"undefined\" && subject instanceof HTMLElement){\n\t\t\t\t//subject is a HTML element of the row\n\t\t\t\tlet match = this.rows.find((row) => {\n\t\t\t\t\treturn row.getElement() === subject;\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\treturn match || false;\n\t\t\t}else if(subject === null){\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}else if(typeof subject == \"undefined\"){\n\t\t\treturn false;\n\t\t}else {\n\t\t\t//subject should be treated as the index of the row\n\t\t\tlet match = this.rows.find((row) => {\n\t\t\t\treturn row.data[this.table.options.index] == subject;\n\t\t\t});\n\t\t\t\n\t\t\treturn match || false;\n\t\t}\n\t\t\n\t\t//catch all for any other type of input\n\t\treturn false;\n\t}\n\t\n\tgetRowFromDataObject(data){\n\t\tvar match = this.rows.find((row) => {\n\t\t\treturn row.data === data;\n\t\t});\n\t\t\n\t\treturn match || false;\n\t}\n\t\n\tgetRowFromPosition(position){\n\t\treturn this.getDisplayRows().find((row) => {\n\t\t\treturn row.type === \"row\" && row.getPosition() === position && row.isDisplayed();\n\t\t});\n\t}\n\t\n\tscrollToRow(row, position, ifVisible){\n\t\treturn this.renderer.scrollToRowPosition(row, position, ifVisible);\n\t}\n\t\n\t////////////////// Data Handling //////////////////\n\tsetData(data, renderInPosition, columnsChanged){\n\t\treturn new Promise((resolve, reject)=>{\n\t\t\tif(renderInPosition && this.getDisplayRows().length){\n\t\t\t\tif(this.table.options.pagination){\n\t\t\t\t\tthis._setDataActual(data, true);\n\t\t\t\t}else {\n\t\t\t\t\tthis.reRenderInPosition(() => {\n\t\t\t\t\t\tthis._setDataActual(data);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tif(this.table.options.autoColumns && columnsChanged && this.table.initialized){\n\t\t\t\t\tthis.table.columnManager.generateColumnsFromRowData(data);\n\t\t\t\t}\n\t\t\t\tthis.resetScroll();\n\t\t\t\t\n\t\t\t\tthis._setDataActual(data);\n\t\t\t}\n\t\t\t\n\t\t\tresolve();\n\t\t});\n\t}\n\t\n\t_setDataActual(data, renderInPosition){\n\t\tthis.dispatchExternal(\"dataProcessing\", data);\n\t\t\n\t\tthis._wipeElements();\n\t\t\n\t\tif(Array.isArray(data)){\n\t\t\tthis.dispatch(\"data-processing\", data);\n\t\t\t\n\t\t\tdata.forEach((def, i) => {\n\t\t\t\tif(def && typeof def === \"object\"){\n\t\t\t\t\tvar row = new Row(def, this);\n\t\t\t\t\tthis.rows.push(row);\n\t\t\t\t}else {\n\t\t\t\t\tconsole.warn(\"Data Loading Warning - Invalid row data detected and ignored, expecting object but received:\", def);\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tthis.refreshActiveData(false, false, renderInPosition);\n\t\t\t\n\t\t\tthis.dispatch(\"data-processed\", data);\n\t\t\tthis.dispatchExternal(\"dataProcessed\", data);\n\t\t}else {\n\t\t\tconsole.error(\"Data Loading Error - Unable to process data due to invalid data type \\nExpecting: array \\nReceived: \", typeof data, \"\\nData: \", data);\n\t\t}\n\t}\n\t\n\t_wipeElements(){\n\t\tthis.dispatch(\"rows-wipe\");\n\t\t\n\t\tthis.destroy();\n\t\t\n\t\tthis.adjustTableSize();\n\t\t\n\t\tthis.dispatch(\"rows-wiped\");\n\t}\n\t\n\tdestroy(){\n\t\tthis.rows.forEach((row) => {\n\t\t\trow.wipe();\n\t\t});\n\t\t\n\t\tthis.rows = [];\n\t\tthis.activeRows = [];\n\t\tthis.activeRowsPipeline = [];\n\t\tthis.activeRowsCount = 0;\n\t\tthis.displayRows = [];\n\t\tthis.displayRowsCount = 0;\n\t}\n\t\n\tdeleteRow(row, blockRedraw){\n\t\tvar allIndex = this.rows.indexOf(row),\n\t\tactiveIndex = this.activeRows.indexOf(row);\n\t\t\n\t\tif(activeIndex > -1){\n\t\t\tthis.activeRows.splice(activeIndex, 1);\n\t\t}\n\t\t\n\t\tif(allIndex > -1){\n\t\t\tthis.rows.splice(allIndex, 1);\n\t\t}\n\t\t\n\t\tthis.setActiveRows(this.activeRows);\n\t\t\n\t\tthis.displayRowIterator((rows) => {\n\t\t\tvar displayIndex = rows.indexOf(row);\n\t\t\t\n\t\t\tif(displayIndex > -1){\n\t\t\t\trows.splice(displayIndex, 1);\n\t\t\t}\n\t\t});\n\t\t\n\t\tif(!blockRedraw){\n\t\t\tthis.reRenderInPosition();\n\t\t}\n\t\t\n\t\tthis.regenerateRowPositions();\n\t\t\n\t\tthis.dispatchExternal(\"rowDeleted\", row.getComponent());\n\t\t\n\t\tif(!this.displayRowsCount){\n\t\t\tthis.tableEmpty();\n\t\t}\n\t\t\n\t\tif(this.subscribedExternal(\"dataChanged\")){\n\t\t\tthis.dispatchExternal(\"dataChanged\", this.getData());\n\t\t}\n\t}\n\t\n\taddRow(data, pos, index, blockRedraw){\n\t\tvar row = this.addRowActual(data, pos, index, blockRedraw);\n\t\treturn row;\n\t}\n\t\n\t//add multiple rows\n\taddRows(data, pos, index, refreshDisplayOnly){\n\t\tvar rows = [];\n\t\t\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tpos = this.findAddRowPos(pos);\n\t\t\t\n\t\t\tif(!Array.isArray(data)){\n\t\t\t\tdata = [data];\n\t\t\t}\n\t\t\t\n\t\t\tif((typeof index == \"undefined\" && pos) || (typeof index !== \"undefined\" && !pos)){\n\t\t\t\tdata.reverse();\n\t\t\t}\n\t\t\t\n\t\t\tdata.forEach((item, i) => {\n\t\t\t\tvar row = this.addRow(item, pos, index, true);\n\t\t\t\trows.push(row);\n\t\t\t\tthis.dispatch(\"row-added\", row, item, pos, index);\n\t\t\t});\n\t\t\t\n\t\t\tthis.refreshActiveData(refreshDisplayOnly ? \"displayPipeline\" : false, false, true);\n\t\t\t\n\t\t\tthis.regenerateRowPositions();\n\t\t\t\n\t\t\tif(this.displayRowsCount){\n\t\t\t\tthis._clearPlaceholder();\n\t\t\t}\n\t\t\t\n\t\t\tresolve(rows);\n\t\t});\n\t}\n\t\n\tfindAddRowPos(pos){\n\t\tif(typeof pos === \"undefined\"){\n\t\t\tpos = this.table.options.addRowPos;\n\t\t}\n\t\t\n\t\tif(pos === \"pos\"){\n\t\t\tpos = true;\n\t\t}\n\t\t\n\t\tif(pos === \"bottom\"){\n\t\t\tpos = false;\n\t\t}\n\t\t\n\t\treturn pos;\n\t}\n\t\n\taddRowActual(data, pos, index, blockRedraw){\n\t\tvar row = data instanceof Row ? data : new Row(data || {}, this),\n\t\ttop = this.findAddRowPos(pos),\n\t\tallIndex = -1,\n\t\tactiveIndex, chainResult;\n\t\t\n\t\tif(!index){\n\t\t\tchainResult = this.chain(\"row-adding-position\", [row, top], null, {index, top});\n\t\t\t\n\t\t\tindex = chainResult.index;\n\t\t\ttop = chainResult.top;\n\t\t}\n\t\t\n\t\tif(typeof index !== \"undefined\"){\n\t\t\tindex = this.findRow(index);\n\t\t}\n\t\t\n\t\tindex = this.chain(\"row-adding-index\", [row, index, top], null, index);\n\t\t\n\t\tif(index){\n\t\t\tallIndex = this.rows.indexOf(index);\n\t\t}\n\t\t\n\t\tif(index && allIndex > -1){\n\t\t\tactiveIndex = this.activeRows.indexOf(index);\n\t\t\t\n\t\t\tthis.displayRowIterator(function(rows){\n\t\t\t\tvar displayIndex = rows.indexOf(index);\n\t\t\t\t\n\t\t\t\tif(displayIndex > -1){\n\t\t\t\t\trows.splice((top ? displayIndex : displayIndex + 1), 0, row);\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tif(activeIndex > -1){\n\t\t\t\tthis.activeRows.splice((top ? activeIndex : activeIndex + 1), 0, row);\n\t\t\t}\n\t\t\t\n\t\t\tthis.rows.splice((top ? allIndex : allIndex + 1), 0, row);\n\t\t\t\n\t\t}else {\n\t\t\t\n\t\t\tif(top){\n\t\t\t\t\n\t\t\t\tthis.displayRowIterator(function(rows){\n\t\t\t\t\trows.unshift(row);\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tthis.activeRows.unshift(row);\n\t\t\t\tthis.rows.unshift(row);\n\t\t\t}else {\n\t\t\t\tthis.displayRowIterator(function(rows){\n\t\t\t\t\trows.push(row);\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tthis.activeRows.push(row);\n\t\t\t\tthis.rows.push(row);\n\t\t\t}\n\t\t}\n\t\t\n\t\tthis.setActiveRows(this.activeRows);\n\t\t\n\t\tthis.dispatchExternal(\"rowAdded\", row.getComponent());\n\t\t\n\t\tif(this.subscribedExternal(\"dataChanged\")){\n\t\t\tthis.dispatchExternal(\"dataChanged\", this.table.rowManager.getData());\n\t\t}\n\t\t\n\t\tif(!blockRedraw){\n\t\t\tthis.reRenderInPosition();\n\t\t}\n\t\t\n\t\treturn row;\n\t}\n\t\n\tmoveRow(from, to, after){\n\t\tthis.dispatch(\"row-move\", from, to, after);\n\t\t\n\t\tthis.moveRowActual(from, to, after);\n\t\t\n\t\tthis.regenerateRowPositions();\n\t\t\n\t\tthis.dispatch(\"row-moved\", from, to, after);\n\t\tthis.dispatchExternal(\"rowMoved\", from.getComponent());\n\t}\n\t\n\tmoveRowActual(from, to, after){\n\t\tthis.moveRowInArray(this.rows, from, to, after);\n\t\tthis.moveRowInArray(this.activeRows, from, to, after);\n\t\t\n\t\tthis.displayRowIterator((rows) => {\n\t\t\tthis.moveRowInArray(rows, from, to, after);\n\t\t});\n\t\t\n\t\tthis.dispatch(\"row-moving\", from, to, after);\n\t}\n\t\n\tmoveRowInArray(rows, from, to, after){\n\t\tvar\tfromIndex, toIndex, start, end;\n\t\t\n\t\tif(from !== to){\n\t\t\t\n\t\t\tfromIndex = rows.indexOf(from);\n\t\t\t\n\t\t\tif (fromIndex > -1) {\n\t\t\t\t\n\t\t\t\trows.splice(fromIndex, 1);\n\t\t\t\t\n\t\t\t\ttoIndex = rows.indexOf(to);\n\t\t\t\t\n\t\t\t\tif (toIndex > -1) {\n\t\t\t\t\t\n\t\t\t\t\tif(after){\n\t\t\t\t\t\trows.splice(toIndex+1, 0, from);\n\t\t\t\t\t}else {\n\t\t\t\t\t\trows.splice(toIndex, 0, from);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}else {\n\t\t\t\t\trows.splice(fromIndex, 0, from);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//restyle rows\n\t\t\tif(rows === this.getDisplayRows()){\n\t\t\t\t\n\t\t\t\tstart = fromIndex < toIndex ? fromIndex : toIndex;\n\t\t\t\tend = toIndex > fromIndex ? toIndex : fromIndex +1;\n\t\t\t\t\n\t\t\t\tfor(let i = start; i <= end; i++){\n\t\t\t\t\tif(rows[i]){\n\t\t\t\t\t\tthis.styleRow(rows[i], i);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tclearData(){\n\t\tthis.setData([]);\n\t}\n\t\n\tgetRowIndex(row){\n\t\treturn this.findRowIndex(row, this.rows);\n\t}\n\t\n\tgetDisplayRowIndex(row){\n\t\tvar index = this.getDisplayRows().indexOf(row);\n\t\treturn index > -1 ? index : false;\n\t}\n\t\n\tnextDisplayRow(row, rowOnly){\n\t\tvar index = this.getDisplayRowIndex(row),\n\t\tnextRow = false;\n\t\t\n\t\t\n\t\tif(index !== false && index < this.displayRowsCount -1){\n\t\t\tnextRow = this.getDisplayRows()[index+1];\n\t\t}\n\t\t\n\t\tif(nextRow && (!(nextRow instanceof Row) || nextRow.type != \"row\")){\n\t\t\treturn this.nextDisplayRow(nextRow, rowOnly);\n\t\t}\n\t\t\n\t\treturn nextRow;\n\t}\n\t\n\tprevDisplayRow(row, rowOnly){\n\t\tvar index = this.getDisplayRowIndex(row),\n\t\tprevRow = false;\n\t\t\n\t\tif(index){\n\t\t\tprevRow = this.getDisplayRows()[index-1];\n\t\t}\n\t\t\n\t\tif(rowOnly && prevRow && (!(prevRow instanceof Row) || prevRow.type != \"row\")){\n\t\t\treturn this.prevDisplayRow(prevRow, rowOnly);\n\t\t}\n\t\t\n\t\treturn prevRow;\n\t}\n\t\n\tfindRowIndex(row, list){\n\t\tvar rowIndex;\n\t\t\n\t\trow = this.findRow(row);\n\t\t\n\t\tif(row){\n\t\t\trowIndex = list.indexOf(row);\n\t\t\t\n\t\t\tif(rowIndex > -1){\n\t\t\t\treturn rowIndex;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\tgetData(active, transform){\n\t\tvar output = [],\n\t\trows = this.getRows(active);\n\t\t\n\t\trows.forEach(function(row){\n\t\t\tif(row.type == \"row\"){\n\t\t\t\toutput.push(row.getData(transform || \"data\"));\n\t\t\t}\n\t\t});\n\t\t\n\t\treturn output;\n\t}\n\t\n\tgetComponents(active){\n\t\tvar\toutput = [],\n\t\trows = this.getRows(active);\n\t\t\n\t\trows.forEach(function(row){\n\t\t\toutput.push(row.getComponent());\n\t\t});\n\t\t\n\t\treturn output;\n\t}\n\t\n\tgetDataCount(active){\n\t\tvar rows = this.getRows(active);\n\t\t\n\t\treturn rows.length;\n\t}\n\t\n\tscrollHorizontal(left){\n\t\tthis.scrollLeft = left;\n\t\tthis.element.scrollLeft = left;\n\t\t\n\t\tthis.dispatch(\"scroll-horizontal\", left);\n\t}\n\t\n\tregisterDataPipelineHandler(handler, priority){\n\t\tif(typeof priority !== \"undefined\"){\n\t\t\tthis.dataPipeline.push({handler, priority});\n\t\t\tthis.dataPipeline.sort((a, b) => {\n\t\t\t\treturn a.priority - b.priority;\n\t\t\t});\n\t\t}else {\n\t\t\tconsole.error(\"Data pipeline handlers must have a priority in order to be registered\");\n\t\t}\n\t}\n\t\n\tregisterDisplayPipelineHandler(handler, priority){\n\t\tif(typeof priority !== \"undefined\"){\n\t\t\tthis.displayPipeline.push({handler, priority});\n\t\t\tthis.displayPipeline.sort((a, b) => {\n\t\t\t\treturn a.priority - b.priority;\n\t\t\t});\n\t\t}else {\n\t\t\tconsole.error(\"Display pipeline handlers must have a priority in order to be registered\");\n\t\t}\n\t}\n\t\n\t//set active data set\n\trefreshActiveData(handler, skipStage, renderInPosition){\n\t\tvar table = this.table,\n\t\tstage = \"\",\n\t\tindex = 0,\n\t\tcascadeOrder = [\"all\", \"dataPipeline\", \"display\", \"displayPipeline\", \"end\"];\n\t\t\n\t\tif(!this.table.destroyed){\n\t\t\tif(typeof handler === \"function\"){\n\t\t\t\tindex = this.dataPipeline.findIndex((item) => {\n\t\t\t\t\treturn item.handler === handler;\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tif(index > -1){\n\t\t\t\t\tstage = \"dataPipeline\";\n\t\t\t\t\t\n\t\t\t\t\tif(skipStage){\n\t\t\t\t\t\tif(index == this.dataPipeline.length - 1){\n\t\t\t\t\t\t\tstage = \"display\";\n\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\tindex++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}else {\n\t\t\t\t\tindex = this.displayPipeline.findIndex((item) => {\n\t\t\t\t\t\treturn item.handler === handler;\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tif(index > -1){\n\t\t\t\t\t\tstage = \"displayPipeline\";\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(skipStage){\n\t\t\t\t\t\t\tif(index == this.displayPipeline.length - 1){\n\t\t\t\t\t\t\t\tstage = \"end\";\n\t\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\t\tindex++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}else {\n\t\t\t\t\t\tconsole.error(\"Unable to refresh data, invalid handler provided\", handler);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tstage = handler || \"all\";\n\t\t\t\tindex = 0;\n\t\t\t}\n\t\t\t\n\t\t\tif(this.redrawBlock){\n\t\t\t\tif(!this.redrawBlockRestoreConfig || (this.redrawBlockRestoreConfig && ((this.redrawBlockRestoreConfig.stage === stage && index < this.redrawBlockRestoreConfig.index) || (cascadeOrder.indexOf(stage) < cascadeOrder.indexOf(this.redrawBlockRestoreConfig.stage))))){\n\t\t\t\t\tthis.redrawBlockRestoreConfig = {\n\t\t\t\t\t\thandler: handler,\n\t\t\t\t\t\tskipStage: skipStage,\n\t\t\t\t\t\trenderInPosition: renderInPosition,\n\t\t\t\t\t\tstage:stage,\n\t\t\t\t\t\tindex:index,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn;\n\t\t\t}else {\n\t\t\t\tif(Helpers.elVisible(this.element)){\n\t\t\t\t\tif(renderInPosition){\n\t\t\t\t\t\tthis.reRenderInPosition(this.refreshPipelines.bind(this, handler, stage, index, renderInPosition));\n\t\t\t\t\t}else {\n\t\t\t\t\t\tthis.refreshPipelines(handler, stage, index, renderInPosition);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(!handler){\n\t\t\t\t\t\t\tthis.table.columnManager.renderer.renderColumns();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.renderTable();\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(table.options.layoutColumnsOnNewData){\n\t\t\t\t\t\t\tthis.table.columnManager.redraw(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}else {\n\t\t\t\t\tthis.refreshPipelines(handler, stage, index, renderInPosition);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.dispatch(\"data-refreshed\");\n\t\t\t}\n\t\t}\n\t}\n\t\n\trefreshPipelines(handler, stage, index, renderInPosition){\n\t\tthis.dispatch(\"data-refreshing\");\n\t\t\n\t\tif(!handler || !this.activeRowsPipeline[0]){\n\t\t\tthis.activeRowsPipeline[0] = this.rows.slice(0);\n\t\t}\n\t\t\n\t\t//cascade through data refresh stages\n\t\tswitch(stage){\n\t\t\tcase \"all\":\n\t\t\t//handle case where all data needs refreshing\n\t\t\t\n\t\t\tcase \"dataPipeline\":\n\t\t\t\tfor(let i = index; i < this.dataPipeline.length; i++){\n\t\t\t\t\tlet result = this.dataPipeline[i].handler(this.activeRowsPipeline[i].slice(0));\n\t\t\t\t\n\t\t\t\t\tthis.activeRowsPipeline[i + 1] = result || this.activeRowsPipeline[i].slice(0);\n\t\t\t\t}\n\t\t\t\n\t\t\t\tthis.setActiveRows(this.activeRowsPipeline[this.dataPipeline.length]);\n\t\t\t\n\t\t\tcase \"display\":\n\t\t\t\tindex = 0;\n\t\t\t\tthis.resetDisplayRows();\n\t\t\t\n\t\t\tcase \"displayPipeline\":\n\t\t\t\tfor(let i = index; i < this.displayPipeline.length; i++){\n\t\t\t\t\tlet result = this.displayPipeline[i].handler((i ? this.getDisplayRows(i - 1) : this.activeRows).slice(0), renderInPosition);\n\t\t\t\t\n\t\t\t\t\tthis.setDisplayRows(result || this.getDisplayRows(i - 1).slice(0), i);\n\t\t\t\t}\n\t\t\t\n\t\t\tcase \"end\":\n\t\t\t//case to handle scenario when trying to skip past end stage\n\t\t\t\tthis.regenerateRowPositions();\n\t\t}\n\t\t\n\t\tif(this.getDisplayRows().length){\n\t\t\tthis._clearPlaceholder();\n\t\t}\n\t}\n\t\n\t//regenerate row positions\n\tregenerateRowPositions(){\n\t\tvar rows = this.getDisplayRows();\n\t\tvar index = 1;\n\t\t\n\t\trows.forEach((row) => {\n\t\t\tif (row.type === \"row\"){\n\t\t\t\trow.setPosition(index);\n\t\t\t\tindex++;\n\t\t\t}\n\t\t});\n\t}\n\t\n\tsetActiveRows(activeRows){\n\t\tthis.activeRows = this.activeRows = Object.assign([], activeRows);\n\t\tthis.activeRowsCount = this.activeRows.length;\n\t}\n\t\n\t//reset display rows array\n\tresetDisplayRows(){\n\t\tthis.displayRows = [];\n\t\t\n\t\tthis.displayRows.push(this.activeRows.slice(0));\n\t\t\n\t\tthis.displayRowsCount = this.displayRows[0].length;\n\t}\n\t\n\t//set display row pipeline data\n\tsetDisplayRows(displayRows, index){\n\t\tthis.displayRows[index] = displayRows;\n\t\t\n\t\tif(index == this.displayRows.length -1){\n\t\t\tthis.displayRowsCount = this.displayRows[this.displayRows.length -1].length;\n\t\t}\n\t}\n\t\n\tgetDisplayRows(index){\n\t\tif(typeof index == \"undefined\"){\n\t\t\treturn this.displayRows.length ? this.displayRows[this.displayRows.length -1] : [];\n\t\t}else {\n\t\t\treturn this.displayRows[index] || [];\n\t\t}\n\t}\n\t\n\tgetVisibleRows(chain, viewable){\n\t\tvar rows = Object.assign([], this.renderer.visibleRows(!viewable));\n\t\t\n\t\tif(chain){\n\t\t\trows = this.chain(\"rows-visible\", [viewable], rows, rows);\n\t\t}\n\t\t\n\t\treturn rows;\n\t}\n\t\n\t//repeat action across display rows\n\tdisplayRowIterator(callback){\n\t\tthis.activeRowsPipeline.forEach(callback);\n\t\tthis.displayRows.forEach(callback);\n\t\t\n\t\tthis.displayRowsCount = this.displayRows[this.displayRows.length -1].length;\n\t}\n\t\n\t//return only actual rows (not group headers etc)\n\tgetRows(type){\n\t\tvar rows = [];\n\t\t\n\t\tswitch(type){\n\t\t\tcase \"active\":\n\t\t\t\trows = this.activeRows;\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase \"display\":\n\t\t\t\trows = this.table.rowManager.getDisplayRows();\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase \"visible\":\n\t\t\t\trows = this.getVisibleRows(false, true);\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tdefault:\n\t\t\t\trows = this.chain(\"rows-retrieve\", type, null, this.rows) || this.rows;\n\t\t}\n\t\t\n\t\treturn rows;\n\t}\n\t\n\t///////////////// Table Rendering /////////////////\n\t//trigger rerender of table in current position\n\treRenderInPosition(callback){\n\t\tif(this.redrawBlock){\n\t\t\tif(callback){\n\t\t\t\tcallback();\n\t\t\t}else {\n\t\t\t\tthis.redrawBlockRenderInPosition = true;\n\t\t\t}\n\t\t}else {\n\t\t\tthis.dispatchExternal(\"renderStarted\");\n\t\t\t\n\t\t\tthis.renderer.rerenderRows(callback);\n\t\t\t\n\t\t\tif(!this.fixedHeight){\n\t\t\t\tthis.adjustTableSize();\n\t\t\t}\n\t\t\t\n\t\t\tthis.scrollBarCheck();\n\t\t\t\n\t\t\tthis.dispatchExternal(\"renderComplete\");\n\t\t}\n\t}\n\t\n\tscrollBarCheck(){\n\t\tvar scrollbarWidth = 0;\n\t\t\n\t\t//adjust for vertical scrollbar moving table when present\n\t\tif(this.element.scrollHeight > this.element.clientHeight){\n\t\t\tscrollbarWidth = this.element.offsetWidth - this.element.clientWidth;\n\t\t}\n\t\t\n\t\tif(scrollbarWidth !== this.scrollbarWidth){\n\t\t\tthis.scrollbarWidth = scrollbarWidth;\n\t\t\tthis.dispatch(\"scrollbar-vertical\", scrollbarWidth);\n\t\t}\n\t}\n\t\n\tinitializeRenderer(){\n\t\tvar renderClass;\n\t\t\n\t\tvar renderers = {\n\t\t\t\"virtual\": VirtualDomVertical,\n\t\t\t\"basic\": BasicVertical,\n\t\t};\n\t\t\n\t\tif(typeof this.table.options.renderVertical === \"string\"){\n\t\t\trenderClass = renderers[this.table.options.renderVertical];\n\t\t}else {\n\t\t\trenderClass = this.table.options.renderVertical;\n\t\t}\n\t\t\n\t\tif(renderClass){\n\t\t\tthis.renderMode = this.table.options.renderVertical;\n\t\t\t\n\t\t\tthis.renderer = new renderClass(this.table, this.element, this.tableElement);\n\t\t\tthis.renderer.initialize();\n\t\t\t\n\t\t\tif((this.table.element.clientHeight || this.table.options.height) && !(this.table.options.minHeight && this.table.options.maxHeight)){\n\t\t\t\tthis.fixedHeight = true;\n\t\t\t}else {\n\t\t\t\tthis.fixedHeight = false;\n\t\t\t}\n\t\t}else {\n\t\t\tconsole.error(\"Unable to find matching renderer:\", this.table.options.renderVertical);\n\t\t}\n\t}\n\t\n\tgetRenderMode(){\n\t\treturn this.renderMode;\n\t}\n\t\n\trenderTable(){\n\t\tthis.dispatchExternal(\"renderStarted\");\n\t\t\n\t\tthis.element.scrollTop = 0;\n\t\t\n\t\tthis._clearTable();\n\t\t\n\t\tif(this.displayRowsCount){\n\t\t\tthis.renderer.renderRows();\n\t\t\t\n\t\t\tif(this.firstRender){\n\t\t\t\tthis.firstRender = false;\n\t\t\t\t\n\t\t\t\tif(!this.fixedHeight){\n\t\t\t\t\tthis.adjustTableSize();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.layoutRefresh(true);\n\t\t\t}\n\t\t}else {\n\t\t\tthis.renderEmptyScroll();\n\t\t}\n\t\t\n\t\tif(!this.fixedHeight){\n\t\t\tthis.adjustTableSize();\n\t\t}\n\t\t\n\t\tthis.dispatch(\"table-layout\");\n\t\t\n\t\tif(!this.displayRowsCount){\n\t\t\tthis._showPlaceholder();\n\t\t}\n\t\t\n\t\tthis.scrollBarCheck();\n\t\t\n\t\tthis.dispatchExternal(\"renderComplete\");\n\t}\n\t\n\t//show scrollbars on empty table div\n\trenderEmptyScroll(){\n\t\tif(this.placeholder){\n\t\t\tthis.tableElement.style.display = \"none\";\n\t\t}else {\n\t\t\tthis.tableElement.style.minWidth = this.table.columnManager.getWidth() + \"px\";\n\t\t\t// this.tableElement.style.minHeight = \"1px\";\n\t\t\t// this.tableElement.style.visibility = \"hidden\";\n\t\t}\n\t}\n\t\n\t_clearTable(){\t\n\t\tthis._clearPlaceholder();\n\t\t\n\t\tthis.scrollTop = 0;\n\t\tthis.scrollLeft = 0;\n\t\t\n\t\tthis.renderer.clearRows();\n\t}\n\t\n\ttableEmpty(){\n\t\tthis.renderEmptyScroll();\n\t\tthis._showPlaceholder();\n\t}\n\n\tcheckPlaceholder(){\n\t\tif(this.displayRowsCount){\n\t\t\tthis._clearPlaceholder();\n\t\t}else {\n\t\t\tthis.tableEmpty();\n\t\t}\n\t}\n\t\n\t_showPlaceholder(){\n\t\tif(this.placeholder){\n\t\t\tif(this.placeholder && this.placeholder.parentNode){\n\t\t\t\tthis.placeholder.parentNode.removeChild(this.placeholder);\n\t\t\t}\n\t\t\t\n\t\t\tthis.initializePlaceholder();\n\t\t\t\n\t\t\tthis.placeholder.setAttribute(\"tabulator-render-mode\", this.renderMode);\n\t\t\t\n\t\t\tthis.getElement().appendChild(this.placeholder);\n\t\t\tthis._positionPlaceholder();\n\n\t\t\tthis.adjustTableSize();\n\t\t}\n\t}\n\t\n\t_clearPlaceholder(){\n\t\tif(this.placeholder && this.placeholder.parentNode){\n\t\t\tthis.placeholder.parentNode.removeChild(this.placeholder);\n\t\t}\n\t\t\n\t\t// clear empty table placeholder min\n\t\tthis.tableElement.style.minWidth = \"\";\n\t\tthis.tableElement.style.display = \"\";\n\t}\n\t\n\t_positionPlaceholder(){\n\t\tif(this.placeholder && this.placeholder.parentNode){\n\t\t\tthis.placeholder.style.width = this.table.columnManager.getWidth() + \"px\";\n\t\t\tthis.placeholderContents.style.width = this.table.rowManager.element.clientWidth + \"px\";\n\t\t\tthis.placeholderContents.style.marginLeft = this.scrollLeft + \"px\";\n\t\t}\n\t}\n\t\n\tstyleRow(row, index){\n\t\tvar rowEl = row.getElement();\n\t\t\n\t\tif(index % 2){\n\t\t\trowEl.classList.add(\"tabulator-row-even\");\n\t\t\trowEl.classList.remove(\"tabulator-row-odd\");\n\t\t}else {\n\t\t\trowEl.classList.add(\"tabulator-row-odd\");\n\t\t\trowEl.classList.remove(\"tabulator-row-even\");\n\t\t}\n\t}\n\t\n\t//normalize height of active rows\n\tnormalizeHeight(force){\n\t\tthis.activeRows.forEach(function(row){\n\t\t\trow.normalizeHeight(force);\n\t\t});\n\t}\n\t\n\t//adjust the height of the table holder to fit in the Tabulator element\n\tadjustTableSize(){\n\t\tlet initialHeight = this.element.clientHeight, minHeight;\n\t\tlet resized = false;\n\t\t\n\t\tif(this.renderer.verticalFillMode === \"fill\"){\n\t\t\tlet otherHeight = Math.floor(this.table.columnManager.getElement().getBoundingClientRect().height + (this.table.footerManager && this.table.footerManager.active && !this.table.footerManager.external ? this.table.footerManager.getElement().getBoundingClientRect().height : 0));\n\t\t\t\n\t\t\tif(this.fixedHeight){\n\t\t\t\tminHeight = isNaN(this.table.options.minHeight) ? this.table.options.minHeight : this.table.options.minHeight + \"px\";\n\t\t\t\t\n\t\t\t\tconst height = \"calc(100% - \" + otherHeight + \"px)\";\n\t\t\t\tthis.element.style.minHeight = minHeight || \"calc(100% - \" + otherHeight + \"px)\";\n\t\t\t\tthis.element.style.height = height;\n\t\t\t\tthis.element.style.maxHeight = height;\n\t\t\t} else {\n\t\t\t\tthis.element.style.height = \"\";\n\t\t\t\tthis.element.style.height =\n\t\t\t\tthis.table.element.clientHeight - otherHeight + \"px\";\n\t\t\t\tthis.element.scrollTop = this.scrollTop;\n\t\t\t}\n\t\t\t\n\t\t\tthis.renderer.resize();\n\t\t\t\n\t\t\t//check if the table has changed size when dealing with variable height tables\n\t\t\tif(!this.fixedHeight && initialHeight != this.element.clientHeight){\n\t\t\t\tresized = true;\n\t\t\t\tif(this.subscribed(\"table-resize\")){\n\t\t\t\t\tthis.dispatch(\"table-resize\");\n\t\t\t\t}else {\n\t\t\t\t\tthis.redraw();\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tthis.scrollBarCheck();\n\t\t}\n\t\t\n\t\tthis._positionPlaceholder();\n\t\treturn resized;\n\t}\n\t\n\t//reinitialize all rows\n\treinitialize(){\n\t\tthis.rows.forEach(function(row){\n\t\t\trow.reinitialize(true);\n\t\t});\n\t}\n\t\n\t//prevent table from being redrawn\n\tblockRedraw (){\n\t\tthis.redrawBlock = true;\n\t\tthis.redrawBlockRestoreConfig = false;\n\t}\n\t\n\t//restore table redrawing\n\trestoreRedraw (){\n\t\tthis.redrawBlock = false;\n\t\t\n\t\tif(this.redrawBlockRestoreConfig){\n\t\t\tthis.refreshActiveData(this.redrawBlockRestoreConfig.handler, this.redrawBlockRestoreConfig.skipStage, this.redrawBlockRestoreConfig.renderInPosition);\n\t\t\t\n\t\t\tthis.redrawBlockRestoreConfig = false;\n\t\t}else {\n\t\t\tif(this.redrawBlockRenderInPosition){\n\t\t\t\tthis.reRenderInPosition();\n\t\t\t}\n\t\t}\n\t\t\n\t\tthis.redrawBlockRenderInPosition = false;\n\t}\n\t\n\t//redraw table\n\tredraw (force){\n\t\tthis.adjustTableSize();\n\t\tthis.table.tableWidth = this.table.element.clientWidth;\n\t\t\n\t\tif(!force){\t\n\t\t\tthis.reRenderInPosition();\n\t\t\tthis.scrollHorizontal(this.scrollLeft);\n\t\t}else {\n\t\t\tthis.renderTable();\n\t\t}\n\t}\n\t\n\tresetScroll(){\n\t\tthis.element.scrollLeft = 0;\n\t\tthis.element.scrollTop = 0;\n\t\t\n\t\tif(this.table.browser === \"ie\"){\n\t\t\tvar event = document.createEvent(\"Event\");\n\t\t\tevent.initEvent(\"scroll\", false, true);\n\t\t\tthis.element.dispatchEvent(event);\n\t\t}else {\n\t\t\tthis.element.dispatchEvent(new Event('scroll'));\n\t\t}\n\t}\n}\n\nclass FooterManager extends CoreFeature{\n\n\tconstructor(table){\n\t\tsuper(table);\n\n\t\tthis.active = false;\n\t\tthis.element = this.createElement(); //containing element\n\t\tthis.containerElement = this.createContainerElement(); //containing element\n\t\tthis.external = false;\n\t}\n\n\tinitialize(){\n\t\tthis.initializeElement();\n\t}\n\n\tcreateElement(){\n\t\tvar el = document.createElement(\"div\");\n\n\t\tel.classList.add(\"tabulator-footer\");\n\n\t\treturn el;\n\t}\n\n\t\n\tcreateContainerElement(){\n\t\tvar el = document.createElement(\"div\");\n\n\t\tel.classList.add(\"tabulator-footer-contents\");\n\n\t\tthis.element.appendChild(el);\n\n\t\treturn el;\n\t}\n\n\tinitializeElement(){\n\t\tif(this.table.options.footerElement){\n\n\t\t\tswitch(typeof this.table.options.footerElement){\n\t\t\t\tcase \"string\":\n\t\t\t\t\tif(this.table.options.footerElement[0] === \"<\"){\n\t\t\t\t\t\tthis.containerElement.innerHTML = this.table.options.footerElement;\n\t\t\t\t\t}else {\n\t\t\t\t\t\tthis.external = true;\n\t\t\t\t\t\tthis.containerElement = document.querySelector(this.table.options.footerElement);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthis.element = this.table.options.footerElement;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tgetElement(){\n\t\treturn this.element;\n\t}\n\n\tappend(element){\n\t\tthis.activate();\n\n\t\tthis.containerElement.appendChild(element);\n\t\tthis.table.rowManager.adjustTableSize();\n\t}\n\n\tprepend(element){\n\t\tthis.activate();\n\n\t\tthis.element.insertBefore(element, this.element.firstChild);\n\t\tthis.table.rowManager.adjustTableSize();\n\t}\n\n\tremove(element){\n\t\telement.parentNode.removeChild(element);\n\t\tthis.deactivate();\n\t}\n\n\tdeactivate(force){\n\t\tif(!this.element.firstChild || force){\n\t\t\tif(!this.external){\n\t\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t\t}\n\t\t\tthis.active = false;\n\t\t}\n\t}\n\n\tactivate(){\n\t\tif(!this.active){\n\t\t\tthis.active = true;\n\t\t\tif(!this.external){\n\t\t\t\tthis.table.element.appendChild(this.getElement());\n\t\t\t\tthis.table.element.style.display = '';\n\t\t\t}\n\t\t}\n\t}\n\n\tredraw(){\n\t\tthis.dispatch(\"footer-redraw\");\n\t}\n}\n\nclass InteractionManager extends CoreFeature {\n\t\n\tconstructor (table){\n\t\tsuper(table);\n\t\t\n\t\tthis.el = null;\n\t\t\n\t\tthis.abortClasses = [\"tabulator-headers\", \"tabulator-table\"];\n\t\t\n\t\tthis.previousTargets = {};\n\t\t\n\t\tthis.listeners = [\n\t\t\t\"click\",\n\t\t\t\"dblclick\",\n\t\t\t\"contextmenu\",\n\t\t\t\"mouseenter\",\n\t\t\t\"mouseleave\",\n\t\t\t\"mouseover\",\n\t\t\t\"mouseout\",\n\t\t\t\"mousemove\",\n\t\t\t\"mouseup\",\n\t\t\t\"mousedown\",\n\t\t\t\"touchstart\",\n\t\t\t\"touchend\",\n\t\t];\n\t\t\n\t\tthis.componentMap = {\n\t\t\t\"tabulator-cell\":\"cell\",\n\t\t\t\"tabulator-row\":\"row\",\n\t\t\t\"tabulator-group\":\"group\",\n\t\t\t\"tabulator-col\":\"column\",\n\t\t};\n\t\t\n\t\tthis.pseudoTrackers = {\n\t\t\t\"row\":{\n\t\t\t\tsubscriber:null,\n\t\t\t\ttarget:null,\n\t\t\t},\n\t\t\t\"cell\":{\n\t\t\t\tsubscriber:null,\n\t\t\t\ttarget:null,\n\t\t\t},\n\t\t\t\"group\":{\n\t\t\t\tsubscriber:null,\n\t\t\t\ttarget:null,\n\t\t\t},\n\t\t\t\"column\":{\n\t\t\t\tsubscriber:null,\n\t\t\t\ttarget:null,\n\t\t\t},\n\t\t};\n\t\t\n\t\tthis.pseudoTracking = false;\n\t}\n\t\n\tinitialize(){\n\t\tthis.el = this.table.element;\n\t\t\n\t\tthis.buildListenerMap();\n\t\tthis.bindSubscriptionWatchers();\n\t}\n\t\n\tbuildListenerMap(){\n\t\tvar listenerMap = {};\n\t\t\n\t\tthis.listeners.forEach((listener) => {\n\t\t\tlistenerMap[listener] = {\n\t\t\t\thandler:null,\n\t\t\t\tcomponents:[],\n\t\t\t};\n\t\t});\n\t\t\n\t\tthis.listeners = listenerMap;\n\t}\n\t\n\tbindPseudoEvents(){\n\t\tObject.keys(this.pseudoTrackers).forEach((key) => {\n\t\t\tthis.pseudoTrackers[key].subscriber = this.pseudoMouseEnter.bind(this, key);\n\t\t\tthis.subscribe(key + \"-mouseover\", this.pseudoTrackers[key].subscriber);\n\t\t});\n\t\t\n\t\tthis.pseudoTracking = true;\n\t}\n\t\n\tpseudoMouseEnter(key, e, target){\n\t\tif(this.pseudoTrackers[key].target !== target){\n\t\t\t\n\t\t\tif(this.pseudoTrackers[key].target){\n\t\t\t\tthis.dispatch(key + \"-mouseleave\", e, this.pseudoTrackers[key].target);\n\t\t\t}\n\t\t\t\n\t\t\tthis.pseudoMouseLeave(key, e);\n\t\t\t\n\t\t\tthis.pseudoTrackers[key].target = target;\n\t\t\t\n\t\t\tthis.dispatch(key + \"-mouseenter\", e, target);\n\t\t}\n\t}\n\t\n\tpseudoMouseLeave(key, e){\n\t\tvar leaveList = Object.keys(this.pseudoTrackers),\n\t\tlinkedKeys = {\n\t\t\t\"row\":[\"cell\"],\n\t\t\t\"cell\":[\"row\"],\n\t\t};\n\t\t\n\t\tleaveList = leaveList.filter((item) => {\n\t\t\tvar links = linkedKeys[key];\n\t\t\treturn item !== key && (!links || (links && !links.includes(item)));\n\t\t});\n\t\t\n\t\t\n\t\tleaveList.forEach((key) => {\n\t\t\tvar target = this.pseudoTrackers[key].target;\n\t\t\t\n\t\t\tif(this.pseudoTrackers[key].target){\n\t\t\t\tthis.dispatch(key + \"-mouseleave\", e, target);\n\t\t\t\t\n\t\t\t\tthis.pseudoTrackers[key].target = null;\n\t\t\t}\n\t\t});\n\t}\n\t\n\t\n\tbindSubscriptionWatchers(){\n\t\tvar listeners = Object.keys(this.listeners),\n\t\tcomponents = Object.values(this.componentMap);\n\t\t\n\t\tfor(let comp of components){\n\t\t\tfor(let listener of listeners){\n\t\t\t\tlet key = comp + \"-\" + listener;\n\t\t\t\t\n\t\t\t\tthis.subscriptionChange(key, this.subscriptionChanged.bind(this, comp, listener));\n\t\t\t}\n\t\t}\n\t\t\n\t\tthis.subscribe(\"table-destroy\", this.clearWatchers.bind(this));\n\t}\n\t\n\tsubscriptionChanged(component, key, added){\n\t\tvar listener = this.listeners[key].components,\n\t\tindex = listener.indexOf(component),\n\t\tchanged = false;\n\t\t\n\t\tif(added){\n\t\t\tif(index === -1){\n\t\t\t\tlistener.push(component);\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t}else {\n\t\t\tif(!this.subscribed(component + \"-\" + key)){\n\t\t\t\tif(index > -1){\n\t\t\t\t\tlistener.splice(index, 1);\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif((key === \"mouseenter\" || key === \"mouseleave\") && !this.pseudoTracking){\n\t\t\tthis.bindPseudoEvents();\n\t\t}\n\t\t\n\t\tif(changed){\n\t\t\tthis.updateEventListeners();\n\t\t}\n\t}\n\t\n\tupdateEventListeners(){\n\t\tfor(let key in this.listeners){\n\t\t\tlet listener = this.listeners[key];\n\t\t\t\n\t\t\tif(listener.components.length){\n\t\t\t\tif(!listener.handler){\n\t\t\t\t\tlistener.handler = this.track.bind(this, key);\n\t\t\t\t\tthis.el.addEventListener(key, listener.handler);\n\t\t\t\t\t// this.el.addEventListener(key, listener.handler, {passive: true})\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tif(listener.handler){\n\t\t\t\t\tthis.el.removeEventListener(key, listener.handler);\n\t\t\t\t\tlistener.handler = null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\ttrack(type, e){\n\t\tvar path = (e.composedPath && e.composedPath()) || e.path;\n\t\t\n\t\tvar targets = this.findTargets(path);\n\t\ttargets = this.bindComponents(type, targets);\n\t\t\n\t\tthis.triggerEvents(type, e, targets);\n\t\t\n\t\tif(this.pseudoTracking && (type == \"mouseover\" || type == \"mouseleave\") && !Object.keys(targets).length){\n\t\t\tthis.pseudoMouseLeave(\"none\", e);\n\t\t}\n\t}\n\t\n\tfindTargets(path){\n\t\tvar targets = {};\n\t\t\n\t\tlet componentMap = Object.keys(this.componentMap);\n\t\t\n\t\tfor (let el of path) {\n\t\t\tlet classList = el.classList ? [...el.classList] : [];\n\t\t\t\n\t\t\tlet abort = classList.filter((item) => {\n\t\t\t\treturn this.abortClasses.includes(item);\n\t\t\t});\n\t\t\t\n\t\t\tif(abort.length){\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tlet elTargets = classList.filter((item) => {\n\t\t\t\treturn componentMap.includes(item);\n\t\t\t});\n\t\t\t\n\t\t\tfor (let target of elTargets) {\n\t\t\t\tif(!targets[this.componentMap[target]]){\n\t\t\t\t\ttargets[this.componentMap[target]] = el;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(targets.group && targets.group === targets.row){\n\t\t\tdelete targets.row;\n\t\t}\n\n\t\treturn targets;\n\t}\n\t\n\tbindComponents(type, targets){\n\t\t//ensure row component is looked up before cell\n\t\tvar keys = Object.keys(targets).reverse(),\n\t\tlistener = this.listeners[type],\n\t\tmatches = {},\n\t\toutput = {},\n\t\ttargetMatches = {};\n\t\n\t\tfor(let key of keys){\n\t\t\tlet component,\n\t\t\ttarget = targets[key],\n\t\t\tpreviousTarget = this.previousTargets[key];\n\t\t\t\n\t\t\tif(previousTarget && previousTarget.target === target){\n\t\t\t\tcomponent = previousTarget.component;\n\t\t\t}else {\n\t\t\t\tswitch(key){\n\t\t\t\t\tcase \"row\":\n\t\t\t\t\tcase \"group\":\n\t\t\t\t\t\tif(listener.components.includes(\"row\") || listener.components.includes(\"cell\") || listener.components.includes(\"group\")){\n\t\t\t\t\t\t\tlet rows = this.table.rowManager.getVisibleRows(true);\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tcomponent = rows.find((row) => {\n\t\t\t\t\t\t\t\treturn row.getElement() === target;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(targets[\"row\"] && targets[\"row\"].parentNode && targets[\"row\"].parentNode.closest(\".tabulator-row\")){\n\t\t\t\t\t\t\t\ttargets[key] = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"column\":\n\t\t\t\t\t\tif(listener.components.includes(\"column\")){\n\t\t\t\t\t\t\tcomponent = this.table.columnManager.findColumn(target);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"cell\":\n\t\t\t\t\t\tif(listener.components.includes(\"cell\")){\n\t\t\t\t\t\t\tif(matches[\"row\"] instanceof Row){\n\t\t\t\t\t\t\t\tcomponent = matches[\"row\"].findCell(target);\n\t\t\t\t\t\t\t}else {\t\n\t\t\t\t\t\t\t\tif(targets[\"row\"]){\n\t\t\t\t\t\t\t\t\tconsole.warn(\"Event Target Lookup Error - The row this cell is attached to cannot be found, has the table been reinitialized without being destroyed first?\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif(component){\n\t\t\t\tmatches[key] = component;\n\t\t\t\ttargetMatches[key] = {\n\t\t\t\t\ttarget:target,\n\t\t\t\t\tcomponent:component,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\t\n\t\tthis.previousTargets = targetMatches;\n\n\t\t//reverse order keys are set in so events trigger in correct sequence\n\t\tObject.keys(targets).forEach((key) => {\n\t\t\tlet value = matches[key];\n\t\t\toutput[key] = value;\n\t\t});\n\t\t\n\t\treturn output;\n\t}\n\t\n\ttriggerEvents(type, e, targets){\n\t\tvar listener = this.listeners[type];\n\n\t\tfor(let key in targets){\n\t\t\tif(targets[key] && listener.components.includes(key)){\n\t\t\t\tthis.dispatch(key + \"-\" + type, e, targets[key]);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tclearWatchers(){\n\t\tfor(let key in this.listeners){\n\t\t\tlet listener = this.listeners[key];\n\t\t\t\n\t\t\tif(listener.handler){\n\t\t\t\tthis.el.removeEventListener(key, listener.handler);\n\t\t\t\tlistener.handler = null;\n\t\t\t}\n\t\t}\n\t}\n}\n\nclass ComponentFunctionBinder{\n\n\tconstructor(table){\n\t\tthis.table = table;\n\n\t\tthis.bindings = {};\n\t}\n\n\tbind(type, funcName, handler){\n\t\tif(!this.bindings[type]){\n\t\t\tthis.bindings[type] = {};\n\t\t}\n\n\t\tif(this.bindings[type][funcName]){\n\t\t\tconsole.warn(\"Unable to bind component handler, a matching function name is already bound\", type, funcName, handler);\n\t\t}else {\n\t\t\tthis.bindings[type][funcName] = handler;\n\t\t}\n\t}\n\n\thandle(type, component, name){\n\t\tif(this.bindings[type] && this.bindings[type][name] && typeof this.bindings[type][name].bind === 'function'){\n\t\t\treturn this.bindings[type][name].bind(null, component);\n\t\t}else {\n\t\t\tif(name !== \"then\" && typeof name === \"string\" && !name.startsWith(\"_\")){\n\t\t\t\tif(this.table.options.debugInvalidComponentFuncs){\n\t\t\t\t\tconsole.error(\"The \" + type + \" component does not have a \" + name + \" function, have you checked that you have the correct Tabulator module installed?\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nclass DataLoader extends CoreFeature{\n\tconstructor(table){\n\t\tsuper(table);\n\t\t\n\t\tthis.requestOrder = 0; //prevent requests coming out of sequence if overridden by another load request\n\t\tthis.loading = false;\n\t}\n\t\n\tinitialize(){}\n\t\n\tload(data, params, config, replace, silent, columnsChanged){\n\t\tvar requestNo = ++this.requestOrder;\n\n\t\tif(this.table.destroyed){\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\t\n\t\tthis.dispatchExternal(\"dataLoading\", data);\n\t\t\n\t\t//parse json data to array\n\t\tif (data && (data.indexOf(\"{\") == 0 || data.indexOf(\"[\") == 0)){\n\t\t\tdata = JSON.parse(data);\n\t\t}\n\t\t\n\t\tif(this.confirm(\"data-loading\", [data, params, config, silent])){\n\t\t\tthis.loading = true;\n\t\t\t\n\t\t\tif(!silent){\n\t\t\t\tthis.alertLoader();\n\t\t\t}\n\t\t\t\n\t\t\t//get params for request\n\t\t\tparams = this.chain(\"data-params\", [data, config, silent], params || {}, params || {});\n\t\t\t\n\t\t\tparams = this.mapParams(params, this.table.options.dataSendParams);\n\t\t\t\n\t\t\tvar result = this.chain(\"data-load\", [data, params, config, silent], false, Promise.resolve([]));\n\t\t\t\n\t\t\treturn result.then((response) => {\n\t\t\t\tif(!this.table.destroyed){\n\t\t\t\t\tif(!Array.isArray(response) && typeof response == \"object\"){\n\t\t\t\t\t\tresponse = this.mapParams(response, this.objectInvert(this.table.options.dataReceiveParams));\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tvar rowData = this.chain(\"data-loaded\", [response], null, response);\n\t\t\t\t\t\n\t\t\t\t\tif(requestNo == this.requestOrder){\n\t\t\t\t\t\tthis.clearAlert();\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(rowData !== false){\n\t\t\t\t\t\t\tthis.dispatchExternal(\"dataLoaded\", rowData);\n\t\t\t\t\t\t\tthis.table.rowManager.setData(rowData, replace, typeof columnsChanged === \"undefined\" ? !replace : columnsChanged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}else {\n\t\t\t\t\t\tconsole.warn(\"Data Load Response Blocked - An active data load request was blocked by an attempt to change table data while the request was being made\");\n\t\t\t\t\t}\n\t\t\t\t}else {\n\t\t\t\t\tconsole.warn(\"Data Load Response Blocked - Table has been destroyed\");\n\t\t\t\t}\n\t\t\t}).catch((error) => {\n\t\t\t\tconsole.error(\"Data Load Error: \", error);\n\t\t\t\tthis.dispatchExternal(\"dataLoadError\", error);\n\t\t\t\t\n\t\t\t\tif(!silent){\n\t\t\t\t\tthis.alertError();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.clearAlert();\n\t\t\t\t}, this.table.options.dataLoaderErrorTimeout);\n\t\t\t})\n\t\t\t\t.finally(() => {\n\t\t\t\t\tthis.loading = false;\n\t\t\t\t});\n\t\t}else {\n\t\t\tthis.dispatchExternal(\"dataLoaded\", data);\n\t\t\t\n\t\t\tif(!data){\n\t\t\t\tdata = [];\n\t\t\t}\n\t\t\t\n\t\t\tthis.table.rowManager.setData(data, replace, typeof columnsChanged === \"undefined\" ? !replace : columnsChanged);\n\t\t\treturn Promise.resolve();\n\t\t}\n\t}\n\t\n\tmapParams(params, map){\n\t\tvar output = {};\n\t\t\n\t\tfor(let key in params){\n\t\t\toutput[map.hasOwnProperty(key) ? map[key] : key] = params[key];\n\t\t}\n\t\t\n\t\treturn output;\n\t}\n\t\n\tobjectInvert(obj){\n\t\tvar output = {};\n\t\t\n\t\tfor(let key in obj){\n\t\t\toutput[obj[key]] = key;\n\t\t}\n\t\t\n\t\treturn output;\n\t}\n\t\n\tblockActiveLoad(){\n\t\tthis.requestOrder++;\n\t}\n\t\n\talertLoader(){\n\t\tvar shouldLoad = typeof this.table.options.dataLoader === \"function\" ? this.table.options.dataLoader() : this.table.options.dataLoader;\n\t\t\n\t\tif(shouldLoad){\n\t\t\tthis.table.alertManager.alert(this.table.options.dataLoaderLoading || this.langText(\"data|loading\"));\n\t\t}\n\t}\n\t\n\talertError(){\n\t\tthis.table.alertManager.alert(this.table.options.dataLoaderError || this.langText(\"data|error\"), \"error\");\n\t}\n\t\n\tclearAlert(){\n\t\tthis.table.alertManager.clear();\n\t}\n}\n\nclass ExternalEventBus {\n\n\tconstructor(table, optionsList, debug){\n\t\tthis.table = table;\n\t\tthis.events = {};\n\t\tthis.optionsList = optionsList || {};\n\t\tthis.subscriptionNotifiers = {};\n\n\t\tthis.dispatch = debug ? this._debugDispatch.bind(this) : this._dispatch.bind(this);\n\t\tthis.debug = debug;\n\t}\n\n\tsubscriptionChange(key, callback){\n\t\tif(!this.subscriptionNotifiers[key]){\n\t\t\tthis.subscriptionNotifiers[key] = [];\n\t\t}\n\n\t\tthis.subscriptionNotifiers[key].push(callback);\n\n\t\tif(this.subscribed(key)){\n\t\t\tthis._notifySubscriptionChange(key, true);\n\t\t}\n\t}\n\n\tsubscribe(key, callback){\n\t\tif(!this.events[key]){\n\t\t\tthis.events[key] = [];\n\t\t}\n\n\t\tthis.events[key].push(callback);\n\n\t\tthis._notifySubscriptionChange(key, true);\n\t}\n\n\tunsubscribe(key, callback){\n\t\tvar index;\n\n\t\tif(this.events[key]){\n\t\t\tif(callback){\n\t\t\t\tindex = this.events[key].findIndex((item) => {\n\t\t\t\t\treturn item === callback;\n\t\t\t\t});\n\n\t\t\t\tif(index > -1){\n\t\t\t\t\tthis.events[key].splice(index, 1);\n\t\t\t\t}else {\n\t\t\t\t\tconsole.warn(\"Cannot remove event, no matching event found:\", key, callback);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tdelete this.events[key];\n\t\t\t}\n\t\t}else {\n\t\t\tconsole.warn(\"Cannot remove event, no events set on:\", key);\n\t\t\treturn;\n\t\t}\n\n\t\tthis._notifySubscriptionChange(key, false);\n\t}\n\n\tsubscribed(key){\n\t\treturn this.events[key] && this.events[key].length;\n\t}\n\n\t_notifySubscriptionChange(key, subscribed){\n\t\tvar notifiers = this.subscriptionNotifiers[key];\n\n\t\tif(notifiers){\n\t\t\tnotifiers.forEach((callback)=>{\n\t\t\t\tcallback(subscribed);\n\t\t\t});\n\t\t}\n\t}\n\n\t_dispatch(){\n\t\tvar args = Array.from(arguments),\n\t\tkey = args.shift(),\n\t\tresult;\n\n\t\tif(this.events[key]){\n\t\t\tthis.events[key].forEach((callback, i) => {\n\t\t\t\tlet callResult = callback.apply(this.table, args);\n\n\t\t\t\tif(!i){\n\t\t\t\t\tresult = callResult;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t_debugDispatch(){\n\t\tvar args = Array.from(arguments),\n\t\tkey = args[0];\n\n\t\targs[0] = \"ExternalEvent:\" + args[0];\n\n\t\tif(this.debug === true || this.debug.includes(key)){\n\t\t\tconsole.log(...args);\n\t\t}\n\n\t\treturn this._dispatch(...arguments);\n\t}\n}\n\nclass InternalEventBus {\n\n\tconstructor(debug){\n\t\tthis.events = {};\n\t\tthis.subscriptionNotifiers = {};\n\n\t\tthis.dispatch = debug ? this._debugDispatch.bind(this) : this._dispatch.bind(this);\n\t\tthis.chain = debug ? this._debugChain.bind(this) : this._chain.bind(this);\n\t\tthis.confirm = debug ? this._debugConfirm.bind(this) : this._confirm.bind(this);\n\t\tthis.debug = debug;\n\t}\n\n\tsubscriptionChange(key, callback){\n\t\tif(!this.subscriptionNotifiers[key]){\n\t\t\tthis.subscriptionNotifiers[key] = [];\n\t\t}\n\n\t\tthis.subscriptionNotifiers[key].push(callback);\n\n\t\tif(this.subscribed(key)){\n\t\t\tthis._notifySubscriptionChange(key, true);\n\t\t}\n\t}\n\n\tsubscribe(key, callback, priority = 10000){\n\t\tif(!this.events[key]){\n\t\t\tthis.events[key] = [];\n\t\t}\n\n\t\tthis.events[key].push({callback, priority});\n\n\t\tthis.events[key].sort((a, b) => {\n\t\t\treturn a.priority - b.priority;\n\t\t});\n\n\t\tthis._notifySubscriptionChange(key, true);\n\t}\n\n\tunsubscribe(key, callback){\n\t\tvar index;\n\n\t\tif(this.events[key]){\n\t\t\tif(callback){\n\t\t\t\tindex = this.events[key].findIndex((item) => {\n\t\t\t\t\treturn item.callback === callback;\n\t\t\t\t});\n\n\t\t\t\tif(index > -1){\n\t\t\t\t\tthis.events[key].splice(index, 1);\n\t\t\t\t}else {\n\t\t\t\t\tconsole.warn(\"Cannot remove event, no matching event found:\", key, callback);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}else {\n\t\t\tconsole.warn(\"Cannot remove event, no events set on:\", key);\n\t\t\treturn;\n\t\t}\n\n\t\tthis._notifySubscriptionChange(key, false);\n\t}\n\n\tsubscribed(key){\n\t\treturn this.events[key] && this.events[key].length;\n\t}\n\n\t_chain(key, args, initialValue, fallback){\n\t\tvar value = initialValue;\n\n\t\tif(!Array.isArray(args)){\n\t\t\targs = [args];\n\t\t}\n\n\t\tif(this.subscribed(key)){\n\t\t\tthis.events[key].forEach((subscriber, i) => {\n\t\t\t\tvalue = subscriber.callback.apply(this, args.concat([value]));\n\t\t\t});\n\n\t\t\treturn value;\n\t\t}else {\n\t\t\treturn typeof fallback === \"function\" ? fallback() : fallback;\n\t\t}\n\t}\n\n\t_confirm(key, args){\n\t\tvar confirmed = false;\n\n\t\tif(!Array.isArray(args)){\n\t\t\targs = [args];\n\t\t}\n\n\t\tif(this.subscribed(key)){\n\t\t\tthis.events[key].forEach((subscriber, i) => {\n\t\t\t\tif(subscriber.callback.apply(this, args)){\n\t\t\t\t\tconfirmed = true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn confirmed;\n\t}\n\n\t_notifySubscriptionChange(key, subscribed){\n\t\tvar notifiers = this.subscriptionNotifiers[key];\n\n\t\tif(notifiers){\n\t\t\tnotifiers.forEach((callback)=>{\n\t\t\t\tcallback(subscribed);\n\t\t\t});\n\t\t}\n\t}\n\n\t_dispatch(){\n\t\tvar args = Array.from(arguments),\n\t\tkey = args.shift();\n\n\t\tif(this.events[key]){\n\t\t\tthis.events[key].forEach((subscriber) => {\n\t\t\t\tsubscriber.callback.apply(this, args);\n\t\t\t});\n\t\t}\n\t}\n\n\t_debugDispatch(){\n\t\tvar args = Array.from(arguments),\n\t\tkey = args[0];\n\n\t\targs[0] = \"InternalEvent:\" + key;\n\n\t\tif(this.debug === true || this.debug.includes(key)){\n\t\t\tconsole.log(...args);\n\t\t}\n\n\t\treturn this._dispatch(...arguments);\n\t}\n\n\t_debugChain(){\n\t\tvar args = Array.from(arguments),\n\t\tkey = args[0];\n\n\t\targs[0] = \"InternalEvent:\" + key;\n\n\t\tif(this.debug === true || this.debug.includes(key)){\n\t\t\tconsole.log(...args);\n\t\t}\n\n\t\treturn this._chain(...arguments);\n\t}\n\n\t_debugConfirm(){\n\t\tvar args = Array.from(arguments),\n\t\tkey = args[0];\n\n\t\targs[0] = \"InternalEvent:\" + key;\n\n\t\tif(this.debug === true || this.debug.includes(key)){\n\t\t\tconsole.log(...args);\n\t\t}\n\n\t\treturn this._confirm(...arguments);\n\t}\n}\n\nclass DeprecationAdvisor extends CoreFeature{\n\t\n\tconstructor(table){\n\t\tsuper(table);\n\t}\n\t\n\t_warnUser(){\n\t\tif(this.options(\"debugDeprecation\")){\n\t\t\tconsole.warn(...arguments);\n\t\t}\n\t}\n\t\n\tcheck(oldOption, newOption, convert){\n\t\tvar msg = \"\";\n\t\t\n\t\tif(typeof this.options(oldOption) !== \"undefined\"){\n\t\t\tmsg = \"Deprecated Setup Option - Use of the %c\" + oldOption + \"%c option is now deprecated\";\n\t\t\t\n\t\t\tif(newOption){\n\t\t\t\tmsg = msg + \", Please use the %c\" + newOption + \"%c option instead\";\n\t\t\t\tthis._warnUser(msg, 'font-weight: bold;', 'font-weight: normal;', 'font-weight: bold;', 'font-weight: normal;');\n\n\t\t\t\tif(convert){\n\t\t\t\t\tthis.table.options[newOption] = this.table.options[oldOption];\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tthis._warnUser(msg, 'font-weight: bold;', 'font-weight: normal;');\n\t\t\t}\n\t\t\t\n\t\t\treturn false;\n\t\t}else {\n\t\t\treturn true;\n\t\t}\n\t}\n\t\n\tcheckMsg(oldOption, msg){\n\t\tif(typeof this.options(oldOption) !== \"undefined\"){\n\t\t\tthis._warnUser(\"%cDeprecated Setup Option - Use of the %c\" + oldOption + \" %c option is now deprecated, \" + msg, 'font-weight: normal;', 'font-weight: bold;', 'font-weight: normal;');\n\t\t\t\n\t\t\treturn false;\n\t\t}else {\n\t\t\treturn true;\n\t\t}\n\t}\n\t\n\tmsg(msg){\n\t\tthis._warnUser(msg);\n\t}\n}\n\nclass DependencyRegistry extends CoreFeature{\r\n\t\r\n\tconstructor(table){\r\n\t\tsuper(table);\r\n\t\t\r\n\t\tthis.deps = {};\r\n\t\t\r\n\t\tthis.props = {\r\n\t\t\t\r\n\t\t};\r\n\t}\r\n\t\r\n\tinitialize(){\r\n\t\tthis.deps = Object.assign({}, this.options(\"dependencies\"));\r\n\t}\r\n\t\r\n\tlookup(key, prop, silent){\r\n\t\tif(Array.isArray(key)){\r\n\t\t\tfor (const item of key) {\r\n\t\t\t\tvar match = this.lookup(item, prop, true);\r\n\r\n\t\t\t\tif(match){\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif(match){\r\n\t\t\t\treturn match;\r\n\t\t\t}else {\r\n\t\t\t\tthis.error(key);\r\n\t\t\t}\r\n\t\t}else {\r\n\t\t\tif(prop){\r\n\t\t\t\treturn this.lookupProp(key, prop, silent);\r\n\t\t\t}else {\r\n\t\t\t\treturn this.lookupKey(key, silent);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\tlookupProp(key, prop, silent){\r\n\t\tvar dependency;\r\n\t\t\r\n\t\tif(this.props[key] && this.props[key][prop]){\r\n\t\t\treturn this.props[key][prop];\r\n\t\t}else {\r\n\t\t\tdependency = this.lookupKey(key, silent);\r\n\t\t\t\r\n\t\t\tif(dependency){\r\n\t\t\t\tif(!this.props[key]){\r\n\t\t\t\t\tthis.props[key] = {};\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tthis.props[key][prop] = dependency[prop] || dependency;\r\n\t\t\t\treturn this.props[key][prop];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\tlookupKey(key, silent){\r\n\t\tvar dependency;\r\n\t\t\r\n\t\tif(this.deps[key]){\r\n\t\t\tdependency = this.deps[key];\r\n\t\t}else if(window[key]){\r\n\t\t\tthis.deps[key] = window[key];\r\n\t\t\tdependency = this.deps[key];\r\n\t\t}else {\r\n\t\t\tif(!silent){\r\n\t\t\t\tthis.error(key);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn dependency;\r\n\t}\r\n\r\n\terror(key){\r\n\t\tconsole.error(\"Unable to find dependency\", key, \"Please check documentation and ensure you have imported the required library into your project\");\r\n\t}\r\n}\n\n//resize columns to fit data they contain\nfunction fitData(columns, forced){\n\tif(forced){\n\t\tthis.table.columnManager.renderer.reinitializeColumnWidths(columns);\n\t}\n\t\n\tif(this.table.options.responsiveLayout && this.table.modExists(\"responsiveLayout\", true)){\n\t\tthis.table.modules.responsiveLayout.update();\n\t}\n}\n\n//resize columns to fit data they contain and stretch row to fill table, also used for fitDataTable\nfunction fitDataGeneral(columns, forced){\n\tcolumns.forEach(function(column){\n\t\tcolumn.reinitializeWidth();\n\t});\n\n\tif(this.table.options.responsiveLayout && this.table.modExists(\"responsiveLayout\", true)){\n\t\tthis.table.modules.responsiveLayout.update();\n\t}\n}\n\n//resize columns to fit data the contain and stretch last column to fill table\nfunction fitDataStretch(columns, forced){\n\tvar colsWidth = 0,\n\ttableWidth = this.table.rowManager.element.clientWidth,\n\tgap = 0,\n\tlastCol = false;\n\n\tcolumns.forEach((column, i) => {\n\t\tif(!column.widthFixed){\n\t\t\tcolumn.reinitializeWidth();\n\t\t}\n\n\t\tif(this.table.options.responsiveLayout ? column.modules.responsive.visible : column.visible){\n\t\t\tlastCol = column;\n\t\t}\n\n\t\tif(column.visible){\n\t\t\tcolsWidth += column.getWidth();\n\t\t}\n\t});\n\n\tif(lastCol){\n\t\tgap = tableWidth - colsWidth + lastCol.getWidth();\n\n\t\tif(this.table.options.responsiveLayout && this.table.modExists(\"responsiveLayout\", true)){\n\t\t\tlastCol.setWidth(0);\n\t\t\tthis.table.modules.responsiveLayout.update();\n\t\t}\n\n\t\tif(gap > 0){\n\t\t\tlastCol.setWidth(gap);\n\t\t}else {\n\t\t\tlastCol.reinitializeWidth();\n\t\t}\n\t}else {\n\t\tif(this.table.options.responsiveLayout && this.table.modExists(\"responsiveLayout\", true)){\n\t\t\tthis.table.modules.responsiveLayout.update();\n\t\t}\n\t}\n}\n\n//resize columns to fit\nfunction fitColumns(columns, forced){\n\tvar totalWidth = this.table.rowManager.element.getBoundingClientRect().width; //table element width\n\tvar fixedWidth = 0; //total width of columns with a defined width\n\tvar flexWidth = 0; //total width available to flexible columns\n\tvar flexGrowUnits = 0; //total number of widthGrow blocks across all columns\n\tvar flexColWidth = 0; //desired width of flexible columns\n\tvar flexColumns = []; //array of flexible width columns\n\tvar fixedShrinkColumns = []; //array of fixed width columns that can shrink\n\tvar flexShrinkUnits = 0; //total number of widthShrink blocks across all columns\n\tvar overflowWidth = 0; //horizontal overflow width\n\tvar gapFill = 0; //number of pixels to be added to final column to close and half pixel gaps\n\n\tfunction calcWidth(width){\n\t\tvar colWidth;\n\n\t\tif(typeof(width) == \"string\"){\n\t\t\tif(width.indexOf(\"%\") > -1){\n\t\t\t\tcolWidth = (totalWidth / 100) * parseInt(width);\n\t\t\t}else {\n\t\t\t\tcolWidth = parseInt(width);\n\t\t\t}\n\t\t}else {\n\t\t\tcolWidth = width;\n\t\t}\n\n\t\treturn colWidth;\n\t}\n\n\t//ensure columns resize to take up the correct amount of space\n\tfunction scaleColumns(columns, freeSpace, colWidth, shrinkCols){\n\t\tvar oversizeCols = [],\n\t\toversizeSpace = 0,\n\t\tremainingSpace = 0,\n\t\tnextColWidth = 0,\n\t\tremainingFlexGrowUnits = flexGrowUnits,\n\t\tgap = 0,\n\t\tchangeUnits = 0,\n\t\tundersizeCols = [];\n\n\t\tfunction calcGrow(col){\n\t\t\treturn (colWidth * (col.column.definition.widthGrow || 1));\n\t\t}\n\n\t\tfunction calcShrink(col){\n\t\t\treturn (calcWidth(col.width) - (colWidth * (col.column.definition.widthShrink || 0)));\n\t\t}\n\n\t\tcolumns.forEach(function(col, i){\n\t\t\tvar width = shrinkCols ? calcShrink(col) : calcGrow(col);\n\t\t\tif(col.column.minWidth >= width){\n\t\t\t\toversizeCols.push(col);\n\t\t\t}else {\n\t\t\t\tif(col.column.maxWidth && col.column.maxWidth < width){\n\t\t\t\t\tcol.width = col.column.maxWidth;\n\t\t\t\t\tfreeSpace -= col.column.maxWidth;\n\n\t\t\t\t\tremainingFlexGrowUnits -= shrinkCols ? (col.column.definition.widthShrink || 1) : (col.column.definition.widthGrow || 1);\n\n\t\t\t\t\tif(remainingFlexGrowUnits){\n\t\t\t\t\t\tcolWidth = Math.floor(freeSpace/remainingFlexGrowUnits);\n\t\t\t\t\t}\n\t\t\t\t}else {\n\t\t\t\t\tundersizeCols.push(col);\n\t\t\t\t\tchangeUnits += shrinkCols ? (col.column.definition.widthShrink || 1) : (col.column.definition.widthGrow || 1);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tif(oversizeCols.length){\n\t\t\toversizeCols.forEach(function(col){\n\t\t\t\toversizeSpace += shrinkCols ? col.width - col.column.minWidth : col.column.minWidth;\n\t\t\t\tcol.width = col.column.minWidth;\n\t\t\t});\n\n\t\t\tremainingSpace = freeSpace - oversizeSpace;\n\n\t\t\tnextColWidth = changeUnits ? Math.floor(remainingSpace/changeUnits) : remainingSpace;\n\n\t\t\tgap = scaleColumns(undersizeCols, remainingSpace, nextColWidth, shrinkCols);\n\t\t}else {\n\t\t\tgap = changeUnits ? freeSpace - (Math.floor(freeSpace/changeUnits) * changeUnits) : freeSpace;\n\n\t\t\tundersizeCols.forEach(function(column){\n\t\t\t\tcolumn.width = shrinkCols ? calcShrink(column) : calcGrow(column);\n\t\t\t});\n\t\t}\n\n\t\treturn gap;\n\t}\n\n\tif(this.table.options.responsiveLayout && this.table.modExists(\"responsiveLayout\", true)){\n\t\tthis.table.modules.responsiveLayout.update();\n\t}\n\n\t//adjust for vertical scrollbar if present\n\tif(this.table.rowManager.element.scrollHeight > this.table.rowManager.element.clientHeight){\n\t\ttotalWidth -= this.table.rowManager.element.offsetWidth - this.table.rowManager.element.clientWidth;\n\t}\n\n\tcolumns.forEach(function(column){\n\t\tvar width, minWidth, colWidth;\n\n\t\tif(column.visible){\n\n\t\t\twidth = column.definition.width;\n\t\t\tminWidth = parseInt(column.minWidth);\n\n\t\t\tif(width){\n\n\t\t\t\tcolWidth = calcWidth(width);\n\n\t\t\t\tfixedWidth += colWidth > minWidth ? colWidth : minWidth;\n\n\t\t\t\tif(column.definition.widthShrink){\n\t\t\t\t\tfixedShrinkColumns.push({\n\t\t\t\t\t\tcolumn:column,\n\t\t\t\t\t\twidth:colWidth > minWidth ? colWidth : minWidth\n\t\t\t\t\t});\n\t\t\t\t\tflexShrinkUnits += column.definition.widthShrink;\n\t\t\t\t}\n\n\t\t\t}else {\n\t\t\t\tflexColumns.push({\n\t\t\t\t\tcolumn:column,\n\t\t\t\t\twidth:0,\n\t\t\t\t});\n\t\t\t\tflexGrowUnits += column.definition.widthGrow || 1;\n\t\t\t}\n\t\t}\n\t});\n\n\t//calculate available space\n\tflexWidth = totalWidth - fixedWidth;\n\n\t//calculate correct column size\n\tflexColWidth = Math.floor(flexWidth / flexGrowUnits);\n\n\t//generate column widths\n\tgapFill = scaleColumns(flexColumns, flexWidth, flexColWidth, false);\n\n\t//increase width of last column to account for rounding errors\n\tif(flexColumns.length && gapFill > 0){\n\t\tflexColumns[flexColumns.length-1].width += gapFill;\n\t}\n\n\t//calculate space for columns to be shrunk into\n\tflexColumns.forEach(function(col){\n\t\tflexWidth -= col.width;\n\t});\n\n\toverflowWidth = Math.abs(gapFill) + flexWidth;\n\n\t//shrink oversize columns if there is no available space\n\tif(overflowWidth > 0 && flexShrinkUnits){\n\t\tgapFill = scaleColumns(fixedShrinkColumns, overflowWidth, Math.floor(overflowWidth / flexShrinkUnits), true);\n\t}\n\n\t//decrease width of last column to account for rounding errors\n\tif(gapFill && fixedShrinkColumns.length){\n\t\tfixedShrinkColumns[fixedShrinkColumns.length-1].width -= gapFill;\n\t}\n\n\tflexColumns.forEach(function(col){\n\t\tcol.column.setWidth(col.width);\n\t});\n\n\tfixedShrinkColumns.forEach(function(col){\n\t\tcol.column.setWidth(col.width);\n\t});\n}\n\nvar defaultModes = {\n\tfitData:fitData,\n\tfitDataFill:fitDataGeneral,\n\tfitDataTable:fitDataGeneral,\n\tfitDataStretch:fitDataStretch,\n\tfitColumns:fitColumns ,\n};\n\nclass Layout extends Module{\n\n\tstatic moduleName = \"layout\";\n\n\t//load defaults\n\tstatic modes = defaultModes;\n\n\tconstructor(table){\n\t\tsuper(table, \"layout\");\n\n\t\tthis.mode = null;\n\n\t\tthis.registerTableOption(\"layout\", \"fitData\"); //layout type\n\t\tthis.registerTableOption(\"layoutColumnsOnNewData\", false); //update column widths on setData\n\n\t\tthis.registerColumnOption(\"widthGrow\");\n\t\tthis.registerColumnOption(\"widthShrink\");\n\t}\n\n\t//initialize layout system\n\tinitialize(){\n\t\tvar layout = this.table.options.layout;\n\n\t\tif(Layout.modes[layout]){\n\t\t\tthis.mode = layout;\n\t\t}else {\n\t\t\tconsole.warn(\"Layout Error - invalid mode set, defaulting to 'fitData' : \" + layout);\n\t\t\tthis.mode = 'fitData';\n\t\t}\n\n\t\tthis.table.element.setAttribute(\"tabulator-layout\", this.mode);\n\t\tthis.subscribe(\"column-init\", this.initializeColumn.bind(this));\n\t}\n\n\tinitializeColumn(column){\n\t\tif(column.definition.widthGrow){\n\t\t\tcolumn.definition.widthGrow = Number(column.definition.widthGrow);\n\t\t}\n\t\tif(column.definition.widthShrink){\n\t\t\tcolumn.definition.widthShrink = Number(column.definition.widthShrink);\n\t\t}\n\t}\n\n\tgetMode(){\n\t\treturn this.mode;\n\t}\n\n\t//trigger table layout\n\tlayout(dataChanged){\n\n\t\tvar variableHeight = this.table.columnManager.columnsByIndex.find((column) => column.definition.variableHeight || column.definition.formatter === \"textarea\");\n\t\t\n\t\tthis.dispatch(\"layout-refreshing\");\n\t\tLayout.modes[this.mode].call(this, this.table.columnManager.columnsByIndex, dataChanged);\n\n\t\tif(variableHeight){\n\t\t\tthis.table.rowManager.normalizeHeight(true);\n\t\t}\n\n\t\tthis.dispatch(\"layout-refreshed\");\n\t}\n}\n\nvar defaultLangs = {\n\t\"default\":{ //hold default locale text\n\t\t\"groups\":{\n\t\t\t\"item\":\"item\",\n\t\t\t\"items\":\"items\",\n\t\t},\n\t\t\"columns\":{\n\t\t},\n\t\t\"data\":{\n\t\t\t\"loading\":\"Loading\",\n\t\t\t\"error\":\"Error\",\n\t\t},\n\t\t\"pagination\":{\n\t\t\t\"page_size\":\"Page Size\",\n\t\t\t\"page_title\":\"Show Page\",\n\t\t\t\"first\":\"First\",\n\t\t\t\"first_title\":\"First Page\",\n\t\t\t\"last\":\"Last\",\n\t\t\t\"last_title\":\"Last Page\",\n\t\t\t\"prev\":\"Prev\",\n\t\t\t\"prev_title\":\"Prev Page\",\n\t\t\t\"next\":\"Next\",\n\t\t\t\"next_title\":\"Next Page\",\n\t\t\t\"all\":\"All\",\n\t\t\t\"counter\":{\n\t\t\t\t\"showing\": \"Showing\",\n\t\t\t\t\"of\": \"of\",\n\t\t\t\t\"rows\": \"rows\",\n\t\t\t\t\"pages\": \"pages\",\n\t\t\t}\n\t\t},\n\t\t\"headerFilters\":{\n\t\t\t\"default\":\"filter column...\",\n\t\t\t\"columns\":{}\n\t\t}\n\t},\n};\n\nclass Localize extends Module{\n\n\tstatic moduleName = \"localize\";\n\n\t//load defaults\n\tstatic langs = defaultLangs;\n\n\tconstructor(table){\n\t\tsuper(table);\n\n\t\tthis.locale = \"default\"; //current locale\n\t\tthis.lang = false; //current language\n\t\tthis.bindings = {}; //update events to call when locale is changed\n\t\tthis.langList = {};\n\n\t\tthis.registerTableOption(\"locale\", false); //current system language\n\t\tthis.registerTableOption(\"langs\", {});\n\t}\n\n\tinitialize(){\n\t\tthis.langList = Helpers.deepClone(Localize.langs);\n\n\t\tif(this.table.options.columnDefaults.headerFilterPlaceholder !== false){\n\t\t\tthis.setHeaderFilterPlaceholder(this.table.options.columnDefaults.headerFilterPlaceholder);\n\t\t}\n\n\t\tfor(let locale in this.table.options.langs){\n\t\t\tthis.installLang(locale, this.table.options.langs[locale]);\n\t\t}\n\n\t\tthis.setLocale(this.table.options.locale);\n\n\t\tthis.registerTableFunction(\"setLocale\", this.setLocale.bind(this));\n\t\tthis.registerTableFunction(\"getLocale\", this.getLocale.bind(this));\n\t\tthis.registerTableFunction(\"getLang\", this.getLang.bind(this));\n\t}\n\n\t//set header placeholder\n\tsetHeaderFilterPlaceholder(placeholder){\n\t\tthis.langList.default.headerFilters.default = placeholder;\n\t}\n\n\t//setup a lang description object\n\tinstallLang(locale, lang){\n\t\tif(this.langList[locale]){\n\t\t\tthis._setLangProp(this.langList[locale], lang);\n\t\t}else {\n\t\t\tthis.langList[locale] = lang;\n\t\t}\n\t}\n\n\t_setLangProp(lang, values){\n\t\tfor(let key in values){\n\t\t\tif(lang[key] && typeof lang[key] == \"object\"){\n\t\t\t\tthis._setLangProp(lang[key], values[key]);\n\t\t\t}else {\n\t\t\t\tlang[key] = values[key];\n\t\t\t}\n\t\t}\n\t}\n\n\t//set current locale\n\tsetLocale(desiredLocale){\n\t\tdesiredLocale = desiredLocale || \"default\";\n\n\t\t//fill in any matching language values\n\t\tfunction traverseLang(trans, path){\n\t\t\tfor(var prop in trans){\n\t\t\t\tif(typeof trans[prop] == \"object\"){\n\t\t\t\t\tif(!path[prop]){\n\t\t\t\t\t\tpath[prop] = {};\n\t\t\t\t\t}\n\t\t\t\t\ttraverseLang(trans[prop], path[prop]);\n\t\t\t\t}else {\n\t\t\t\t\tpath[prop] = trans[prop];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//determining correct locale to load\n\t\tif(desiredLocale === true && navigator.language){\n\t\t\t//get local from system\n\t\t\tdesiredLocale = navigator.language.toLowerCase();\n\t\t}\n\n\t\tif(desiredLocale){\n\t\t\t//if locale is not set, check for matching top level locale else use default\n\t\t\tif(!this.langList[desiredLocale]){\n\t\t\t\tlet prefix = desiredLocale.split(\"-\")[0];\n\n\t\t\t\tif(this.langList[prefix]){\n\t\t\t\t\tconsole.warn(\"Localization Error - Exact matching locale not found, using closest match: \", desiredLocale, prefix);\n\t\t\t\t\tdesiredLocale = prefix;\n\t\t\t\t}else {\n\t\t\t\t\tconsole.warn(\"Localization Error - Matching locale not found, using default: \", desiredLocale);\n\t\t\t\t\tdesiredLocale = \"default\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.locale = desiredLocale;\n\n\t\t//load default lang template\n\t\tthis.lang = Helpers.deepClone(this.langList.default || {});\n\n\t\tif(desiredLocale != \"default\"){\n\t\t\ttraverseLang(this.langList[desiredLocale], this.lang);\n\t\t}\n\n\t\tthis.dispatchExternal(\"localized\", this.locale, this.lang);\n\n\t\tthis._executeBindings();\n\t}\n\n\t//get current locale\n\tgetLocale(locale){\n\t\treturn this.locale;\n\t}\n\n\t//get lang object for given local or current if none provided\n\tgetLang(locale){\n\t\treturn locale ? this.langList[locale] : this.lang;\n\t}\n\n\t//get text for current locale\n\tgetText(path, value){\n\t\tvar fillPath = value ? path + \"|\" + value : path,\n\t\tpathArray = fillPath.split(\"|\"),\n\t\ttext = this._getLangElement(pathArray, this.locale);\n\n\t\t// if(text === false){\n\t\t// \tconsole.warn(\"Localization Error - Matching localized text not found for given path: \", path);\n\t\t// }\n\n\t\treturn text || \"\";\n\t}\n\n\t//traverse langs object and find localized copy\n\t_getLangElement(path, locale){\n\t\tvar root = this.lang;\n\n\t\tpath.forEach(function(level){\n\t\t\tvar rootPath;\n\n\t\t\tif(root){\n\t\t\t\trootPath = root[level];\n\n\t\t\t\tif(typeof rootPath != \"undefined\"){\n\t\t\t\t\troot = rootPath;\n\t\t\t\t}else {\n\t\t\t\t\troot = false;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn root;\n\t}\n\n\t//set update binding\n\tbind(path, callback){\n\t\tif(!this.bindings[path]){\n\t\t\tthis.bindings[path] = [];\n\t\t}\n\n\t\tthis.bindings[path].push(callback);\n\n\t\tcallback(this.getText(path), this.lang);\n\t}\n\n\t//iterate through bindings and trigger updates\n\t_executeBindings(){\n\t\tfor(let path in this.bindings){\n\t\t\tthis.bindings[path].forEach((binding) => {\n\t\t\t\tbinding(this.getText(path), this.lang);\n\t\t\t});\n\t\t}\n\t}\n}\n\nclass Comms extends Module{\n\n\tstatic moduleName = \"comms\";\n\n\tconstructor(table){\n\t\tsuper(table);\n\t}\n\n\tinitialize(){\n\t\tthis.registerTableFunction(\"tableComms\", this.receive.bind(this));\n\t}\n\n\tgetConnections(selectors){\n\t\tvar connections = [],\n\t\tconnection;\n\n\t\tconnection = this.table.constructor.registry.lookupTable(selectors);\n\n\t\tconnection.forEach((con) =>{\n\t\t\tif(this.table !== con){\n\t\t\t\tconnections.push(con);\n\t\t\t}\n\t\t});\n\n\t\treturn connections;\n\t}\n\n\tsend(selectors, module, action, data){\n\t\tvar connections = this.getConnections(selectors);\n\n\t\tconnections.forEach((connection) => {\n\t\t\tconnection.tableComms(this.table.element, module, action, data);\n\t\t});\n\n\t\tif(!connections.length && selectors){\n\t\t\tconsole.warn(\"Table Connection Error - No tables matching selector found\", selectors);\n\t\t}\n\t}\n\n\treceive(table, module, action, data){\n\t\tif(this.table.modExists(module)){\n\t\t\treturn this.table.modules[module].commsReceived(table, action, data);\n\t\t}else {\n\t\t\tconsole.warn(\"Inter-table Comms Error - no such module:\", module);\n\t\t}\n\t}\n}\n\nvar coreModules = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tCommsModule: Comms,\n\tLayoutModule: Layout,\n\tLocalizeModule: Localize\n});\n\nclass TableRegistry {\n\tstatic registry = {\n\t\ttables:[],\n\t\t\n\t\tregister(table){\n\t\t\tTableRegistry.registry.tables.push(table);\n\t\t},\n\t\t\n\t\tderegister(table){\n\t\t\tvar index = TableRegistry.registry.tables.indexOf(table);\n\t\t\t\n\t\t\tif(index > -1){\n\t\t\t\tTableRegistry.registry.tables.splice(index, 1);\n\t\t\t}\n\t\t},\n\t\t\n\t\tlookupTable(query, silent){\n\t\t\tvar results = [],\n\t\t\tmatches, match;\n\t\t\t\n\t\t\tif(typeof query === \"string\"){\n\t\t\t\tmatches = document.querySelectorAll(query);\n\t\t\t\t\n\t\t\t\tif(matches.length){\n\t\t\t\t\tfor(var i = 0; i < matches.length; i++){\n\t\t\t\t\t\tmatch = TableRegistry.registry.matchElement(matches[i]);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(match){\n\t\t\t\t\t\t\tresults.push(match);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}else if((typeof HTMLElement !== \"undefined\" && query instanceof HTMLElement) || query instanceof TableRegistry){\n\t\t\t\tmatch = TableRegistry.registry.matchElement(query);\n\t\t\t\t\n\t\t\t\tif(match){\n\t\t\t\t\tresults.push(match);\n\t\t\t\t}\n\t\t\t}else if(Array.isArray(query)){\n\t\t\t\tquery.forEach(function(item){\n\t\t\t\t\tresults = results.concat(TableRegistry.registry.lookupTable(item));\n\t\t\t\t});\n\t\t\t}else {\n\t\t\t\tif(!silent){\n\t\t\t\t\tconsole.warn(\"Table Connection Error - Invalid Selector\", query);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn results;\n\t\t},\n\t\t\n\t\tmatchElement(element){\n\t\t\treturn TableRegistry.registry.tables.find(function(table){\n\t\t\t\treturn element instanceof TableRegistry ? table === element : table.element === element;\n\t\t\t});\n\t\t}\n\t};\n\n\t\t\n\tstatic findTable(query){\n\t\tvar results = TableRegistry.registry.lookupTable(query, true);\n\t\treturn Array.isArray(results) && !results.length ? false : results;\n\t}\n}\n\nclass ModuleBinder extends TableRegistry {\n\t\n\tstatic moduleBindings = {};\n\tstatic moduleExtensions = {};\n\tstatic modulesRegistered = false;\n\t\n\tstatic defaultModules = false;\n\t\n\tconstructor(){\n\t\tsuper();\n\t}\n\t\n\tstatic initializeModuleBinder(defaultModules){\n\t\tif(!ModuleBinder.modulesRegistered){\n\t\t\tModuleBinder.modulesRegistered = true;\n\t\t\tModuleBinder._registerModules(coreModules, true);\n\t\t\t\n\t\t\tif(defaultModules){\n\t\t\t\tModuleBinder._registerModules(defaultModules);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tstatic _extendModule(name, property, values){\n\t\tif(ModuleBinder.moduleBindings[name]){\n\t\t\tvar source = ModuleBinder.moduleBindings[name][property];\n\t\t\t\n\t\t\tif(source){\n\t\t\t\tif(typeof values == \"object\"){\n\t\t\t\t\tfor(let key in values){\n\t\t\t\t\t\tsource[key] = values[key];\n\t\t\t\t\t}\n\t\t\t\t}else {\n\t\t\t\t\tconsole.warn(\"Module Error - Invalid value type, it must be an object\");\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\tconsole.warn(\"Module Error - property does not exist:\", property);\n\t\t\t}\n\t\t}else {\n\t\t\tconsole.warn(\"Module Error - module does not exist:\", name);\n\t\t}\n\t}\n\t\n\tstatic _registerModules(modules, core){\n\t\tvar mods = Object.values(modules);\n\t\t\n\t\tif(core){\n\t\t\tmods.forEach((mod) => {\n\t\t\t\tmod.prototype.moduleCore = true;\n\t\t\t});\n\t\t}\n\t\t\n\t\tModuleBinder._registerModule(mods);\n\t}\n\t\n\tstatic _registerModule(modules){\n\t\tif(!Array.isArray(modules)){\n\t\t\tmodules = [modules];\n\t\t}\n\t\t\n\t\tmodules.forEach((mod) => {\n\t\t\tModuleBinder._registerModuleBinding(mod);\n\t\t\tModuleBinder._registerModuleExtensions(mod);\n\t\t});\n\t}\n\t\n\tstatic _registerModuleBinding(mod){\n\t\tif(mod.moduleName){\n\t\t\tModuleBinder.moduleBindings[mod.moduleName] = mod;\n\t\t}else {\n\t\t\tconsole.error(\"Unable to bind module, no moduleName defined\", mod.moduleName);\n\t\t}\n\t}\n\t\n\tstatic _registerModuleExtensions(mod){\n\t\tvar extensions = mod.moduleExtensions;\n\t\t\n\t\tif(mod.moduleExtensions){\n\t\t\tfor (let modKey in extensions) {\n\t\t\t\tlet ext = extensions[modKey];\n\t\t\t\t\n\t\t\t\tif(ModuleBinder.moduleBindings[modKey]){\n\t\t\t\t\tfor (let propKey in ext) {\n\t\t\t\t\t\tModuleBinder._extendModule(modKey, propKey, ext[propKey]);\n\t\t\t\t\t}\n\t\t\t\t}else {\n\t\t\t\t\tif(!ModuleBinder.moduleExtensions[modKey]){\n\t\t\t\t\t\tModuleBinder.moduleExtensions[modKey] = {};\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tfor (let propKey in ext) {\n\t\t\t\t\t\tif(!ModuleBinder.moduleExtensions[modKey][propKey]){\n\t\t\t\t\t\t\tModuleBinder.moduleExtensions[modKey][propKey] = {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tObject.assign(ModuleBinder.moduleExtensions[modKey][propKey], ext[propKey]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tModuleBinder._extendModuleFromQueue(mod);\n\t}\n\t\n\tstatic _extendModuleFromQueue(mod){\n\t\tvar extensions = ModuleBinder.moduleExtensions[mod.moduleName];\n\t\t\n\t\tif(extensions){\n\t\t\tfor (let propKey in extensions) {\n\t\t\t\tModuleBinder._extendModule(mod.moduleName, propKey, extensions[propKey]);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t//ensure that module are bound to instantiated function\n\t_bindModules(){\n\t\tvar orderedStartMods = [],\n\t\torderedEndMods = [],\n\t\tunOrderedMods = [];\n\t\t\n\t\tthis.modules = {};\n\t\t\n\t\tfor(var name in ModuleBinder.moduleBindings){\n\t\t\tlet mod = ModuleBinder.moduleBindings[name];\n\t\t\tlet module = new mod(this);\n\t\t\t\n\t\t\tthis.modules[name] = module;\n\t\t\t\n\t\t\tif(mod.prototype.moduleCore){\n\t\t\t\tthis.modulesCore.push(module);\n\t\t\t}else {\n\t\t\t\tif(mod.moduleInitOrder){\n\t\t\t\t\tif(mod.moduleInitOrder < 0){\n\t\t\t\t\t\torderedStartMods.push(module);\n\t\t\t\t\t}else {\n\t\t\t\t\t\torderedEndMods.push(module);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}else {\n\t\t\t\t\tunOrderedMods.push(module);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\torderedStartMods.sort((a, b) => a.moduleInitOrder > b.moduleInitOrder ? 1 : -1);\n\t\torderedEndMods.sort((a, b) => a.moduleInitOrder > b.moduleInitOrder ? 1 : -1);\n\t\t\n\t\tthis.modulesRegular = orderedStartMods.concat(unOrderedMods.concat(orderedEndMods));\n\t}\n}\n\nclass Alert extends CoreFeature{\n\tconstructor(table){\n\t\tsuper(table);\n \n\t\tthis.element = this._createAlertElement();\n\t\tthis.msgElement = this._createMsgElement();\n\t\tthis.type = null;\n \n\t\tthis.element.appendChild(this.msgElement);\n\t}\n \n\t_createAlertElement(){\n\t\tvar el = document.createElement(\"div\");\n\t\tel.classList.add(\"tabulator-alert\");\n\t\treturn el;\n\t}\n \n\t_createMsgElement(){\n\t\tvar el = document.createElement(\"div\");\n\t\tel.classList.add(\"tabulator-alert-msg\");\n\t\tel.setAttribute(\"role\", \"alert\");\n\t\treturn el;\n\t}\n \n\t_typeClass(){\n\t\treturn \"tabulator-alert-state-\" + this.type;\n\t}\n \n\talert(content, type = \"msg\"){\n\t\tif(content){\n\t\t\tthis.clear();\n\n\t\t\tthis.dispatch(\"alert-show\", type);\n \n\t\t\tthis.type = type;\n \n\t\t\twhile(this.msgElement.firstChild) this.msgElement.removeChild(this.msgElement.firstChild);\n \n\t\t\tthis.msgElement.classList.add(this._typeClass());\n \n\t\t\tif(typeof content === \"function\"){\n\t\t\t\tcontent = content();\n\t\t\t}\n \n\t\t\tif(content instanceof HTMLElement){\n\t\t\t\tthis.msgElement.appendChild(content);\n\t\t\t}else {\n\t\t\t\tthis.msgElement.innerHTML = content;\n\t\t\t}\n \n\t\t\tthis.table.element.appendChild(this.element);\n\t\t}\n\t}\n \n\tclear(){\n\t\tthis.dispatch(\"alert-hide\", this.type);\n\n\t\tif(this.element.parentNode){\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n \n\t\tthis.msgElement.classList.remove(this._typeClass());\n\t}\n}\n\nclass Tabulator extends ModuleBinder{\n\n\t//default setup options\n\tstatic defaultOptions = defaultOptions;\n\n\tstatic extendModule(){\n\t\tTabulator.initializeModuleBinder();\n\t\tTabulator._extendModule(...arguments);\n\t}\n\n\tstatic registerModule(){\n\t\tTabulator.initializeModuleBinder();\n\t\tTabulator._registerModule(...arguments);\n\t}\n\n\tconstructor(element, options, modules){\n\t\tsuper();\n\n\t\tTabulator.initializeModuleBinder(modules);\n\n\t\tthis.options = {};\n\t\t\n\t\tthis.columnManager = null; // hold Column Manager\n\t\tthis.rowManager = null; //hold Row Manager\n\t\tthis.footerManager = null; //holder Footer Manager\n\t\tthis.alertManager = null; //hold Alert Manager\n\t\tthis.vdomHoz = null; //holder horizontal virtual dom\n\t\tthis.externalEvents = null; //handle external event messaging\n\t\tthis.eventBus = null; //handle internal event messaging\n\t\tthis.interactionMonitor = false; //track user interaction\n\t\tthis.browser = \"\"; //hold current browser type\n\t\tthis.browserSlow = false; //handle reduced functionality for slower browsers\n\t\tthis.browserMobile = false; //check if running on mobile, prevent resize cancelling edit on keyboard appearance\n\t\tthis.rtl = false; //check if the table is in RTL mode\n\t\tthis.originalElement = null; //hold original table element if it has been replaced\n\t\t\n\t\tthis.componentFunctionBinder = new ComponentFunctionBinder(this); //bind component functions\n\t\tthis.dataLoader = false; //bind component functions\n\t\t\n\t\tthis.modules = {}; //hold all modules bound to this table\n\t\tthis.modulesCore = []; //hold core modules bound to this table (for initialization purposes)\n\t\tthis.modulesRegular = []; //hold regular modules bound to this table (for initialization purposes)\n\t\t\n\t\tthis.deprecationAdvisor = new DeprecationAdvisor(this);\n\t\tthis.optionsList = new OptionsList(this, \"table constructor\");\n\n\t\tthis.dependencyRegistry = new DependencyRegistry(this);\n\t\t\n\t\tthis.initialized = false;\n\t\tthis.destroyed = false;\n\t\t\n\t\tif(this.initializeElement(element)){\n\t\t\t\n\t\t\tthis.initializeCoreSystems(options);\n\t\t\t\n\t\t\t//delay table creation to allow event bindings immediately after the constructor\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis._create();\n\t\t\t});\n\t\t}\n\t\t\n\t\tthis.constructor.registry.register(this); //register table for inter-device communication\n\t}\n\t\n\tinitializeElement(element){\n\t\tif(typeof HTMLElement !== \"undefined\" && element instanceof HTMLElement){\n\t\t\tthis.element = element;\n\t\t\treturn true;\n\t\t}else if(typeof element === \"string\"){\n\t\t\tthis.element = document.querySelector(element);\n\t\t\t\n\t\t\tif(this.element){\n\t\t\t\treturn true;\n\t\t\t}else {\n\t\t\t\tconsole.error(\"Tabulator Creation Error - no element found matching selector: \", element);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}else {\n\t\t\tconsole.error(\"Tabulator Creation Error - Invalid element provided:\", element);\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\tinitializeCoreSystems(options){\n\t\tthis.columnManager = new ColumnManager(this);\n\t\tthis.rowManager = new RowManager(this);\n\t\tthis.footerManager = new FooterManager(this);\n\t\tthis.dataLoader = new DataLoader(this);\n\t\tthis.alertManager = new Alert(this);\n\t\t\n\t\tthis._bindModules();\n\t\t\n\t\tthis.options = this.optionsList.generate(Tabulator.defaultOptions, options);\n\t\t\n\t\tthis._clearObjectPointers();\n\t\t\n\t\tthis._mapDeprecatedFunctionality();\n\t\t\n\t\tthis.externalEvents = new ExternalEventBus(this, this.options, this.options.debugEventsExternal);\n\t\tthis.eventBus = new InternalEventBus(this.options.debugEventsInternal);\n\t\t\n\t\tthis.interactionMonitor = new InteractionManager(this);\n\t\t\n\t\tthis.dataLoader.initialize();\n\t\tthis.footerManager.initialize();\n\n\t\tthis.dependencyRegistry.initialize();\n\t}\n\t\n\t//convert deprecated functionality to new functions\n\t_mapDeprecatedFunctionality(){\n\t\t//all previously deprecated functionality removed in the 6.0 release\n\t}\n\t\n\t_clearSelection(){\n\t\t\n\t\tthis.element.classList.add(\"tabulator-block-select\");\n\t\t\n\t\tif (window.getSelection) {\n\t\t\tif (window.getSelection().empty) { // Chrome\n\t\t\t\twindow.getSelection().empty();\n\t\t\t} else if (window.getSelection().removeAllRanges) { // Firefox\n\t\t\t\twindow.getSelection().removeAllRanges();\n\t\t\t}\n\t\t} else if (document.selection) { // IE?\n\t\t\tdocument.selection.empty();\n\t\t}\n\t\t\n\t\tthis.element.classList.remove(\"tabulator-block-select\");\n\t}\n\t\n\t//create table\n\t_create(){\n\t\tthis.externalEvents.dispatch(\"tableBuilding\");\n\t\tthis.eventBus.dispatch(\"table-building\");\n\t\t\n\t\tthis._rtlCheck();\n\t\t\n\t\tthis._buildElement();\n\t\t\n\t\tthis._initializeTable();\n\n\t\tthis.initialized = true;\n\t\t\n\t\tthis._loadInitialData()\n\t\t\t.finally(() => {\n\t\t\t\tthis.eventBus.dispatch(\"table-initialized\");\n\t\t\t\tthis.externalEvents.dispatch(\"tableBuilt\");\n\t\t\t});\t\n\t}\n\t\n\t_rtlCheck(){\n\t\tvar style = window.getComputedStyle(this.element);\n\t\t\n\t\tswitch(this.options.textDirection){\n\t\t\tcase\"auto\":\n\t\t\t\tif(style.direction !== \"rtl\"){\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\n\t\t\tcase \"rtl\":\n\t\t\t\tthis.element.classList.add(\"tabulator-rtl\");\n\t\t\t\tthis.rtl = true;\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase \"ltr\":\n\t\t\t\tthis.element.classList.add(\"tabulator-ltr\");\n\t\t\t\n\t\t\tdefault:\n\t\t\t\tthis.rtl = false;\n\t\t}\n\t}\n\t\n\t//clear pointers to objects in default config object\n\t_clearObjectPointers(){\n\t\tthis.options.columns = this.options.columns.slice(0);\n\t\t\n\t\tif(Array.isArray(this.options.data) && !this.options.reactiveData){\n\t\t\tthis.options.data = this.options.data.slice(0);\n\t\t}\n\t}\n\t\n\t//build tabulator element\n\t_buildElement(){\n\t\tvar element = this.element,\n\t\toptions = this.options,\n\t\tnewElement;\n\t\t\n\t\tif(element.tagName === \"TABLE\"){\n\t\t\tthis.originalElement = this.element;\n\t\t\tnewElement = document.createElement(\"div\");\n\t\t\t\n\t\t\t//transfer attributes to new element\n\t\t\tvar attributes = element.attributes;\n\t\t\t\n\t\t\t// loop through attributes and apply them on div\n\t\t\tfor(var i in attributes){\n\t\t\t\tif(typeof attributes[i] == \"object\"){\n\t\t\t\t\tnewElement.setAttribute(attributes[i].name, attributes[i].value);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// replace table with div element\n\t\t\telement.parentNode.replaceChild(newElement, element);\n\t\t\t\n\t\t\tthis.element = element = newElement;\n\t\t}\n\t\t\n\t\telement.classList.add(\"tabulator\");\n\t\telement.setAttribute(\"role\", \"grid\");\n\t\t\n\t\t//empty element\n\t\twhile(element.firstChild) element.removeChild(element.firstChild);\n\t\t\n\t\t//set table height\n\t\tif(options.height){\n\t\t\toptions.height = isNaN(options.height) ? options.height : options.height + \"px\";\n\t\t\telement.style.height = options.height;\n\t\t}\n\t\t\n\t\t//set table min height\n\t\tif(options.minHeight !== false){\n\t\t\toptions.minHeight = isNaN(options.minHeight) ? options.minHeight : options.minHeight + \"px\";\n\t\t\telement.style.minHeight = options.minHeight;\n\t\t}\n\t\t\n\t\t//set table maxHeight\n\t\tif(options.maxHeight !== false){\n\t\t\toptions.maxHeight = isNaN(options.maxHeight) ? options.maxHeight : options.maxHeight + \"px\";\n\t\t\telement.style.maxHeight = options.maxHeight;\n\t\t}\n\t}\n\t\n\t//initialize core systems and modules\n\t_initializeTable(){\n\t\tvar element = this.element,\n\t\toptions = this.options;\n\t\t\n\t\tthis.interactionMonitor.initialize();\n\t\t\n\t\tthis.columnManager.initialize();\n\t\tthis.rowManager.initialize();\n\t\t\n\t\tthis._detectBrowser();\n\t\t\n\t\t//initialize core modules\n\t\tthis.modulesCore.forEach((mod) => {\n\t\t\tmod.initialize();\n\t\t});\n\t\t\n\t\t//build table elements\n\t\telement.appendChild(this.columnManager.getElement());\n\t\telement.appendChild(this.rowManager.getElement());\n\t\t\n\t\tif(options.footerElement){\n\t\t\tthis.footerManager.activate();\n\t\t}\n\t\t\n\t\tif(options.autoColumns && options.data){\n\t\t\t\n\t\t\tthis.columnManager.generateColumnsFromRowData(this.options.data);\n\t\t}\n\t\t\n\t\t//initialize regular modules\n\t\tthis.modulesRegular.forEach((mod) => {\n\t\t\tmod.initialize();\n\t\t});\n\t\t\n\t\tthis.columnManager.setColumns(options.columns);\n\t\t\n\t\tthis.eventBus.dispatch(\"table-built\");\n\t}\n\t\n\t_loadInitialData(){\n\t\treturn this.dataLoader.load(this.options.data)\n\t\t\t.finally(() => {\n\t\t\t\tthis.columnManager.verticalAlignHeaders();\n\t\t\t});\t\t\n\t}\n\t\n\t//deconstructor\n\tdestroy(){\n\t\tvar element = this.element;\n\t\t\n\t\tthis.destroyed = true;\n\t\t\n\t\tthis.constructor.registry.deregister(this); //deregister table from inter-device communication\n\t\t\n\t\tthis.eventBus.dispatch(\"table-destroy\");\n\t\t\n\t\t//clear row data\n\t\tthis.rowManager.destroy();\n\t\t\n\t\t//clear DOM\n\t\twhile(element.firstChild) element.removeChild(element.firstChild);\n\t\telement.classList.remove(\"tabulator\");\n\n\t\tthis.externalEvents.dispatch(\"tableDestroyed\");\n\t}\n\t\n\t_detectBrowser(){\n\t\tvar ua = navigator.userAgent||navigator.vendor||window.opera;\n\t\t\n\t\tif(ua.indexOf(\"Trident\") > -1){\n\t\t\tthis.browser = \"ie\";\n\t\t\tthis.browserSlow = true;\n\t\t}else if(ua.indexOf(\"Edge\") > -1){\n\t\t\tthis.browser = \"edge\";\n\t\t\tthis.browserSlow = true;\n\t\t}else if(ua.indexOf(\"Firefox\") > -1){\n\t\t\tthis.browser = \"firefox\";\n\t\t\tthis.browserSlow = false;\n\t\t}else if(ua.indexOf(\"Mac OS\") > -1){\n\t\t\tthis.browser = \"safari\";\n\t\t\tthis.browserSlow = false;\n\t\t}else {\n\t\t\tthis.browser = \"other\";\n\t\t\tthis.browserSlow = false;\n\t\t}\n\t\t\n\t\tthis.browserMobile = /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(ua)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(ua.slice(0,4));\n\t}\n\t\n\tinitGuard(func, msg){\n\t\tvar stack, line;\n\t\t\n\t\tif(this.options.debugInitialization && !this.initialized){\n\t\t\tif(!func){\n\t\t\t\tstack = new Error().stack.split(\"\\n\");\n\t\t\t\t\n\t\t\t\tline = stack[0] == \"Error\" ? stack[2] : stack[1];\n\t\t\t\t\n\t\t\t\tif(line[0] == \" \"){\n\t\t\t\t\tfunc = line.trim().split(\" \")[1].split(\".\")[1];\n\t\t\t\t}else {\n\t\t\t\t\tfunc = line.trim().split(\"@\")[0];\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tconsole.warn(\"Table Not Initialized - Calling the \" + func + \" function before the table is initialized may result in inconsistent behavior, Please wait for the `tableBuilt` event before calling this function.\" + (msg ? \" \" + msg : \"\"));\n\t\t}\n\t\t\n\t\treturn this.initialized;\n\t}\n\t\n\t////////////////// Data Handling //////////////////\n\t//block table redrawing\n\tblockRedraw(){\n\t\tthis.initGuard();\n\n\t\tthis.eventBus.dispatch(\"redraw-blocking\");\n\t\t\n\t\tthis.rowManager.blockRedraw();\n\t\tthis.columnManager.blockRedraw();\n\n\t\tthis.eventBus.dispatch(\"redraw-blocked\");\n\t}\n\t\n\t//restore table redrawing\n\trestoreRedraw(){\n\t\tthis.initGuard();\n\n\t\tthis.eventBus.dispatch(\"redraw-restoring\");\n\n\t\tthis.rowManager.restoreRedraw();\n\t\tthis.columnManager.restoreRedraw();\n\n\t\tthis.eventBus.dispatch(\"redraw-restored\");\n\t}\n\t\n\t//load data\n\tsetData(data, params, config){\n\t\tthis.initGuard(false, \"To set initial data please use the 'data' property in the table constructor.\");\n\t\t\n\t\treturn this.dataLoader.load(data, params, config, false);\n\t}\n\t\n\t//clear data\n\tclearData(){\n\t\tthis.initGuard();\n\t\t\n\t\tthis.dataLoader.blockActiveLoad();\n\t\tthis.rowManager.clearData();\n\t}\n\t\n\t//get table data array\n\tgetData(active){\n\t\treturn this.rowManager.getData(active);\n\t}\n\t\n\t//get table data array count\n\tgetDataCount(active){\n\t\treturn this.rowManager.getDataCount(active);\n\t}\n\t\n\t//replace data, keeping table in position with same sort\n\treplaceData(data, params, config){\n\t\tthis.initGuard();\n\t\t\n\t\treturn this.dataLoader.load(data, params, config, true, true);\n\t}\n\t\n\t//update table data\n\tupdateData(data){\n\t\tvar responses = 0;\n\t\t\n\t\tthis.initGuard();\n\t\t\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.dataLoader.blockActiveLoad();\n\t\t\t\n\t\t\tif(typeof data === \"string\"){\n\t\t\t\tdata = JSON.parse(data);\n\t\t\t}\n\t\t\t\n\t\t\tif(data && data.length > 0){\n\t\t\t\tdata.forEach((item) => {\n\t\t\t\t\tvar row = this.rowManager.findRow(item[this.options.index]);\n\t\t\t\t\t\n\t\t\t\t\tif(row){\n\t\t\t\t\t\tresponses++;\n\t\t\t\t\t\t\n\t\t\t\t\t\trow.updateData(item)\n\t\t\t\t\t\t\t.then(()=>{\n\t\t\t\t\t\t\t\tresponses--;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif(!responses){\n\t\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.catch((e) => {\n\t\t\t\t\t\t\t\treject(\"Update Error - Unable to update row\", item, e);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t}else {\n\t\t\t\t\t\treject(\"Update Error - Unable to find row\", item);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}else {\n\t\t\t\tconsole.warn(\"Update Error - No data provided\");\n\t\t\t\treject(\"Update Error - No data provided\");\n\t\t\t}\n\t\t});\n\t}\n\t\n\taddData(data, pos, index){\n\t\tthis.initGuard();\n\t\t\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.dataLoader.blockActiveLoad();\n\t\t\t\n\t\t\tif(typeof data === \"string\"){\n\t\t\t\tdata = JSON.parse(data);\n\t\t\t}\n\t\t\t\n\t\t\tif(data){\n\t\t\t\tthis.rowManager.addRows(data, pos, index)\n\t\t\t\t\t.then((rows) => {\n\t\t\t\t\t\tvar output = [];\n\t\t\t\t\t\n\t\t\t\t\t\trows.forEach(function(row){\n\t\t\t\t\t\t\toutput.push(row.getComponent());\n\t\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\t\tresolve(output);\n\t\t\t\t\t});\n\t\t\t}else {\n\t\t\t\tconsole.warn(\"Update Error - No data provided\");\n\t\t\t\treject(\"Update Error - No data provided\");\n\t\t\t}\n\t\t});\n\t}\n\t\n\t//update table data\n\tupdateOrAddData(data){\n\t\tvar rows = [],\n\t\tresponses = 0;\n\t\t\n\t\tthis.initGuard();\n\t\t\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.dataLoader.blockActiveLoad();\n\t\t\t\n\t\t\tif(typeof data === \"string\"){\n\t\t\t\tdata = JSON.parse(data);\n\t\t\t}\n\t\t\t\n\t\t\tif(data && data.length > 0){\n\t\t\t\tdata.forEach((item) => {\n\t\t\t\t\tvar row = this.rowManager.findRow(item[this.options.index]);\n\t\t\t\t\t\n\t\t\t\t\tresponses++;\n\t\t\t\t\t\n\t\t\t\t\tif(row){\n\t\t\t\t\t\trow.updateData(item)\n\t\t\t\t\t\t\t.then(()=>{\n\t\t\t\t\t\t\t\tresponses--;\n\t\t\t\t\t\t\t\trows.push(row.getComponent());\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif(!responses){\n\t\t\t\t\t\t\t\t\tresolve(rows);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t}else {\n\t\t\t\t\t\tthis.rowManager.addRows(item)\n\t\t\t\t\t\t\t.then((newRows)=>{\n\t\t\t\t\t\t\t\tresponses--;\n\t\t\t\t\t\t\t\trows.push(newRows[0].getComponent());\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif(!responses){\n\t\t\t\t\t\t\t\t\tresolve(rows);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}else {\n\t\t\t\tconsole.warn(\"Update Error - No data provided\");\n\t\t\t\treject(\"Update Error - No data provided\");\n\t\t\t}\n\t\t});\n\t}\n\t\n\t//get row object\n\tgetRow(index){\n\t\tvar row = this.rowManager.findRow(index);\n\t\t\n\t\tif(row){\n\t\t\treturn row.getComponent();\n\t\t}else {\n\t\t\tconsole.warn(\"Find Error - No matching row found:\", index);\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\t//get row object\n\tgetRowFromPosition(position){\n\t\tvar row = this.rowManager.getRowFromPosition(position);\n\t\t\n\t\tif(row){\n\t\t\treturn row.getComponent();\n\t\t}else {\n\t\t\tconsole.warn(\"Find Error - No matching row found:\", position);\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\t//delete row from table\n\tdeleteRow(index){\n\t\tvar foundRows = [];\n\t\t\n\t\tthis.initGuard();\n\t\t\n\t\tif(!Array.isArray(index)){\n\t\t\tindex = [index];\n\t\t}\n\t\t\n\t\t//find matching rows\n\t\tfor(let item of index){\n\t\t\tlet row = this.rowManager.findRow(item, true);\n\t\t\t\n\t\t\tif(row){\n\t\t\t\tfoundRows.push(row);\n\t\t\t}else {\n\t\t\t\tconsole.error(\"Delete Error - No matching row found:\", item);\n\t\t\t\treturn Promise.reject(\"Delete Error - No matching row found\");\n\t\t\t}\n\t\t}\n\t\t\n\t\t//sort rows into correct order to ensure smooth delete from table\n\t\tfoundRows.sort((a, b) => {\n\t\t\treturn this.rowManager.rows.indexOf(a) > this.rowManager.rows.indexOf(b) ? 1 : -1;\n\t\t});\n\t\t\n\t\t//delete rows\n\t\tfoundRows.forEach((row) =>{\n\t\t\trow.delete();\n\t\t});\n\t\t\n\t\tthis.rowManager.reRenderInPosition();\n\t\t\n\t\treturn Promise.resolve();\n\t}\n\t\n\t//add row to table\n\taddRow(data, pos, index){\n\t\tthis.initGuard();\n\t\t\n\t\tif(typeof data === \"string\"){\n\t\t\tdata = JSON.parse(data);\n\t\t}\n\t\t\n\t\treturn this.rowManager.addRows(data, pos, index, true)\n\t\t\t.then((rows)=>{\n\t\t\t\treturn rows[0].getComponent();\n\t\t\t});\n\t}\n\t\n\t//update a row if it exists otherwise create it\n\tupdateOrAddRow(index, data){\n\t\tvar row = this.rowManager.findRow(index);\n\t\t\n\t\tthis.initGuard();\n\t\t\n\t\tif(typeof data === \"string\"){\n\t\t\tdata = JSON.parse(data);\n\t\t}\n\t\t\n\t\tif(row){\n\t\t\treturn row.updateData(data)\n\t\t\t\t.then(()=>{\n\t\t\t\t\treturn row.getComponent();\n\t\t\t\t});\n\t\t}else {\n\t\t\treturn this.rowManager.addRows(data)\n\t\t\t\t.then((rows)=>{\n\t\t\t\t\treturn rows[0].getComponent();\n\t\t\t\t});\n\t\t}\n\t}\n\t\n\t//update row data\n\tupdateRow(index, data){\n\t\tvar row = this.rowManager.findRow(index);\n\t\t\n\t\tthis.initGuard();\n\t\t\n\t\tif(typeof data === \"string\"){\n\t\t\tdata = JSON.parse(data);\n\t\t}\n\t\t\n\t\tif(row){\n\t\t\treturn row.updateData(data)\n\t\t\t\t.then(()=>{\n\t\t\t\t\treturn Promise.resolve(row.getComponent());\n\t\t\t\t});\n\t\t}else {\n\t\t\tconsole.warn(\"Update Error - No matching row found:\", index);\n\t\t\treturn Promise.reject(\"Update Error - No matching row found\");\n\t\t}\n\t}\n\t\n\t//scroll to row in DOM\n\tscrollToRow(index, position, ifVisible){\n\t\tvar row = this.rowManager.findRow(index);\n\t\t\n\t\tif(row){\n\t\t\treturn this.rowManager.scrollToRow(row, position, ifVisible);\n\t\t}else {\n\t\t\tconsole.warn(\"Scroll Error - No matching row found:\", index);\n\t\t\treturn Promise.reject(\"Scroll Error - No matching row found\");\n\t\t}\n\t}\n\t\n\tmoveRow(from, to, after){\n\t\tvar fromRow = this.rowManager.findRow(from);\n\t\t\n\t\tthis.initGuard();\n\t\t\n\t\tif(fromRow){\n\t\t\tfromRow.moveToRow(to, after);\n\t\t}else {\n\t\t\tconsole.warn(\"Move Error - No matching row found:\", from);\n\t\t}\n\t}\n\t\n\tgetRows(active){\n\t\treturn this.rowManager.getComponents(active);\t\n\t}\n\t\n\t//get position of row in table\n\tgetRowPosition(index){\n\t\tvar row = this.rowManager.findRow(index);\n\t\t\n\t\tif(row){\n\t\t\treturn row.getPosition();\n\t\t}else {\n\t\t\tconsole.warn(\"Position Error - No matching row found:\", index);\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\t/////////////// Column Functions ///////////////\n\tsetColumns(definition){\n\t\tthis.initGuard(false, \"To set initial columns please use the 'columns' property in the table constructor\");\n\t\t\n\t\tthis.columnManager.setColumns(definition);\n\t}\n\t\n\tgetColumns(structured){\n\t\treturn this.columnManager.getComponents(structured);\n\t}\n\t\n\tgetColumn(field){\n\t\tvar column = this.columnManager.findColumn(field);\n\t\t\n\t\tif(column){\n\t\t\treturn column.getComponent();\n\t\t}else {\n\t\t\tconsole.warn(\"Find Error - No matching column found:\", field);\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\tgetColumnDefinitions(){\n\t\treturn this.columnManager.getDefinitionTree();\n\t}\n\t\n\tshowColumn(field){\n\t\tvar column = this.columnManager.findColumn(field);\n\t\t\n\t\tthis.initGuard();\n\t\t\n\t\tif(column){\n\t\t\tcolumn.show();\n\t\t}else {\n\t\t\tconsole.warn(\"Column Show Error - No matching column found:\", field);\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\thideColumn(field){\n\t\tvar column = this.columnManager.findColumn(field); \n\t\t\n\t\tthis.initGuard();\n\t\t\n\t\tif(column){\n\t\t\tcolumn.hide();\n\t\t}else {\n\t\t\tconsole.warn(\"Column Hide Error - No matching column found:\", field);\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\ttoggleColumn(field){\n\t\tvar column = this.columnManager.findColumn(field);\n\t\t\n\t\tthis.initGuard();\n\t\t\n\t\tif(column){\n\t\t\tif(column.visible){\n\t\t\t\tcolumn.hide();\n\t\t\t}else {\n\t\t\t\tcolumn.show();\n\t\t\t}\n\t\t}else {\n\t\t\tconsole.warn(\"Column Visibility Toggle Error - No matching column found:\", field);\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\taddColumn(definition, before, field){\n\t\tvar column = this.columnManager.findColumn(field);\n\t\t\n\t\tthis.initGuard();\n\t\t\n\t\treturn this.columnManager.addColumn(definition, before, column)\n\t\t\t.then((column) => {\n\t\t\t\treturn column.getComponent();\n\t\t\t});\n\t}\n\t\n\tdeleteColumn(field){\n\t\tvar column = this.columnManager.findColumn(field);\n\t\t\n\t\tthis.initGuard();\n\t\t\n\t\tif(column){\n\t\t\treturn column.delete();\n\t\t}else {\n\t\t\tconsole.warn(\"Column Delete Error - No matching column found:\", field);\n\t\t\treturn Promise.reject();\n\t\t}\n\t}\n\t\n\tupdateColumnDefinition(field, definition){\n\t\tvar column = this.columnManager.findColumn(field);\n\t\t\n\t\tthis.initGuard();\n\t\t\n\t\tif(column){\n\t\t\treturn column.updateDefinition(definition);\n\t\t}else {\n\t\t\tconsole.warn(\"Column Update Error - No matching column found:\", field);\n\t\t\treturn Promise.reject();\n\t\t}\n\t}\n\t\n\tmoveColumn(from, to, after){\n\t\tvar fromColumn = this.columnManager.findColumn(from),\n\t\ttoColumn = this.columnManager.findColumn(to);\n\t\t\n\t\tthis.initGuard();\n\t\t\n\t\tif(fromColumn){\n\t\t\tif(toColumn){\n\t\t\t\tthis.columnManager.moveColumn(fromColumn, toColumn, after);\n\t\t\t}else {\n\t\t\t\tconsole.warn(\"Move Error - No matching column found:\", toColumn);\n\t\t\t}\n\t\t}else {\n\t\t\tconsole.warn(\"Move Error - No matching column found:\", from);\n\t\t}\n\t}\n\t\n\t//scroll to column in DOM\n\tscrollToColumn(field, position, ifVisible){\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tvar column = this.columnManager.findColumn(field);\n\t\t\t\n\t\t\tif(column){\n\t\t\t\treturn this.columnManager.scrollToColumn(column, position, ifVisible);\n\t\t\t}else {\n\t\t\t\tconsole.warn(\"Scroll Error - No matching column found:\", field);\n\t\t\t\treturn Promise.reject(\"Scroll Error - No matching column found\");\n\t\t\t}\n\t\t});\n\t}\n\t\n\t//////////// General Public Functions ////////////\n\t//redraw list without updating data\n\tredraw(force){\n\t\tthis.initGuard();\n\n\t\tthis.columnManager.redraw(force);\n\t\tthis.rowManager.redraw(force);\n\t}\n\t\n\tsetHeight(height){\n\t\tthis.options.height = isNaN(height) ? height : height + \"px\";\n\t\tthis.element.style.height = this.options.height;\n\t\tthis.rowManager.initializeRenderer();\n\t\tthis.rowManager.redraw(true);\n\t}\n\t\n\t//////////////////// Event Bus ///////////////////\n\t\n\ton(key, callback){\n\t\tthis.externalEvents.subscribe(key, callback);\n\t}\n\t\n\toff(key, callback){\n\t\tthis.externalEvents.unsubscribe(key, callback);\n\t}\n\t\n\tdispatchEvent(){\n\t\tvar args = Array.from(arguments);\n\t\targs.shift();\n\t\t\n\t\tthis.externalEvents.dispatch(...arguments);\n\t}\n\n\t//////////////////// Alerts ///////////////////\n\n\talert(contents, type){\n\t\tthis.initGuard();\n\n\t\tthis.alertManager.alert(contents, type);\n\t}\n\n\tclearAlert(){\n\t\tthis.initGuard();\n\n\t\tthis.alertManager.clear();\n\t}\n\t\n\t////////////// Extension Management //////////////\n\tmodExists(plugin, required){\n\t\tif(this.modules[plugin]){\n\t\t\treturn true;\n\t\t}else {\n\t\t\tif(required){\n\t\t\t\tconsole.error(\"Tabulator Module Not Installed: \" + plugin);\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\tmodule(key){\n\t\tvar mod = this.modules[key];\n\t\t\n\t\tif(!mod){\n\t\t\tconsole.error(\"Tabulator module not installed: \" + key);\n\t\t}\n\t\t\n\t\treturn mod;\n\t}\n}\n\nvar Tabulator$1 = Tabulator;\n\n//tabulator with all modules installed\n\nclass TabulatorFull extends Tabulator$1 {\n\tstatic extendModule(){\n\t\tTabulator$1.initializeModuleBinder(allModules);\n\t\tTabulator$1._extendModule(...arguments);\n\t}\n\n\tstatic registerModule(){\n\t\tTabulator$1.initializeModuleBinder(allModules);\n\t\tTabulator$1._registerModule(...arguments);\n\t}\n\n\tconstructor(element, options, modules){\n\t\tsuper(element, options, allModules);\n\t}\n}\n\nvar TabulatorFull$1 = TabulatorFull;\n\nclass PseudoRow {\n\n\tconstructor (type){\n\t\tthis.type = type;\n\t\tthis.element = this._createElement();\n\t}\n\n\t_createElement(){\n\t\tvar el = document.createElement(\"div\");\n\t\tel.classList.add(\"tabulator-row\");\n\t\treturn el;\n\t}\n\n\tgetElement(){\n\t\treturn this.element;\n\t}\n\n\tgetComponent(){\n\t\treturn false;\n\t}\n\n\tgetData(){\n\t\treturn {};\n\t}\n\n\tgetHeight(){\n\t\treturn this.element.outerHeight;\n\t}\n\n\tinitialize(){}\n\n\treinitialize(){}\n\n\tnormalizeHeight(){}\n\n\tgenerateCells(){}\n\n\treinitializeHeight(){}\n\n\tcalcHeight(){}\n\n\tsetCellHeight(){}\n\n\tclearCellHeight(){}\n\n\trendered(){}\n}\n\nexport { Accessor as AccessorModule, Ajax as AjaxModule, CalcComponent, CellComponent, Clipboard as ClipboardModule, ColumnCalcs as ColumnCalcsModule, ColumnComponent, DataTree as DataTreeModule, Download as DownloadModule, Edit as EditModule, Export as ExportModule, Filter as FilterModule, Format as FormatModule, FrozenColumns as FrozenColumnsModule, FrozenRows as FrozenRowsModule, GroupComponent, GroupRows as GroupRowsModule, History as HistoryModule, HtmlTableImport as HtmlTableImportModule, Import as ImportModule, Interaction as InteractionModule, Keybindings as KeybindingsModule, Menu as MenuModule, Module, MoveColumns as MoveColumnsModule, MoveRows as MoveRowsModule, Mutator as MutatorModule, Page as PageModule, Persistence as PersistenceModule, Popup as PopupModule, Print as PrintModule, PseudoRow, RangeComponent, ReactiveData as ReactiveDataModule, Renderer, ResizeColumns as ResizeColumnsModule, ResizeRows as ResizeRowsModule, ResizeTable as ResizeTableModule, ResponsiveLayout as ResponsiveLayoutModule, RowComponent, SelectRange as SelectRangeModule, SelectRow as SelectRowModule, SheetComponent, Sort as SortModule, Spreadsheet as SpreadsheetModule, Tabulator$1 as Tabulator, TabulatorFull$1 as TabulatorFull, Tooltip as TooltipModule, Validate as ValidateModule };\n//# sourceMappingURL=tabulator_esm.mjs.map\n","/**\n * Copyright (C) 2017-present by Andrea Giammarchi - @WebReflection\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nconst {replace} = '';\n\n// escape\nconst es = /&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34);/g;\nconst ca = /[&<>'\"]/g;\n\nconst esca = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n \"'\": '&#39;',\n '\"': '&quot;'\n};\nconst pe = m => esca[m];\n\n/**\n * Safely escape HTML entities such as `&`, `<`, `>`, `\"`, and `'`.\n * @param {string} es the input to safely escape\n * @returns {string} the escaped input, and it **throws** an error if\n * the input type is unexpected, except for boolean and numbers,\n * converted as string.\n */\nexport const escape = es => replace.call(es, ca, pe);\n\n\n// unescape\nconst unes = {\n '&amp;': '&',\n '&#38;': '&',\n '&lt;': '<',\n '&#60;': '<',\n '&gt;': '>',\n '&#62;': '>',\n '&apos;': \"'\",\n '&#39;': \"'\",\n '&quot;': '\"',\n '&#34;': '\"'\n};\nconst cape = m => unes[m];\n\n/**\n * Safely unescape previously escaped entities such as `&`, `<`, `>`, `\"`,\n * and `'`.\n * @param {string} un a previously escaped string\n * @returns {string} the unescaped input, and it **throws** an error if\n * the input type is unexpected, except for boolean and numbers,\n * converted as string.\n */\nexport const unescape = un => replace.call(un, es, cape);\n","import { Column, ColumnSorter, ColumnAggregatorFunction } from './table.types';\nimport {\n CellComponent,\n ColumnCalc,\n ColumnComponent,\n ColumnDefinition,\n Formatter,\n SorterFromTable,\n} from 'tabulator-tables';\nimport { escape } from 'html-escaper';\nimport { ElementPool } from './element-pool';\nimport { pickBy, negate } from 'lodash-es';\n\nexport class ColumnDefinitionFactory {\n constructor(private pool: ElementPool) {\n this.create = this.create.bind(this);\n }\n\n /**\n * Create Tabulator column definitions from a limel-table column configuration\n *\n * @param column - config describing the column\n * @returns Tabulator column\n */\n public create(column: Column<object>): ColumnDefinition {\n const definition: ColumnDefinition = {\n title: column.title,\n field: column.field,\n hozAlign: column.horizontalAlign,\n headerSort: column.headerSort,\n headerSortStartingDir: 'desc',\n };\n\n if (column.headerComponent) {\n definition.titleFormatter = formatHeader(column);\n }\n\n if (column.component?.name || column.formatter) {\n definition.formatter = createFormatter(column, this.pool);\n definition.formatterParams = column as object;\n }\n\n if (column.aggregator) {\n definition.bottomCalc = getColumnAggregator(column);\n }\n\n return definition;\n }\n}\n\n/**\n * Formats the header of the column\n *\n * @param column - the configuration for the column\n * @returns custom component that renders a column header\n */\nexport const formatHeader = (column: Column) => (): string | HTMLElement => {\n const headerElement = document.createElement('div');\n headerElement.setAttribute('class', 'lime-col-title__custom-component');\n\n const titleElement = document.createElement('span');\n titleElement.setAttribute('class', 'title-component-text');\n titleElement.textContent = column.title;\n\n const customElement = document.createElement(column.headerComponent.name);\n customElement.setAttribute('class', 'title-component-slot');\n\n let props: object = column.headerComponent.props || {};\n if (column.headerComponent.propsFactory) {\n props = {\n ...props,\n // we pass null to propsFactory function because no data in column header\n ...column.headerComponent.propsFactory(null),\n };\n }\n\n setElementProperties(customElement, props);\n\n headerElement.append(titleElement);\n headerElement.append(customElement);\n\n return headerElement;\n};\n\n/**\n * Create a formatter to be used to format values in a column\n *\n * @param column - config describing the column\n * @param pool - pool to get custom components from\n * @returns Tabulator formatter\n */\nexport function createFormatter(column: Column, pool: ElementPool): Formatter {\n if (!column.component?.name) {\n return formatCell;\n }\n\n if (!columnElementExists(column)) {\n console.warn(\n `Failed to render custom component for column \"${column.field.toString()}\". Custom element <${\n column.component.name\n }/> does not exist. Using the default formatter.`\n );\n\n return formatCell;\n }\n\n return (cell: CellComponent) => {\n const value = formatCell(cell, column);\n\n return createCustomComponent(cell, column, value, pool);\n };\n}\n\nfunction columnElementExists(column: Column<any>) {\n const name = column.component.name;\n if (typeof name === 'string') {\n const isNativeElement = !name.includes('-');\n const customElementExists = customElements.get(column.component.name);\n\n return isNativeElement || customElementExists;\n } else {\n return false;\n }\n}\n\n/**\n * Format the value of a cell in the table\n *\n * @param cell - the cell being rendered in the table\n * @param column - configuration for the current column\n * @returns the formatted value\n */\nexport function formatCell(cell: CellComponent, column: Column): string {\n const data = cell.getData();\n let value = cell.getValue();\n\n if (column.formatter) {\n value = column.formatter(value, data);\n }\n\n if (typeof value === 'string' && !column.component) {\n value = escape(value);\n }\n\n return value;\n}\n\n/**\n * Create a custom component that renders a cell value\n *\n * @param cell - Tabulator cell\n * @param column - lime-elements column configuration\n * @param value - the value of the cell being rendered\n * @param pool - pool to get custom components from\n * @returns custom component that renders a value in the table\n */\nexport function createCustomComponent(\n cell: CellComponent,\n column: Column,\n value: string,\n pool: ElementPool\n): HTMLElement {\n const field = cell.getField();\n const data = cell.getData();\n\n const element = pool.get(column.component.name);\n let props: object = column.component.props || {};\n if (column.component.propsFactory) {\n props = {\n ...props,\n ...column.component.propsFactory(data),\n };\n }\n\n props = {\n ...props,\n field: field,\n value: value,\n data: data,\n };\n\n element.style.display = 'inline-block';\n setElementProperties(element, props);\n\n createResizeObserver(element, cell.getColumn());\n\n return element;\n}\n\n/**\n * Set all properties for a custom element, including event listeners\n *\n * @param element - the custom element\n * @param props - object of properties and event listeners\n */\nexport function setElementProperties(element: HTMLElement, props: object) {\n const properties = pickBy(props, negate(isEventListener));\n Object.assign(element, properties);\n\n const listeners = pickBy(props, isEventListener);\n for (const [key, value] of Object.entries(listeners)) {\n const event = getEventName(key);\n element.addEventListener(event, value as any);\n }\n}\n\n/**\n * Check if a property is an event listener.\n *\n * An event listener has to be a function and its property name have to start\n * with \"on\" followed by the name of the event in camel case, e.g. \"onEventName\"\n *\n * @param value - the value to check\n * @param key - name of the property\n * @returns true if the property of the object is an event listener\n */\nfunction isEventListener(value: any, key: string): boolean {\n if (typeof value !== 'function') {\n return false;\n }\n\n return /^on[A-Z]/.test(key);\n}\n\n/**\n * Get the name of an event from the name of an event listener\n *\n * E.g. \"onMyEvent\" will return \"myEvent\"\n *\n * @param eventListener - name of the event listener\n * @returns the name of the event\n */\nfunction getEventName(eventListener: string): string {\n return eventListener.charAt(2).toLowerCase() + eventListener.slice(3);\n}\n\nfunction createResizeObserver(element: HTMLElement, column: ColumnComponent) {\n if (!('ResizeObserver' in window)) {\n return;\n }\n\n const RESIZE_TIMEOUT = 1000;\n const COLUMN_PADDING = 16;\n\n const observer = new ResizeObserver(() => {\n const width = element.getBoundingClientRect().width;\n const newWidth = width + COLUMN_PADDING;\n\n if (newWidth < column.getWidth()) {\n return;\n }\n\n column.setWidth(newWidth);\n });\n observer.observe(element);\n\n // We give the component some time to resize itself before we\n // stop listening for resize events\n setTimeout(() => {\n observer.unobserve(element);\n }, RESIZE_TIMEOUT);\n}\n\n/**\n * Create a column sorter from a tabulator sorter\n *\n * @param columns - all available columns in the table\n * @returns function that creates a sorter from a tabulator sorter\n */\nexport const createColumnSorter =\n (columns: Column[]) =>\n (sorter: SorterFromTable): ColumnSorter => {\n const column = columns.find((col) => col.field === sorter.field);\n const direction = sorter.dir.toUpperCase() as 'ASC' | 'DESC';\n\n return {\n column: column,\n direction: direction,\n };\n };\n\n/**\n *\n * @param column\n */\nexport function getColumnAggregator(column: Column): ColumnCalc {\n const aggregator = column.aggregator;\n if (isAggregatorFunction(aggregator)) {\n return (values: any[], data: object[]) => {\n return aggregator(column, values, data);\n };\n }\n\n return aggregator;\n}\n\nfunction isAggregatorFunction(value: any): value is ColumnAggregatorFunction {\n return typeof value === 'function';\n}\n","export class ElementPool {\n private pool: Record<string, HTMLElement[]>;\n private usedElements: WeakMap<Element, boolean>;\n private document: Document;\n\n constructor(document: Document) {\n this.document = document;\n this.releaseAll();\n this.clear();\n }\n\n /**\n * Get an element from the pool\n *\n * @param name - tag name of the element\n * @returns the element\n */\n public get(name: string): HTMLElement {\n let element = this.pool[name]?.find(this.isFree);\n if (!element) {\n element = this.createElement(name);\n }\n\n this.usedElements.set(element, true);\n\n return element;\n }\n\n private isFree = (element: HTMLElement) => {\n return !this.usedElements.has(element);\n };\n\n /**\n * Release an element from the pool so that it can be reused\n *\n * @param element - the element to release from the pool\n */\n public release(element: HTMLElement): void {\n this.usedElements.delete(element);\n }\n\n /**\n * Release all elements from the pool so that they can be reused\n */\n public releaseAll() {\n this.usedElements = new WeakMap();\n }\n\n /**\n * Remove all elements from the pool and makes them available for garbage\n * collection\n */\n public clear() {\n this.pool = {};\n }\n\n private createElement(name: string) {\n const element = this.document.createElement(name);\n if (!(name in this.pool)) {\n this.pool[name] = [];\n }\n\n this.pool[name].push(element);\n\n return element;\n }\n}\n","/**\n * Contains changes made to a selection\n */\nexport interface SelectionChangeSet {\n /**\n * Tells whether the items were selected or deselected\n */\n selected: boolean;\n /**\n * Gets the affected items\n */\n items: any[];\n /**\n * Gets the indexes of the affected items\n */\n indexes: number[];\n}\n\n/**\n * Contains a set of selected data objects with methods for adding and removing\n * items to the selection by referring to them by their index/position.\n * Maintains a memory of the last toggled item which can be used to select or\n * deselect a range of items between the last toggled item and a given item.\n */\nexport class Selection {\n private selectedItems: Set<any>;\n private lastToggledIndex: number;\n\n /**\n * Creates an instance of the Selection class.\n * The provided function `getDataByIndex` is used to provide data for the\n * selected items when selection is toggled by using the item index,\n * which can be the row position in a table.\n *\n * @param getDataByIndex - A function that returns the data at the given index\n */\n constructor(private getDataByIndex: (index: number) => any) {\n this.clear();\n }\n\n /**\n * @returns The size of the selection\n */\n get size(): number {\n return this.selectedItems.size;\n }\n\n /**\n * @returns The selected items\n */\n get items(): any[] {\n return [...this.selectedItems];\n }\n\n /**\n * @param items - The selected items\n */\n set items(items: any[]) {\n this.selectedItems = new Set(items);\n this.lastToggledIndex = -1;\n }\n\n /**\n * Checks whether the given item exist in the selection\n *\n * @param data - The data to look up\n * @returns `true` if the given data exist in the selection, otherwise `false`\n */\n public has(data: any) {\n return this.selectedItems.has(data);\n }\n\n /**\n * Toggles the item at the given index in the selection\n *\n * @param index - The index of the item to toggle\n * @returns The changes made to the selection\n */\n public toggleSelection(index: number): SelectionChangeSet {\n return this.toggleRange(index, index);\n }\n\n /**\n * Toggles the items from the last toggled index to the given index in the selection.\n * The toggled items will be toggled as the item at the given index no matter\n * their current state in the selection.\n * Initially, when no last toggled index exist, this function behaves like\n * `toggleSelection`.\n *\n * @param index - The index of the item to toggle\n * @returns The changes made to the selection\n */\n public toggleSelectionFromLastIndex(index: number): SelectionChangeSet {\n if (this.lastToggledIndex < 0) {\n return this.toggleSelection(index);\n }\n\n return this.toggleRange(this.lastToggledIndex, index);\n }\n\n /**\n * Clears the current selection and resets last toggled index\n */\n public clear() {\n this.selectedItems = new Set();\n this.lastToggledIndex = -1;\n }\n\n private toggleRange = (\n fromIndex: number,\n toIndex: number\n ): SelectionChangeSet => {\n const select = !this.selectedItems.has(this.getDataByIndex(toIndex));\n\n const lowerBound = Math.min(fromIndex, toIndex);\n const upperBound = Math.max(fromIndex, toIndex);\n const updatedIndexes = [];\n const updatedItems = [];\n for (let index = lowerBound; index <= upperBound; index++) {\n const data = this.getDataByIndex(index);\n\n if (!data) {\n continue;\n }\n\n const isSelected = this.selectedItems.has(data);\n\n if (isSelected === select) {\n continue;\n }\n\n if (select) {\n this.selectedItems.add(data);\n } else {\n this.selectedItems.delete(data);\n }\n\n updatedIndexes.push(index);\n updatedItems.push(data);\n }\n\n this.lastToggledIndex = toIndex;\n\n return {\n selected: select,\n items: updatedItems,\n indexes: updatedIndexes,\n };\n };\n}\n","import { EventEmitter } from '@stencil/core';\nimport {\n Tabulator,\n ColumnDefinition as TabulatorColumnDefinition,\n CellComponent as TabulatorCellComponent,\n RowComponent as TabulatorRowComponent,\n} from 'tabulator-tables';\nimport { setElementProperties } from './columns';\nimport { ElementPool } from './element-pool';\nimport { Selection, SelectionChangeSet } from './selection';\nimport { RowData } from './table.types';\n\nconst LIMEL_CHECKBOX = 'limel-checkbox';\n\nconst getRowId = (data: RowData) => data.id ?? data;\n\n/**\n * Provides row selection to Tabulator with shift-click support for range selections\n */\nexport class TableSelection {\n private selection: Selection;\n\n /**\n * Creates an instance of the TableSelection class\n *\n * @param getTable - Function that returns the Tabulator instance\n * @param pool - The element pool used to cache the checkbox components\n * @param selectEvent - The event emitter to use when checkboxes are toggled\n * @param getTranslation - Function to get translated strings\n */\n constructor(\n private getTable: () => Tabulator,\n private pool: ElementPool,\n private selectEvent: EventEmitter<RowData[]>,\n private getTranslation: (key: string) => string\n ) {\n this.selection = new Selection((index) =>\n getRowId(this.getRowByIndex(index).getData())\n );\n }\n\n /**\n * @returns Returns `true` when the selection is non-empty, otherwise `false`\n */\n get hasSelection(): boolean {\n return this.selection.size > 0;\n }\n\n /**\n * Clears the selection\n */\n public clear(): void {\n this.selection.clear();\n }\n\n /**\n * Sets the selected items\n *\n * @param data - The selected items\n */\n public setSelection(data: RowData[] = []): void {\n const newItems = data.map(getRowId);\n if (\n this.selection.size === data.length &&\n this.selection.items.every(\n (oldItem, index) => oldItem === newItems[index]\n )\n ) {\n return;\n }\n\n this.selection.items = newItems;\n const rows = this.getActiveRows();\n for (const row of rows)\n this.updateRowSelector(\n row,\n this.selection.has(getRowId(row.getData()))\n );\n }\n\n /**\n * Prepends a checkbox column used for row selection to the given column definitions\n *\n * @param columnDefinitions - The column definition for the table\n * @returns The column definitions with the checkbox column prepended to it\n */\n public getColumnDefinitions(\n columnDefinitions: TabulatorColumnDefinition[]\n ): TabulatorColumnDefinition[] {\n return [this.getRowSelectorColumnDefinition(), ...columnDefinitions];\n }\n\n private getRowSelectorColumnDefinition(): TabulatorColumnDefinition {\n return {\n title: '',\n formatter: this.getRowSelectorFormatter(),\n cellClick: this.rowSelectorCellClick,\n headerClick: this.headerClick,\n headerSort: false,\n cssClass: 'limel-table--row-selector',\n resizable: false,\n htmlOutput: false,\n clipboard: false,\n };\n }\n\n private headerClick(ev: Event): void {\n ev.stopPropagation();\n }\n\n private getRowSelectorFormatter() {\n return (cell: TabulatorCellComponent) => {\n const element = this.pool.get(LIMEL_CHECKBOX);\n setElementProperties(element, {\n checked: this.selection.has(getRowId(cell.getData())),\n label: this.getTranslation('table.select-row'),\n });\n element.classList.add('hide-label');\n element.style.display = 'inline-block';\n\n return element;\n };\n }\n\n /**\n * Tabulator cell click handler that updates the selection for the clicked\n * row and toggles the selection from the last clicked row if the shift key\n * is pressed down.\n *\n * @param ev - The pointer event\n * @param cell - The clicked cell component\n */\n protected rowSelectorCellClick = (\n ev: PointerEvent,\n cell: TabulatorCellComponent\n ): void => {\n ev.stopPropagation();\n ev.preventDefault();\n\n const clickedRow = cell.getRow();\n const rowPosition = clickedRow.getPosition(true);\n\n if (rowPosition === false) {\n return;\n }\n\n if (ev.shiftKey) {\n this.updateRowSelectors(\n this.selection.toggleSelectionFromLastIndex(rowPosition)\n );\n } else {\n this.updateRowSelectors(\n this.selection.toggleSelection(rowPosition)\n );\n }\n\n this.selectEvent.emit(this.selection.items.map(this.getRowData));\n };\n\n private getRowData = (item: RowData | RowData['id']) => {\n if (typeof item === 'object') {\n return item;\n }\n\n return this.getTable().getRow(item).getData();\n };\n\n private updateRowSelectors = (changeSet: SelectionChangeSet): void => {\n for (const row of changeSet.indexes.map(this.getRowByIndex))\n this.updateRowSelector(row, changeSet.selected);\n };\n\n private updateRowSelector = (\n row: TabulatorRowComponent,\n checked: boolean\n ): void => {\n const cell = row.getCells()[0];\n if (cell) {\n const checkBox = cell.getElement().querySelector(LIMEL_CHECKBOX);\n checkBox.checked = checked;\n }\n };\n\n private readonly getActiveRows: () => TabulatorRowComponent[] = () => {\n const table = this.getTable();\n if (!table) {\n return [];\n }\n\n return table.getRows('active');\n };\n\n private getRowByIndex = (index: number) => {\n return this.getTable().getRowFromPosition(index, true);\n };\n}\n","/**\n * Layouts:\n * - default: resizes the table's columns, in a way that each column becomes as wide as the data it holds\n * - stretchLastColumn: works like default, but the last column is stretched to fill any remaining space\n * - stretchColumns: when there is extra space, the columns are stretched to fill it, otherwise, this works just like default\n * - lowDensity: converts the table into an airy list of items\n * @public\n */\nexport type Layout =\n | 'default'\n | 'stretchLastColumn'\n | 'stretchColumns'\n | 'lowDensity';\n\n/**\n * Maps a layout to a Tabulator layout\n * @param layout - the layout to map\n * @returns the Tabulator layout\n * @internal\n */\nexport function mapLayout(layout: Layout) {\n const layouts = {\n stretchLastColumn: 'fitDataStretch',\n stretchColumns: 'fitColumns',\n lowDensity: 'fitData',\n };\n\n return layouts[layout] || 'fitDataFill';\n}\n","import { isEqual } from 'lodash-es';\nimport { RowData } from './table.types';\n\nexport const areRowsEqual = (newData: RowData[], oldData: RowData[]) => {\n // Ensures table updates when a user modifies row content and triggers a refresh,\n // catching edits even if IDs and order remain the same.\n if (newData.length !== oldData.length) {\n return false;\n }\n\n return newData.every((newItem, index) => isEqual(newItem, oldData[index]));\n};\n","@use '../../style/mixins';\n@use '../../style/functions';\n@import '../../../node_modules/tabulator-tables/src/scss/tabulator.scss';\n\n/*\n* @prop --table-max-column-width: defines a maximum width for columns using standard size units, to prevent the table from growing too wide. Set to `auto` if you do not need this limitation. Defaults to `40rem`.\n*/\n\n$width-of-sorter-arrow: 0.5rem;\n$cell-padding: 0.5rem;\n$table--has-interactive-rows--selectable-row--hover: 2;\n$table--limel-table--row-selector: 1;\n$height-of-aggregations-row: 1.5rem;\n\n:host(limel-table) {\n isolation: isolate;\n display: block;\n --table-header-background-color: var(--contrast-500);\n --table-header-background-color--hover: var(--contrast-400);\n --table-header-background-color-when-being-dragged: var(--contrast-100);\n\n --table-row-background-color--odd: var(--contrast-200);\n --table-row-background-color--even: var(--contrast-100);\n --table-row-background-color--hover: var(\n --lime-elevated-surface-background-color\n );\n --table-row-background-color--active: var(--mdc-theme-primary);\n\n --table-arrow-color: var(--contrast-800);\n --table-arrow-color--active: var(\n --lime-primary-color,\n var(--limel-theme-primary-color)\n );\n\n --table-text-color: var(--limel-theme-text-primary-on-background-color);\n --limel-chip-size: 1.25rem;\n}\n\n@import './partial-styles/_table-main-layout';\n\n#tabulator-container {\n position: relative;\n}\n\n#tabulator-container,\n#tabulator-table {\n background-color: transparent;\n border: none;\n}\n\n.tabulator {\n .tabulator-header {\n color: var(--table-text-color);\n }\n .tabulator-tableholder {\n .tabulator-table {\n color: var(--table-text-color);\n background-color: transparent;\n }\n }\n\n .tabulator-header {\n border-bottom: 0;\n background-color: rgb(var(--table-header-background-color));\n\n .tabulator-headers {\n width: fit-content;\n }\n\n .tabulator-col {\n transition: background-color 0.2s ease;\n background-color: rgb(var(--table-header-background-color));\n border-right-color: rgb(var(--contrast-200));\n\n &.tabulator-sortable.tabulator-col-sorter-element {\n &:hover {\n background-color: rgb(\n var(--table-header-background-color--hover)\n );\n }\n }\n\n .tabulator-col-content {\n padding: 0 $width-of-sorter-arrow 0 0.25rem;\n }\n }\n\n .tabulator-col-title-holder {\n height: 1.75rem;\n display: flex;\n align-items: center;\n gap: 0.25rem;\n }\n\n .tabulator-col-sorter {\n order: 1;\n }\n .tabulator-col-title {\n order: 2;\n font-weight: 500;\n padding-right: 0 !important;\n line-height: functions.pxToRem(20);\n }\n }\n}\n\n.tabulator-row {\n height: 2.25rem;\n\n .tabulator-cell {\n border-right: transparent;\n padding: $cell-padding;\n padding-left: $cell-padding + $width-of-sorter-arrow;\n\n height: inherit;\n\n &[style*='text-align: right;'] {\n justify-content: flex-end;\n }\n &[style*='text-align: center;'] {\n justify-content: center;\n }\n }\n\n .tabulator-col-resize-handle {\n display: none;\n }\n}\n\n.tabulator-col,\n.tabulator-cell {\n max-width: var(--table-max-column-width, 40rem);\n}\n\n#tabulator-loader,\n#tabulator-empty-text {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n#tabulator-loader {\n background-color: rgba(var(--contrast-100), 0.6);\n cursor: wait;\n}\n\n#tabulator-empty-text {\n color: rgb(var(--contrast-800));\n font-weight: bold;\n font-size: functions.pxToRem(20);\n pointer-events: none;\n}\n\nlimel-chip {\n transform: translateY(-0.15rem);\n}\n\n@import './partial-styles/tabulator-arrow';\n@import './partial-styles/tabulator-paginator';\n@import './partial-styles/tabulator-loader';\n@import './partial-styles/tabulator-custom-styles';\n@import './partial-styles/header-component';\n@import './partial-styles/movable-columns';\n@import './partial-styles/_tabulator-footer';\n@import './partial-styles/_row-selection';\n","import {\n Component,\n h,\n Prop,\n Element,\n Watch,\n EventEmitter,\n Event,\n Host,\n} from '@stencil/core';\nimport {\n TabulatorFull,\n Tabulator,\n Options as TabulatorOptions,\n Sorter as TabulatorSorter,\n SorterFromTable as TabulatorSorterFromTable,\n SortDirection as TabulatorSortDirection,\n ColumnComponent as TabulatorColumnComponent,\n ColumnDefinition as TabulatorColumnDefinition,\n RowComponent as TabulatorRowComponent,\n OptionsData as TabulatorOptionsData,\n OptionsPagination as TabulatorOptionsPagination,\n OptionsColumns as TabulatorOptionsColumns,\n} from 'tabulator-tables';\nimport {\n Column,\n TableParams,\n ColumnSorter,\n ColumnAggregate,\n RowData,\n} from './table.types';\nimport { ColumnDefinitionFactory, createColumnSorter } from './columns';\nimport { isEqual, has } from 'lodash-es';\nimport { ElementPool } from './element-pool';\nimport { TableSelection } from './table-selection';\nimport { mapLayout, Layout } from './layout';\nimport { areRowsEqual } from './utils';\nimport { Languages } from '../date-picker/date.types';\nimport translate from '../../global/translations';\n\nconst FIRST_PAGE = 1;\n\n/**\n * @exampleComponent limel-example-table\n * @exampleComponent limel-example-table-custom-components\n * @exampleComponent limel-example-table-header-menu\n * @exampleComponent limel-example-table-movable-columns\n * @exampleComponent limel-example-table-sorting-disabled\n * @exampleComponent limel-example-table-pagination\n * @exampleComponent limel-example-table-local\n * @exampleComponent limel-example-table-remote\n * @exampleComponent limel-example-table-activate-row\n * @exampleComponent limel-example-table-selectable-rows\n * @exampleComponent limel-example-table-default-sorted\n * @exampleComponent limel-example-table-layout-default\n * @exampleComponent limel-example-table-layout-stretch-last-column\n * @exampleComponent limel-example-table-layout-stretch-columns\n * @exampleComponent limel-example-table-layout-low-density\n * @exampleComponent limel-example-table-interactive-rows\n */\n@Component({\n tag: 'limel-table',\n styleUrl: 'table.scss',\n shadow: true,\n})\nexport class Table {\n /**\n * Data to be displayed in the table. Provide a stable `id` on each row to keep\n * scroll position, focus, and selections intact across updates.\n */\n @Prop()\n public data: object[] = [];\n\n /**\n * Columns used to display the data\n */\n @Prop()\n public columns: Column[] = [];\n\n /**\n * Set to either `local` or `remote` to change how the table handles the\n * loaded data. When in `local` mode, all sorting and pagination will be\n * done locally with the data given. When in `remote` mode, the consumer\n * is responsible to give the table new data when a `load` event occurs\n */\n @Prop()\n public mode: 'local' | 'remote' = 'local';\n\n /**\n * Defines the layout of the table, based on how width of the columns are calculated.\n *\n * - `default`: makes columns as wide as their contents.\n * - `stretchLastColumn`: makes columns as wide as their contents, stretch the last column to fill up the remaining table width.\n * - `stretchColumns`: stretches all columns to fill the available width when possible.\n * - `lowDensity`: makes columns as wide as their contents, and creates a low density and airy layout.\n */\n @Prop()\n public layout: Layout;\n\n /**\n * Number of rows per page\n */\n @Prop()\n public pageSize: number;\n\n /**\n * The number of total rows available for the data\n */\n @Prop()\n public totalRows: number;\n\n /**\n * The initial sorted columns\n */\n @Prop()\n public sorting: ColumnSorter[] = [];\n\n /**\n * Active row in the table\n */\n @Prop({ mutable: true })\n public activeRow: RowData;\n\n /**\n * Set to `true` to enable reordering of the columns by dragging them\n */\n @Prop()\n public movableColumns: boolean;\n\n /**\n * Set to `false` to disable column sorting through header interactions.\n * Programmatic sorting through the `sorting` prop and `sort` event remains available.\n */\n @Prop()\n public sortableColumns: boolean = true;\n\n /**\n * Set to `true` to trigger loading animation\n */\n @Prop()\n public loading: boolean = false;\n\n /**\n * The page to show\n */\n @Prop()\n public page: number = FIRST_PAGE;\n\n /**\n * Emitted when `mode` is `local` the data is sorted\n */\n @Event()\n public sort: EventEmitter<ColumnSorter[]>;\n\n /**\n * Emitted when a new page has been set\n */\n @Event()\n public changePage: EventEmitter<number>;\n\n /**\n * A message to display when the table has no data\n */\n @Prop()\n public emptyMessage: string;\n\n /**\n * Column aggregates to be displayed in the table\n */\n @Prop()\n public aggregates: ColumnAggregate[];\n\n /**\n * Enables row selection\n */\n @Prop()\n public selectable: boolean;\n\n /**\n * Selected data. Requires `selectable` to be true.\n */\n @Prop()\n public selection: object[];\n\n /**\n * Defines the language for translations.\n */\n @Prop({ reflect: true })\n public language: Languages = 'en';\n\n /**\n * Location of the pagination controls.\n * - `top`: Display pagination controls at the top of the table\n * - `bottom`: Display pagination controls at the bottom of the table (default)\n */\n @Prop({ reflect: true })\n public paginationLocation: 'top' | 'bottom' = 'bottom';\n\n /**\n * Emitted when `mode` is `remote` and the table is loading new data. The\n * consumer is responsible for giving the table new data\n */\n @Event()\n public load: EventEmitter<TableParams>;\n\n /**\n * Emitted when a row is activated\n */\n @Event()\n public activate: EventEmitter<object>;\n\n /**\n * Emitted when the columns have been changed\n */\n @Event()\n public changeColumns: EventEmitter<Column[]>;\n\n /**\n * Emitted when the row selection has been changed\n */\n @Event()\n public select: EventEmitter<object[]>;\n\n /**\n * Emitted when the select all rows state is toggled\n */\n @Event()\n public selectAll: EventEmitter<boolean>;\n\n @Element()\n private host: HTMLLimelTableElement;\n\n private currentLoad: { page: number; sorters: ColumnSorter[] };\n\n private tabulator: Tabulator;\n\n private pool: ElementPool;\n private columnFactory: ColumnDefinitionFactory;\n private initialized = false;\n private destroyed = false;\n private resizeObserver: ResizeObserver;\n private currentSorting: ColumnSorter[];\n private tableSelection: TableSelection;\n private shouldSort = false;\n\n constructor() {\n this.handleDataSorting = this.handleDataSorting.bind(this);\n this.handlePageLoaded = this.handlePageLoaded.bind(this);\n this.handleRenderComplete = this.handleRenderComplete.bind(this);\n this.handleAjaxRequesting = this.handleAjaxRequesting.bind(this);\n this.requestData = this.requestData.bind(this);\n this.onClickRow = this.onClickRow.bind(this);\n this.formatRow = this.formatRow.bind(this);\n this.formatRows = this.formatRows.bind(this);\n this.updateMaxPage = this.updateMaxPage.bind(this);\n this.initTabulatorComponent = this.initTabulatorComponent.bind(this);\n this.setSelection = this.setSelection.bind(this);\n this.addColumnAggregator = this.addColumnAggregator.bind(this);\n this.pool = new ElementPool(document);\n this.columnFactory = new ColumnDefinitionFactory(this.pool);\n }\n\n public componentWillLoad() {\n this.initTableSelection();\n }\n\n public componentDidLoad() {\n this.destroyed = false;\n this.init();\n }\n\n public disconnectedCallback() {\n this.destroyed = true;\n this.initialized = false;\n\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n\n if (this.tabulator) {\n this.tabulator.destroy();\n this.tabulator = null;\n }\n\n this.pool.clear();\n }\n\n @Watch('totalRows')\n protected totalRowsChanged() {\n this.updateMaxPage();\n }\n\n @Watch('pageSize')\n protected pageSizeChanged() {\n this.updateMaxPage();\n }\n\n @Watch('page')\n protected pageChanged() {\n if (!this.tabulator) {\n return;\n }\n\n if (this.tabulator.getPage() === this.page) {\n return;\n }\n\n this.tabulator.setPage(this.page);\n }\n\n @Watch('activeRow')\n protected activeRowChanged() {\n if (!this.tabulator) {\n return;\n }\n\n this.formatRows();\n }\n\n @Watch('data')\n protected updateData(newData: RowData[] = [], oldData: RowData[] = []) {\n const newIds = this.getRowIds(newData);\n const oldIds = this.getRowIds(oldData);\n const shouldReplace = this.shouldReplaceData(newIds, oldIds);\n const hasRowUpdates = !areRowsEqual(newData, oldData);\n\n setTimeout(() => {\n if (!this.tabulator || !this.initialized) {\n return;\n }\n\n if (shouldReplace) {\n this.pool.releaseAll();\n this.tabulator.replaceData(newData);\n this.setSelection();\n\n return;\n }\n\n if (hasRowUpdates) {\n this.tabulator.updateData(newData);\n this.setSelection();\n\n return;\n }\n\n if (newData.length > 0) {\n this.tabulator.updateOrAddData(newData);\n }\n });\n }\n\n @Watch('columns')\n protected updateColumns(newColumns: Column[], oldColumns: Column[]) {\n if (!this.tabulator) {\n return;\n }\n\n if (this.areSameColumns(newColumns, oldColumns)) {\n return;\n }\n\n const columnsInTable = this.tabulator\n .getColumns()\n .filter((c) => c.getField());\n\n const oldColumnsInTable = columnsInTable.map((c) =>\n oldColumns.find((old) => old.field === c.getField())\n );\n\n if (this.areSameColumns(newColumns, oldColumnsInTable)) {\n return;\n }\n\n this.tabulator.setColumns(this.getColumnDefinitions());\n this.shouldSort = true;\n }\n\n @Watch('aggregates')\n protected updateAggregates(\n newAggregates: ColumnAggregate[],\n oldAggregates: ColumnAggregate[]\n ) {\n if (!this.tabulator) {\n return;\n }\n\n if (isEqual(newAggregates, oldAggregates)) {\n return;\n }\n\n if (!this.haveSameAggregateFields(newAggregates, oldAggregates)) {\n this.init();\n\n return;\n }\n\n this.tabulator.recalc();\n this.tabulator.rowManager.redraw();\n }\n\n @Watch('selection')\n protected updateSelection(newSelection: any[]) {\n if (!this.tableSelection) {\n return;\n }\n\n this.tableSelection.setSelection(newSelection);\n }\n\n @Watch('selectable')\n protected updateSelectable() {\n if (this.tableSelection && !this.selectable) {\n this.tableSelection = null;\n }\n\n this.initTableSelection();\n this.init();\n }\n\n @Watch('sortableColumns')\n protected updateSortableColumns() {\n if (!this.tabulator) {\n return;\n }\n\n this.tabulator.setColumns(this.getColumnDefinitions());\n this.shouldSort = true;\n }\n\n @Watch('sorting')\n protected updateSorting(\n newValue: ColumnSorter[],\n oldValue: ColumnSorter[]\n ) {\n const newSorting = this.getColumnSorter(newValue);\n const oldSorting = this.getColumnSorter(oldValue);\n if (isEqual(newSorting, oldSorting)) {\n return;\n }\n\n this.tabulator.setSort(newSorting);\n }\n\n private shouldReplaceData(\n newIds: Array<string | number>,\n oldIds: Array<string | number>\n ) {\n return (\n !this.areEqualIds(newIds, oldIds) ||\n !this.isSameOrder(newIds, oldIds)\n );\n }\n\n private getRowIds(data: RowData[]): Array<string | number> {\n return data.map((item) => item.id ?? item) as Array<string | number>;\n }\n\n private areEqualIds(\n newIds: Array<string | number>,\n oldIds: Array<string | number>\n ): boolean {\n const newIdSet = new Set(newIds);\n const oldIdSet = new Set(oldIds);\n\n return (\n newIdSet.size === oldIdSet.size &&\n newIds.every((id) => oldIdSet.has(id))\n );\n }\n\n private isSameOrder(\n newIds: Array<string | number>,\n oldIds: Array<string | number>\n ): boolean {\n return newIds.every((id, index) => id === oldIds[index]);\n }\n\n private areSameColumns(newColumns: Column[], oldColumns: Column[]) {\n return (\n newColumns.length === oldColumns.length &&\n newColumns.every((column) => oldColumns.includes(column))\n );\n }\n\n private haveSameAggregateFields(\n newAggregates: ColumnAggregate[],\n oldAggregates: ColumnAggregate[]\n ) {\n const oldAggregateFields = oldAggregates?.map((a) => a.field) || [];\n\n return (\n newAggregates?.length === oldAggregates?.length &&\n !!newAggregates?.every((a) => oldAggregateFields.includes(a.field))\n );\n }\n\n private init() {\n if (this.tabulator) {\n this.pool.releaseAll();\n this.tabulator.destroy();\n this.initialized = false;\n }\n\n const table: HTMLElement =\n this.host.shadowRoot.querySelector('#tabulator-table');\n this.initTabulatorComponent(table);\n }\n\n /*\n * Tabulator requires that the html element it's rendered inside\n * has a size before it's created, otherwise it doesn't consider\n * it self renderedy completely. (the callback \"renderComplete\"\n * is never run).\n *\n * @param table {HTMLElement}\n *\n */\n private initTabulatorComponent(table: HTMLElement) {\n // Some browsers do not implement the ResizeObserver API...\n // If that's the case lets just create the table no\n // matter if its rendered or not.\n if (!('ResizeObserver' in window)) {\n this.tabulator = this.createTabulator(table);\n this.setSelection();\n\n return;\n }\n\n this.resizeObserver = new ResizeObserver(() => {\n requestAnimationFrame(() => {\n if (this.destroyed) {\n return;\n }\n\n this.tabulator = this.createTabulator(table);\n this.setSelection();\n this.resizeObserver?.unobserve(table);\n this.resizeObserver?.disconnect();\n });\n });\n this.resizeObserver.observe(table);\n }\n\n private createTabulator(table: HTMLElement): Tabulator {\n const tabulator = new TabulatorFull(table, this.getOptions());\n tabulator.on('rowClick', this.onClickRow);\n tabulator.on('dataSorting', this.handleDataSorting);\n tabulator.on('pageLoaded', this.handlePageLoaded);\n tabulator.on('columnMoved', this.handleMoveColumn);\n tabulator.on('renderComplete', this.handleRenderComplete);\n tabulator.on('tableBuilt', () => {\n if (this.destroyed) {\n tabulator.destroy();\n\n return;\n }\n\n this.initialized = true;\n if (this.isRemoteMode() && !this.data?.length) {\n this.tabulator.setData();\n } else if (!this.isRemoteMode()) {\n this.updateData(this.data, []);\n }\n });\n\n return tabulator;\n }\n\n private initTableSelection() {\n if (this.selectable) {\n this.tableSelection = new TableSelection(\n () => this.tabulator,\n this.pool,\n this.select,\n (key: string) => this.getTranslation(key)\n );\n this.tableSelection.setSelection(this.selection);\n }\n }\n\n private setSelection() {\n if (!(this.tabulator && this.tableSelection)) {\n return;\n }\n\n this.tableSelection.setSelection(this.selection);\n }\n\n private updateMaxPage() {\n this.tabulator?.setMaxPage(this.calculatePageCount());\n }\n\n private getOptions(): TabulatorOptions {\n const ajaxOptions = this.getAjaxOptions();\n const paginationOptions = this.getPaginationOptions();\n const columnOptions = this.getColumnOptions();\n\n return {\n data: this.data,\n layout: mapLayout(this.layout),\n columns: this.getColumnDefinitions(),\n ...ajaxOptions,\n ...paginationOptions,\n rowFormatter: this.formatRow,\n initialSort: this.getInitialSorting(),\n nestedFieldSeparator: false,\n ...columnOptions,\n };\n }\n\n private getInitialSorting(): TabulatorSorter[] {\n if (this.currentSorting && this.currentSorting.length > 0) {\n return this.getColumnSorter(this.currentSorting);\n }\n\n return this.getColumnSorter(this.sorting);\n }\n\n private getColumnSorter(sorting: ColumnSorter[]): TabulatorSorter[] {\n return sorting.map((sorter: ColumnSorter) => {\n return {\n column: String(sorter.column.field),\n dir: sorter.direction.toLocaleLowerCase() as TabulatorSortDirection,\n };\n });\n }\n\n private getColumnDefinitions(): TabulatorColumnDefinition[] {\n const columnDefinitions = this.columns\n .map(this.addColumnAggregator)\n .map((column) => {\n const definition = this.columnFactory.create(column);\n const columnSortable = column.headerSort ?? true;\n definition.headerSort = this.sortableColumns && columnSortable;\n\n return definition;\n });\n\n if (this.tableSelection) {\n return this.tableSelection.getColumnDefinitions(columnDefinitions);\n }\n\n return columnDefinitions;\n }\n\n private addColumnAggregator(column: Column<any>): Column<any> {\n if (!this.aggregates?.length || column.aggregator) {\n return column;\n }\n\n const aggregate = this.aggregates.find((a) => a.field === column.field);\n if (aggregate) {\n column.aggregator = (col?: Column) => {\n if (!col) {\n return;\n }\n\n const value = this.aggregates.find(\n (a) => a.field === col.field\n )?.value;\n\n if (col.formatter) {\n return col.formatter(value);\n }\n\n return value;\n };\n }\n\n return column;\n }\n\n private getAjaxOptions(): TabulatorOptionsData {\n if (!this.isRemoteMode()) {\n return {};\n }\n\n // Tabulator needs a URL to be set, even though this one will never be\n // used since we have our own custom `ajaxRequestFunc`\n const remoteUrl = 'https://localhost';\n\n return {\n ajaxSorting: true,\n ajaxURL: remoteUrl,\n ajaxRequestFunc: this.requestData,\n ajaxRequesting: this.handleAjaxRequesting,\n };\n }\n\n private handleAjaxRequesting() {\n return !this.destroyed;\n }\n\n private getPaginationOptions(): TabulatorOptionsPagination {\n if (!this.pageSize) {\n return {};\n }\n\n return {\n pagination: true,\n paginationMode: this.isRemoteMode() ? 'remote' : 'local',\n paginationSize: this.pageSize,\n paginationInitialPage: this.page,\n };\n }\n\n private requestData(_, __, params: any): Promise<object> {\n if (this.destroyed) {\n return Promise.reject();\n }\n\n const sorters = params.sorters ?? [];\n const currentPage = params.page ?? FIRST_PAGE;\n\n if (this.page !== currentPage) {\n this.changePage.emit(currentPage);\n }\n\n const columnSorters = sorters.map(createColumnSorter(this.columns));\n\n const load = {\n page: currentPage,\n sorters: columnSorters,\n };\n\n // In order to make limel-table behave more like a controlled component,\n // we always return the existing data from this function, therefore\n // relying on the consumer component to handle the loading\n // state via the loading prop, if it actually decides to load new data.\n const resolveExistingData = Promise.resolve({\n last_page: this.calculatePageCount(),\n data: this.data,\n });\n\n if (!isEqual(this.currentLoad, load)) {\n this.currentSorting = columnSorters;\n this.currentLoad = load;\n this.load.emit(load);\n }\n\n return resolveExistingData;\n }\n\n private isRemoteMode(): boolean {\n return this.mode === 'remote';\n }\n\n private handleDataSorting(sorters: TabulatorSorterFromTable[]): void {\n if (this.isRemoteMode()) {\n return;\n }\n\n const columnSorters = sorters.map(createColumnSorter(this.columns));\n if (columnSorters.length === 0) {\n return;\n }\n\n this.sort.emit(columnSorters);\n }\n\n private handlePageLoaded(page: number): void {\n if (this.isRemoteMode()) {\n return;\n }\n\n this.changePage.emit(page);\n }\n\n private handleRenderComplete(): void {\n if (this.tabulator && this.shouldSort) {\n this.shouldSort = false;\n this.tabulator.setSort(this.getColumnSorter(this.sorting));\n }\n }\n\n private onClickRow(event: PointerEvent, row: TabulatorRowComponent): void {\n if (row.getPosition === undefined) {\n // Not a data row, probably a CalcComponent\n return;\n }\n\n if (event.defaultPrevented) {\n return;\n }\n\n if (this.isActiveRow(row)) {\n this.activeRow = null;\n } else {\n this.activeRow = row.getData();\n }\n\n this.activate.emit(this.activeRow);\n }\n\n private readonly getActiveRows: () => TabulatorRowComponent[] = () => {\n if (!this.tabulator) {\n return [];\n }\n\n return this.tabulator.getRows('active');\n };\n\n private getActiveRowsData: () => object[] = () => {\n // Note: Tabulator.getData() creates copies of each data object\n // and will break this.selection.has checks, hence why this function\n // intentionally retrieves the data using the row components\n return this.getActiveRows().map((row) => row.getData());\n };\n\n private selectAllOnChange = (ev: CustomEvent<boolean>) => {\n const selectAll = ev.detail;\n\n ev.stopPropagation();\n ev.preventDefault();\n\n const newSelection = selectAll ? this.getActiveRowsData() : [];\n this.select.emit(newSelection);\n this.tableSelection.setSelection(newSelection);\n this.selectAll.emit(selectAll);\n };\n\n private formatRows() {\n // eslint-disable-next-line unicorn/no-array-for-each\n this.tabulator.getRows().forEach(this.formatRow);\n }\n\n private formatRow(row: TabulatorRowComponent) {\n if (this.isActiveRow(row)) {\n row.getElement().classList.add('active');\n } else {\n row.getElement().classList.remove('active');\n }\n\n const interactiveFeedbackElement = row\n .getElement()\n .querySelectorAll('.interactive-feedback');\n if (interactiveFeedbackElement.length === 0) {\n const element = row.getElement().ownerDocument.createElement('div');\n element.classList.add('interactive-feedback');\n row.getElement().prepend(element);\n }\n }\n\n private isActiveRow(row: TabulatorRowComponent) {\n if (!this.activeRow) {\n return false;\n }\n\n const activeRowId = this.activeRow.id ?? null;\n\n if (activeRowId !== null) {\n return activeRowId === row.getData().id;\n }\n\n return this.activeRow === row.getData();\n }\n\n private calculatePageCount(): number {\n let total = this.totalRows;\n if (!total) {\n total = this.data.length;\n }\n\n return Math.ceil(total / this.pageSize);\n }\n\n private hasAggregation(columns: Column[]): boolean {\n return columns.some((column) => has(column, 'aggregator'));\n }\n\n private readonly getColumnOptions = (): TabulatorOptionsColumns => {\n if (!this.movableColumns) {\n return {};\n }\n\n return {\n movableColumns: true,\n };\n };\n\n private readonly handleMoveColumn = (\n _,\n components: TabulatorColumnComponent[]\n ) => {\n if (!this.movableColumns) {\n return;\n }\n\n const columns = components.map(this.findColumn).filter(Boolean);\n this.changeColumns.emit(columns);\n };\n\n private readonly findColumn = (\n component: TabulatorColumnComponent\n ): Column => {\n return this.columns.find((column) => {\n return (\n column.field === component.getField() &&\n column.title === component.getDefinition().title\n );\n });\n };\n\n render() {\n const totalRows = this.totalRows ?? this.data.length;\n\n return (\n <Host\n class={{\n 'has-low-density': this.layout === 'lowDensity',\n 'has-pagination-on-top': this.paginationLocation === 'top',\n }}\n >\n <div\n id=\"tabulator-container\"\n class={{\n 'has-pagination': totalRows > this.pageSize,\n 'has-aggregation': this.hasAggregation(this.columns),\n 'has-movable-columns': this.movableColumns,\n 'has-rowselector': this.selectable,\n 'has-selection': this.tableSelection?.hasSelection,\n }}\n >\n {/* Toggle style instead of removing the loader\n because removing the element will cause a rerender, breaking the\n tabulator table */}\n <div\n id=\"tabulator-loader\"\n style={{ display: this.loading ? 'flex' : 'none' }}\n >\n <limel-spinner size=\"large\" />\n </div>\n {this.renderEmptyMessage()}\n {this.renderSelectAll()}\n <div id=\"tabulator-table\" />\n </div>\n </Host>\n );\n }\n\n private renderSelectAll() {\n if (!this.selectable) {\n return;\n }\n\n const showSelectAll = !this.loading && this.tableSelection;\n\n return (\n <div\n class=\"select-all\"\n style={{ display: showSelectAll ? 'inline-block' : 'none' }}\n >\n <limel-checkbox\n class=\"hide-label\"\n onChange={this.selectAllOnChange}\n disabled={this.data.length === 0}\n checked={this.tableSelection?.hasSelection}\n indeterminate={\n this.tableSelection?.hasSelection &&\n this.selection?.length < this.data.length\n }\n label={this.getTranslation('table.select-all')}\n />\n </div>\n );\n }\n\n private renderEmptyMessage() {\n const showEmptyMessage =\n !this.loading && this.data.length === 0 && this.emptyMessage;\n\n return (\n <div\n id=\"tabulator-empty-text\"\n style={{ display: showEmptyMessage ? 'flex' : 'none' }}\n >\n <span>{this.emptyMessage}</span>\n </div>\n );\n }\n\n private getTranslation = (key: string) => {\n return translate.get(key, this.language);\n };\n}\n"],"mappings":"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"}