UNPKG

ng-grid

Version:

__Contributors:__

66 lines (64 loc) 3.09 kB
// Todo: // 1) Make the button prettier // 2) add a config option for IE users which takes a URL. That URL should accept a POST request with a // JSON encoded object in the payload and return a CSV. This is necessary because IE doesn't let you // download from a data-uri link // // Notes: This has not been adequately tested and is very much a proof of concept at this point ngGridCsvExportPlugin = function(opts) { var self = this; self.grid = null; self.scope = null; self.init = function(scope, grid, services) { self.grid = grid; self.scope = scope; function showDs() { var keys = []; for (var f in grid.config.columnDefs) { keys.push(grid.config.columnDefs[f].field);} var csvData = ''; function csvStringify(str) { if (str == null) return ''; // we want to catch anything null-ish, hence just == not === if (typeof(str) === 'number') return '' + str; if (typeof(str) === 'boolean') return (str ? 'TRUE' : 'FALSE') ; if (typeof(str) === 'string') return str.replace(/"/g,'""'); return JSON.stringify(str).replace(/"/g,'""'); } function swapLastCommaForNewline(str) { var newStr = str.substr(0,str.length - 1); return newStr + "\n"; } for (var k in keys) { csvData += '"' + csvStringify(keys[k]) + '",'; } csvData = swapLastCommaForNewline(csvData); var gridData = grid.sortedData; for (var gridRow in gridData) { for ( k in keys) { var curCellRaw; if (opts != null && opts.columnOverrides != null && opts.columnOverrides[keys[k]] != null) { curCellRaw = opts.columnOverrides[keys[k]](gridData[gridRow][keys[k]]); } else { curCellRaw = gridData[gridRow][keys[k]]; } csvData += '"' + csvStringify(curCellRaw) + '",'; } csvData = swapLastCommaForNewline(csvData); } var fp = grid.$root.find(".ngFooterPanel"); var csvDataLinkPrevious = grid.$root.find('.ngFooterPanel .csv-data-link-span'); if (csvDataLinkPrevious != null) {csvDataLinkPrevious.remove() ; } var csvDataLinkHtml = "<span class=\"csv-data-link-span\">"; csvDataLinkHtml += "<br><a href=\"data:text/csv;charset=UTF-8,"; csvDataLinkHtml += encodeURIComponent(csvData); csvDataLinkHtml += "\">CSV Export</a></br></span>" ; fp.append(csvDataLinkHtml); } setTimeout(showDs, 0); scope.catHashKeys = function() { hash = ''; for (idx in scope.renderedRows) { hash += scope.renderedRows[idx].$$hashKey; } return hash; }; scope.$watch('catHashKeys()', showDs); }; };