(function($){function wpDataTablesExcelPlugin(hotInstance){Handsontable.plugins.BasePlugin.call(this,hotInstance);this._superClass=Handsontable.plugins.BasePlugin;this.originals={};this.originals.getCopyableData=hotInstance.getCopyableData;this.table_id=hotInstance.rootElement.id;this.tableDrawRequests=0;this.tableDrawResponses=0;this.tableSettings={};this.$SEARCH_FIELD=$('#'+this.table_id+'_search_filter input');this.loadLanguages()}
wpDataTablesExcelPlugin.prototype=Object.create(Handsontable.plugins.BasePlugin.prototype,{constructor:{writable:!0,configurable:!0,value:wpDataTablesExcelPlugin},});wpDataTablesExcelPlugin.prototype.isEnabled=function(){return!!this.hot.getSettings().wpDataTablesExcelPlugin};wpDataTablesExcelPlugin.prototype.enablePlugin=function(){this.overrideHotFunctions();for(var lang in this.languages){numeral.language(lang,this.languages[lang])}
var tableDescription={};var description_element_id=$(this.hot.rootElement).data('described-by');if(description_element_id&&($descriptionElement=$('#'+description_element_id))){tableDescription=JSON.parse($descriptionElement.val());this.tableSettings=tableDescription.dataTableParams;delete tableDescription.dataTableParams}
for(var prop in tableDescription){this[prop]=tableDescription[prop]}
this.tableSettings.language='en-'+this.tableSettings.number_format;for(var i=0;i<this.tableSettings.columns.length;i++){if(this.tableSettings.columns[i].type=='wdt.date'){this.tableSettings.columns[i].sortFunction=this.sortDate}
if(this.serverSide){this.setCellValidator(this.tableSettings.columns[i])}}
if(this.serverSide){this.tableSettings.minSpareRows=1;this.addContextMenuItems();Handsontable.Search.global.setDefaultCallback(this.wdtExcelSearchCallback);this.addHook('afterChange',this.onAfterChange.bind(this));this.addHook('init',this.onInit.bind(this));this.addHook('afterValidate',this.onAfterValidate.bind(this))}else{this.tableSettings.data=JSON.parse($(tableDescription.selector+'_data').val());this.addHook('init',this.onInit.bind(this))}
this.addHook('beforeAutofill',this.onBeforeAutofill);this.addHook('beforeValidate',this.onBeforeValidate);this.addHook('beforeChange',this.onBeforeChange);if(typeof wpDtExcelTables[this.table_id]=='object'){$.extend(!0,this.tableSettings,wpDtExcelTables[this.table_id])}
this._superClass.prototype.enablePlugin.call(this)};wpDataTablesExcelPlugin.prototype.overrideHotFunctions=function(){var getCopyableDataOriginal=this.originals.getCopyableData;this.hot.getCopyableData=function(row,column){var cellMeta=this.getCellMeta(row,column);var value=getCopyableDataOriginal.apply(this,arguments);if(cellMeta.type=='numeric'){value=numeral(value).format(cellMeta.format)}else if(cellMeta.type=='wdt.date'){value=moment(value,cellMeta.dataSourceDateFormat).format(cellMeta.displayDateFormat)}
return value}};wpDataTablesExcelPlugin.prototype.revertOverriddenHotFunctions=function(){this.hot.getCopyableData=this.originals.getCopyableData};wpDataTablesExcelPlugin.prototype.initTableSettings=function(){this.hot.updateSettings(this.tableSettings)};wpDataTablesExcelPlugin.prototype.disablePlugin=function(){this.revertOverriddenHotFunctions();this.tableDrawRequests=0;this.tableDrawResponses=0;this.tableSettings={};this.removeEvents();this.removeHook('beforeAutofill',this.onBeforeAutofill);this.removeHook('beforeValidate',this.onBeforeValidate);this.removeHook('beforeChange',this.onBeforeChange);this._superClass.prototype.disablePlugin.call(this)};wpDataTablesExcelPlugin.prototype.updatePlugin=function(){this._superClass.prototype.updatePlugin.call(this)};wpDataTablesExcelPlugin.prototype.destroy=function(){this._superClass.prototype.destroy.call(this)};wpDataTablesExcelPlugin.prototype.initEvents=function(){var hotElement=this.hot.rootElement;if(this.serverSide){$(hotElement).on('click.wpExcelTable','a.wdt_link_editable',function(e){e.preventDefault();if(e.ctrlKey){window.open($(this).attr('href'),$(this).attr('target'))}});$(hotElement).on('click.wpExcelTable','a.wdt_email_editable',function(e){e.preventDefault();if(e.ctrlKey){location.href=$(this).attr('href')}})}};wpDataTablesExcelPlugin.prototype.initSearch=function(){var hotInstance=this.hot;var hotSettings=hotInstance.getSettings();if(hotSettings.search){this.$SEARCH_FIELD.on('keyup.wpExcelTable search.wpExcelTable',function(e){hotInstance.search.query(this.value);hotInstance.render()});if(hotSettings.searchDefaultValue){this.$SEARCH_FIELD.val(hotSettings.searchDefaultValue)}}};wpDataTablesExcelPlugin.prototype.removeEvents=function(){var hotElement=this.hot.rootElement;$(hotElement).off('click.wpExcelTable','.wpExcelTable a.wdt_link_editable');$(hotElement).off('click.wpExcelTable','.wpExcelTable a.wdt_email_editable');this.$SEARCH_FIELD.off('keyup.wpExcelTable search.wpExcelTable')};wpDataTablesExcelPlugin.prototype.getCellValidatorByName=function(validator_name){var validator=validator_name.replace(/(?:(wdt)\.)?(.+)/,function(match,p1,p2){if(!p2){return null}
p1=p1||'';return p1+p2.charAt(0).toUpperCase()+p2.slice(1)+'Validator'});if(validator&&Handsontable[validator]){return Handsontable[validator]}else{return null}};wpDataTablesExcelPlugin.prototype.setCellValidator=function(cell_options){var cell_validator_name=cell_options.validator;if(cell_validator_name){var cell_validator=this.getCellValidatorByName(cell_validator_name);if(cell_validator){if(cell_options.type=='dropdown'||cell_options.type=='wdt.multi-select'){cell_options.cell_validator=cell_validator;delete cell_options.validator}else{cell_options.validator=cell_validator}}}};wpDataTablesExcelPlugin.prototype.getRemoteTableData=function(){var excelPlugin=this;var hotInstance=this.hot;var tableSettings=hotInstance.getSettings();if(!tableSettings.serverSide){return}
var ajaxSettings=tableSettings.ajax;var colsSettings=tableSettings.columns;var table_sorting=tableSettings.columnSorting;var orderable=Boolean(table_sorting);var columns=[];for(var i=0;i<colsSettings.length;i++){var column={data:i,name:colsSettings[i].data,searchable:colsSettings[i].search,orderable:orderable,};columns.push(column)}
var ajax_params={draw:excelPlugin.tableDrawRequests+1,table:'excel',columns:columns,start:0,length:-1,wdtNonce:$('#wdtNonceFrontendEdit_'+excelPlugin.tableWpId).val()};if(orderable){var columns_order=[];var order_column=table_sorting.column;var order_direction=(table_sorting.sortOrder)?'asc':'desc';var order={column:order_column,dir:order_direction};columns_order.push(order);ajax_params.order=columns_order}
var ajax={data:ajax_params,dataType:'json',success:function(response){if(!response.draw){return}
if(response.draw>excelPlugin.tableDrawResponses){excelPlugin.tableDrawResponses=response.draw;hotInstance.loadData(response.data)}},error:function(response){console.log(response)},beforeSend:function(jqXHR,settings){excelPlugin.tableDrawRequests++;excelPlugin.toggleTableOverlay('show')},complete:function(){excelPlugin.toggleTableOverlay('hide')}};$.extend(ajaxSettings,ajax);$.ajax(ajaxSettings)};wpDataTablesExcelPlugin.prototype.loadLanguages=function(){var languages={};languages.en={delimiters:{thousands:',',decimal:'.'},abbreviations:{thousand:'k',million:'m',billion:'b',trillion:'t'},ordinal:function(number){var b=number%10;return(~~(number%100/10)===1)?'th':(b===1)?'st':(b===2)?'nd':(b===3)?'rd':'th'},currency:{symbol:'$'}};languages['en-1']=$.extend(!0,{},languages.en);languages['en-1'].delimiters.thousands='.';languages['en-1'].delimiters.decimal=',';languages['en-2']=$.extend(!0,{},languages.en);this.languages=languages};wpDataTablesExcelPlugin.prototype.queryDateCell=function(instance,row,col,data){var table_settings=instance.getSettings();var searchVal=this.$SEARCH_FIELD.val();var dateToMatch=moment(data,table_settings.dataSourceDateFormat).format(table_settings.displayDateFormat);return Handsontable.Search.DEFAULT_QUERY_METHOD(searchVal,dateToMatch)};wpDataTablesExcelPlugin.prototype.wdtExcelSearchCallback=function(instance,row,col,data,testResult){var cellMeta=instance.getCellMeta(row,col);if(cellMeta.renderer=='wdt.date'&&!testResult){cellMeta.isSearchResult=instance.getPlugin('WpDataTablesExcelPlugin').queryDateCell(instance,row,col,data)}else{Handsontable.Search.DEFAULT_CALLBACK.apply(this,arguments)}};wpDataTablesExcelPlugin.prototype.prepareDataToSaveRemote=function(changes){var tableSettings=this.hot.getSettings();var id_column_prop=tableSettings.idColumnKey;var rows_changed_cells=[],changed_rows=[],changed_rows_data=[],cell_row,cell_prop,cell_old_value,cell_new_value;for(var i=0;i<changes.length;i++){cell_row=changes[i][0];cell_prop=changes[i][1];cell_old_value=changes[i][2];cell_new_value=changes[i][3];if(cell_old_value!=cell_new_value){if(typeof rows_changed_cells[cell_row]=='undefined'){var id_column_val=this.hot.getDataAtRowProp(cell_row,id_column_prop);var ajax_cell_data={};ajax_cell_data[id_column_prop]=id_column_val;ajax_cell_data[cell_prop]=cell_new_value;rows_changed_cells[cell_row]=ajax_cell_data}else{rows_changed_cells[cell_row][cell_prop]=cell_new_value}}
if($.inArray(cell_row,changed_rows)==-1){var row_data=this.hot.getSourceDataAtRow(cell_row);changed_rows_data.push(row_data);changed_rows.push(cell_row)}}
if(rows_changed_cells.length>0){var tmp_rows=[];for(var row in rows_changed_cells){tmp_rows.push(rows_changed_cells[row])}
rows_changed_cells=tmp_rows}
return{cells:rows_changed_cells,rows:changed_rows_data}};var preventEventPropagation=function(event){event.stopImmediatePropagation();event.preventDefault()};wpDataTablesExcelPlugin.prototype.toggleTableOverlay=function(action){var hotInstance=this.hot;if(action=='show'){$(hotInstance.rootElement).find('table.htCore').addClass('overlayed_elm');hotInstance.addHook('beforeKeyDown',preventEventPropagation)}else if(action=='hide'){$(hotInstance.rootElement).find('table.htCore').removeClass('overlayed_elm');hotInstance.removeHook('beforeKeyDown',preventEventPropagation)}};wpDataTablesExcelPlugin.prototype.saveChangesRemote=function(changes){var tableSettings=this.hot.getSettings();var wpdatatable_id=this.tableWpId;var formatted_changes=this.prepareDataToSaveRemote(changes);var changed_cells=formatted_changes.cells;var changed_rows=formatted_changes.rows;var excelPlugin=this;if(changed_cells.length>0){var ajax_data={action:'wdt_save_table_cells_frontend',wdtNonce:$('#wdtNonceFrontendEdit_'+wpdatatable_id).val(),table_id:wpdatatable_id,cells:changed_cells,rows:changed_rows};$.ajax({url:tableSettings.adminAjaxBaseUrl,type:'POST',dataType:'json',data:ajax_data,success:function(return_data){excelPlugin.toggleTableOverlay('hide');if(return_data.error.length>0||return_data.has_new){excelPlugin.getRemoteTableData()}
if(return_data.error.length>0){alert(return_data.error)}else if(return_data.formula_cells){excelPlugin.applyCellsData(return_data.formula_cells,'updateFormulaValues')}},error:function(return_data){excelPlugin.toggleTableOverlay('hide');alert(return_data.error);excelPlugin.getRemoteTableData()},beforeSend:function(){excelPlugin.toggleTableOverlay('show')}})}};wpDataTablesExcelPlugin.prototype.applyCellsData=function(rows,source){if(rows.length==0){return}
var apply_data=[];var htInstance=this.hot;var idColProp=htInstance.getSettings().idColumnKey;var rowsCount=htInstance.countRows();for(var iRow=0;iRow<rowsCount;iRow++){var idColVal=htInstance.getDataAtRowProp(iRow,idColProp);for(var i=0;i<rows.length;i++){var row=rows[i];if(row[idColProp]==idColVal){for(var col in row){if(col!=idColProp){apply_data.push([iRow,col,row[col]])}}}}}
if(apply_data.length>0){htInstance.setDataAtRowProp(apply_data,source)}};wpDataTablesExcelPlugin.prototype.onAfterChange=function(changes,source){if(source!=='loadData'&&source!=='updateFormulaValues'){this.saveChangesRemote(changes)}
var hotInstance=this.hot;if(hotInstance.getSettings().search){hotInstance.search.query(this.$SEARCH_FIELD.val());hotInstance.render()}};wpDataTablesExcelPlugin.prototype.onInit=function(){this.initTableSettings();this.initEvents();this.initSearch();this.getRemoteTableData()};wpDataTablesExcelPlugin.prototype.onAfterValidate=function(isValid,value,row,prop,source){var $active_element=$(document.activeElement);var $parent_element=void 0;if($active_element.is(':input')){$parent_element=$active_element.closest('#'+this.hot.rootElement.id+' > div')}
if(!$parent_element){return}
if(!$parent_element.next('div.tooltip:visible ').length){$parent_element.attr('title','');$parent_element.tooltip({title:wpdatatables_frontend_strings.invalid_value})}
if(!isValid){$parent_element.addClass('invalid_editor_value');$parent_element.tooltip('show')}else{$parent_element.removeClass('invalid_editor_value');$parent_element.tooltip('destroy')}};wpDataTablesExcelPlugin.prototype.onBeforeAutofill=function(start,end,data){for(var r=0;r<data.length;r++){for(var c=0;c<data[r].length;c++){var columnSettings=this.getCellMeta(start.row+r,start.col+c);if(columnSettings.type=='numeric'){if(numeral.validate(data[r][c])){data[r][c]=numeral(data[r][c]).format(columnSettings.format)}}}}};wpDataTablesExcelPlugin.prototype.onBeforeValidate=function(value,row,prop,source){return prepareWdtDateColumnValidate.apply(this,arguments)};var prepareWdtDateColumnValidate=function(value,row,prop,source){var col_index=this.propToCol(prop);var col_type=this.getDataType(row,col_index,row,col_index);if(col_type=='wdt.date'){if(!value){return''}
if(source!='paste'){var tableSettings=this.getSettings();value=moment(value,tableSettings.dataSourceDateFormat).format(tableSettings.displayDateFormat)}
return value}};wpDataTablesExcelPlugin.prototype.onBeforeChange=function(changes,source){for(var i=0;i<changes.length;i++){var col_index=this.propToCol(changes[i][1]);var cellMeta=this.getCellMeta(changes[i][0],col_index);if(cellMeta.type=='wdt.date'&&source=='paste'){changes[i][3]=moment(changes[i][3],cellMeta.displayDateFormat).format(cellMeta.dataSourceDateFormat)}}};wpDataTablesExcelPlugin.prototype.addNewTableRow=function(itemKey,opt){var lastSeletedCol=opt.end.col;var emptyRowsBottomCnt=this.countEmptyRows(!0);var rowsCount=this.countRows();if(emptyRowsBottomCnt>0){var lastRow=rowsCount-1;this.selectCell(lastRow,lastSeletedCol,lastRow,lastSeletedCol)}else{var emptyRowsCnt=this.countEmptyRows(!1);if(emptyRowsCnt>0){for(var row=0;row<rowsCount;row++){if(this.isEmptyRow(row)){this.selectCell(row,lastSeletedCol,row,lastSeletedCol);return}}}else{this.alter('insert_row')}}};wpDataTablesExcelPlugin.prototype.deleteTableRows=function(itemKey,opt){var startRow=opt.start.row;var endRow=opt.end.row;var tableSettings=this.getSettings();var idColProp=tableSettings.idColumnKey;var idColIndex=this.propToCol(idColProp);var deleteRowsData=this.getData(startRow,idColIndex,endRow,idColIndex);var deleteRowIds=[];for(var i=0;i<deleteRowsData.length;i++){var rowId=deleteRowsData[i][0];if(rowId){deleteRowIds.push(deleteRowsData[i][0])}}
if(deleteRowIds.length>0){var excelPlugin=this.getPlugin('wpDataTablesExcelPlugin');var wpdatatable_id=excelPlugin.tableWpId;var deleteRows={};deleteRows[idColProp]=deleteRowIds;var ajax_data={action:'wdt_delete_table_rows',table_id:wpdatatable_id,rows:deleteRows,wdtNonce:$('#wdtNonceFrontendEdit_'+wpdatatable_id).val()};$.ajax({type:'POST',url:tableSettings.adminAjaxBaseUrl,data:ajax_data,dataType:'json',success:function(response){excelPlugin.toggleTableOverlay('hide');if(response.error.length>0){excelPlugin.getRemoteTableData()}else if(response.success.length>0){for(var rowIdx=startRow;rowIdx<=endRow;rowIdx++){this.alter('remove_row',rowIdx)}}else{excelPlugin.getRemoteTableData()}},error:function(response){excelPlugin.toggleTableOverlay('hide');console.log(response);excelPlugin.getRemoteTableData()},beforeSend:function(){excelPlugin.toggleTableOverlay('show')}})}};wpDataTablesExcelPlugin.prototype.addContextMenuItems=function(){this.contextMenu={items:{'add_row':{name:'New row',callback:this.addNewTableRow,},'remove_row':{name:'Delete row(s)',callback:this.deleteTableRows,disabled:function(){var selectedRange=this.getSelected();return(selectedRange[0]==selectedRange[2]&&this.isEmptyRow(selectedRange[0]))}}}};this.tableSettings.contextMenu=this.contextMenu};wpDataTablesExcelPlugin.prototype.sortDate=function(sortOrder){var direction=(sortOrder)?1:-1;return function(a,b){var date1=moment(a[1],"YYYY-MM-DD");var date2=moment(b[1],"YYYY-MM-DD");var value;if(!date1.isValid()&&!date2.isValid()){value=0}else if(!date1.isValid()){value=-1}else if(!date2.isValid()){value=1}else{value=date1.valueOf()-date2.valueOf()}
return direction*value}};wpDataTablesExcelPlugin.prototype.removeContextMenuItems=function(){};Handsontable.plugins.registerPlugin('wpDataTablesExcelPlugin',wpDataTablesExcelPlugin)})(jQuery) |