From cfb5466d302750bf55d5fbceaa2a6860066bd7d5 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Fri, 14 Sep 2012 18:12:17 +0530 Subject: [PATCH] added export to reports using downloadify --- .../page/general_ledger/general_ledger.js | 90 ++++++++++++------- .../home/page/attributions/attributions.html | 1 + erpnext/startup/report_data_map.py | 4 +- public/css/all-app.css | 12 +++ public/css/all-web.css | 12 +++ public/js/all-app.js | 35 ++++++-- public/js/all-web.js | 14 +-- 7 files changed, 116 insertions(+), 52 deletions(-) diff --git a/erpnext/accounts/page/general_ledger/general_ledger.js b/erpnext/accounts/page/general_ledger/general_ledger.js index d395612816..3a17f5c0f8 100644 --- a/erpnext/accounts/page/general_ledger/general_ledger.js +++ b/erpnext/accounts/page/general_ledger/general_ledger.js @@ -6,60 +6,82 @@ wn.pages['general-ledger'].onload = function(wrapper) { }); erpnext.general_ledger = new wn.views.GridReport({ + title: "General Ledger", parent: $(wrapper).find('.layout-main'), appframe: wrapper.appframe, doctypes: ["Company", "Account", "GL Entry"], - filters: [ - {fieldtype:"Select", label: "Company", options:"Company", - filter: function(val, item) { - return item.company == val || val == "Select Company"; - }}, - {fieldtype:"Select", label: "Account", options:"Account", - filter: function(val, item) { - return item.account == val || val == "Select Account"; - }}, - {fieldtype:"Date", label: "From Date"}, - {fieldtype:"Label", label: "To"}, - {fieldtype:"Date", label: "To Date"}, - {fieldtype:"Button", label: "Refresh"}, - ], setup: function() { this.setup_filters(); this.setup_columns(); }, - setup_filters: function() { - var me = this; - // default filters - this.filter_inputs.company.val(sys_defaults.company); - this.filter_inputs.from_date.val(dateutil.str_to_user(sys_defaults.year_start_date)); - this.filter_inputs.to_date.val(dateutil.str_to_user(sys_defaults.year_end_date)); - this.filter_inputs.refresh.click(function() { me.refresh(); }) - }, setup_columns: function() { this.columns = [ {id: "posting_date", name: "Posting Date", field: "posting_date", width: 100, formatter: this.date_formatter}, - {id: "account", name: "Account", field: "account", width: 240}, + {id: "account", name: "Account", field: "account", width: 240, + link_formatter: { + filter_input: "account", + open_btn: true, + doctype: '"Account"' + }}, {id: "debit", name: "Debit", field: "debit", width: 100, formatter: this.currency_formatter}, {id: "credit", name: "Credit", field: "credit", width: 100, formatter: this.currency_formatter}, + {id: "voucher_type", name: "Voucher Type", field: "voucher_type", width: 120}, + {id: "voucher_no", name: "Voucher No", field: "voucher_no", width: 160, + link_formatter: { + filter_input: "voucher_no", + open_btn: true, + doctype: "dataContext.voucher_type" + }}, + {id: "remarks", name: "Remarks", field: "remarks", width: 200, + formatter: this.text_formatter}, + ]; }, + filters: [ + {fieldtype:"Select", label: "Company", options:"Company", default_value: "Select Company...", + filter: function(val, item, opts) { + return item.company == val || val == opts.default_value; + }}, + {fieldtype:"Select", label: "Account", options:"Account", default_value: "Select Account...", + filter: function(val, item, opts) { + return item.account == val || val == opts.default_value; + }}, + {fieldtype:"Data", label: "Voucher No", + filter: function(val, item, opts) { + if(!val) return true; + return item.voucher_no.indexOf(val)!=-1; + }}, + {fieldtype:"Date", label: "From Date", filter: function(val, item) { + return dateutil.user_to_obj(val) <= dateutil.str_to_obj(item.posting_date); + }}, + {fieldtype:"Label", label: "To"}, + {fieldtype:"Date", label: "To Date", filter: function(val, item) { + return dateutil.user_to_obj(val) >= dateutil.str_to_obj(item.posting_date); + }}, + {fieldtype:"Button", label: "Refresh", icon:"icon-refresh icon-white", cssClass:"btn-info"}, + {fieldtype:"Button", label: "Reset Filters"} + ], + setup_filters: function() { + var me = this; + // default filters + this.init_filter_values(); + this.filter_inputs.refresh.click(function() { me.set_route(); }) + this.filter_inputs.reset_filters.click(function() { me.init_filter_values(); me.set_route(); }) + }, + init_filter_values: function() { + this.filter_inputs.company.val(sys_defaults.company); + this.filter_inputs.from_date.val(dateutil.str_to_user(sys_defaults.year_start_date)); + this.filter_inputs.to_date.val(dateutil.str_to_user(sys_defaults.year_end_date)); + this.filter_inputs.voucher_no.val(""); + this.filter_inputs.account.get(0).selectedIndex = 0; + }, prepare_data: function() { this.prepare_data_view(wn.report_dump.data["GL Entry"]); }, - dataview_filter: function(item) { - var filters = wn.cur_grid_report.filter_inputs; - for (i in filters) { - var filter = filters[i].get(0); - if(filter.opts.filter && !filter.opts.filter($(filter).val(), item)) { - return false; - } - } - return true; - }, }); - + } diff --git a/erpnext/home/page/attributions/attributions.html b/erpnext/home/page/attributions/attributions.html index 63919d0a29..9952908eda 100644 --- a/erpnext/home/page/attributions/attributions.html +++ b/erpnext/home/page/attributions/attributions.html @@ -43,6 +43,7 @@
  • JQuery.Gantt - Gantt Chart
  • JSON2 - JSON builder, parser
  • JSColor - color picker
  • +
  • Downloadify - Export CSV files from the browser
  • diff --git a/erpnext/startup/report_data_map.py b/erpnext/startup/report_data_map.py index aa23ade521..1811aaaec5 100644 --- a/erpnext/startup/report_data_map.py +++ b/erpnext/startup/report_data_map.py @@ -22,9 +22,9 @@ data_map = { }, "GL Entry": { "columns": ["account", "posting_date", "cost_center", "debit", "credit", "is_opening", - "company"], + "company", "voucher_type", "voucher_no", "remarks"], "conditions": ["ifnull(is_cancelled, 'No')='No'"], - "order_by": "posting_date" + "order_by": "posting_date, account" }, "Company": { "columns": ["name"], diff --git a/public/css/all-app.css b/public/css/all-app.css index 957a8756cf..3d9ba3c0b8 100644 --- a/public/css/all-app.css +++ b/public/css/all-app.css @@ -3536,6 +3536,18 @@ div.appframe-toolbar { border-bottom: 1px solid #ccc; } +div.appframe-toolbar .label { + margin: 2px 2px; +} + +div.appframe-toolbar input, div.appframe-toolbar select { + font-size: 80%; + margin: 2px 2px; +} +div.appframe-toolbar button { + padding: 3px 7px !important; +} + /* diff --git a/public/css/all-web.css b/public/css/all-web.css index fd46111623..e38859e62a 100644 --- a/public/css/all-web.css +++ b/public/css/all-web.css @@ -2570,6 +2570,18 @@ div.appframe-toolbar { border-bottom: 1px solid #ccc; } +div.appframe-toolbar .label { + margin: 2px 2px; +} + +div.appframe-toolbar input, div.appframe-toolbar select { + font-size: 80%; + margin: 2px 2px; +} +div.appframe-toolbar button { + padding: 3px 7px !important; +} + /* diff --git a/public/js/all-app.js b/public/js/all-app.js index 247b7cc263..60a4393b9e 100644 --- a/public/js/all-app.js +++ b/public/js/all-app.js @@ -179,7 +179,7 @@ $(ele).css('-box-shadow','0px 0px '+spread+'px rgba(0,0,0,0.3);')};(function($){ this.selectedIndex=0;return $(this);} $.fn.set_working=function(){var ele=this.get(0);$(ele).attr('disabled','disabled');if(ele.loading_img){$(ele.loading_img).toggle(true);}else{ele.loading_img=$('').insertAfter(ele);}} -$.fn.done_working=function(){var ele=this.get(0);$(ele).attr('disabled',null);if(ele.loading_img){$(ele.loading_img).toggle(false);};}})(jQuery); +$.fn.done_working=function(){var ele=this.get(0);$(ele).attr('disabled',null);if(ele.loading_img){$(ele.loading_img).toggle(false);};}})(jQuery);wn.to_csv=function(data){var res=[];$.each(data,function(i,row){row=$.map(row,function(col){return typeof(col)==="string"?('"'+col.replace(/"/g,'\"')+'"'):col;});res.push(row.join(","));});return res.join("\n");} /* * lib/js/wn/model.js */ @@ -356,8 +356,9 @@ $(page).bind('show',onshow);if(onshow) $(page).bind('hide',onhide);page.label=label;wn.pages[label]=page;return page;},change_to:function(label){if(this.page&&this.page.label==label){return;} var me=this;if(label.tagName){var page=label;}else{var page=wn.pages[label];} if(!page){console.log('Page not found '+label);return;} -if(this.page){$(this.page).toggle(false);$(this.page).trigger('hide');} -this.page=page;$(this.page).fadeIn();this.page._route=window.location.hash;document.title=this.page.label;$(this.page).trigger('show');scroll(0,0);return this.page;}});wn.views.add_module_btn=function(parent,module){$(parent).append(repl('\ %(module)s Home\ ',{module:module,module_small:module.toLowerCase()}));} @@ -393,8 +394,7 @@ msgprint(r.server_messages);} if(r.exc){r.exc=JSON.parse(r.exc);if(r.exc instanceof Array){$.each(r.exc,function(i,v){if(v)console.log(v);})}else{console.log(r.exc);}};if(r['403']){wn.container.change_to('403');} if(r.docs){LocalDB.sync(r.docs);}} wn.request.call=function(opts){wn.request.prepare(opts);var ajax_args={url:opts.url||wn.request.url,data:opts.args,type:opts.type||'POST',dataType:opts.dataType||'json',success:function(r,xhr){wn.request.cleanup(opts,r);opts.success&&opts.success(r,xhr.responseText);},error:function(xhr,textStatus){wn.request.cleanup(opts,{});show_alert('Unable to complete request: '+textStatus) -opts.error&&opts.error(xhr)}};if(opts.progress_bar){var interval=null;$.extend(ajax_args,{xhr:function(){var xhr=jQuery.ajaxSettings.xhr();interval=setInterval(function(){if(xhr.readyState>2){var total=parseInt(xhr.getResponseHeader('Original-Length')||0)||parseInt(xhr.getResponseHeader('Content-Length'));var completed=parseInt(xhr.responseText.length);var percent=(100.0/total*completed).toFixed(2) -opts.progress_bar.css('width',(percent<10?10:percent)+'%');}},50);wn.last_xhr=xhr;return xhr;},complete:function(){opts.progress_bar.css('width','100%');clearInterval(interval);}})} +opts.error&&opts.error(xhr)}};if(opts.progress_bar){var interval=null;$.extend(ajax_args,{xhr:function(){var xhr=jQuery.ajaxSettings.xhr();interval=setInterval(function(){if(xhr.readyState>2){var total=parseInt(xhr.getResponseHeader('Original-Length')||0)||parseInt(xhr.getResponseHeader('Content-Length'));var completed=parseInt(xhr.responseText.length);var percent=(100.0/total*completed).toFixed(2);opts.progress_bar.css('width',(percent<10?10:percent)+'%');}},50);wn.last_xhr=xhr;return xhr;},complete:function(){opts.progress_bar.css('width','100%');clearInterval(interval);}})} $.ajax(ajax_args);} wn.call=function(opts){var args=$.extend({},opts.args) if(opts.module&&opts.page){args.cmd=opts.module+'.page.'+opts.page+'.'+opts.page+'.'+opts.method}else if(opts.method){args.cmd=opts.method;} @@ -609,7 +609,7 @@ msg=JSON.stringify(msg);if(msg.substr(0,8)=='__small:'){show_alert(msg.substr(8) if(!msg_dialog){msg_dialog=new wn.ui.Dialog({title:"Message",onhide:function(){msg_dialog.msg_area.empty();}});msg_dialog.msg_area=$('
    ').appendTo(msg_dialog.body);} if(msg.search(/
    |

    |

  • /)==-1) msg=replace_newlines(msg);msg_dialog.set_title(title||'Message') -msg_dialog.msg_area.append(msg);msg_dialog.show();} +msg_dialog.msg_area.append(msg);msg_dialog.show();return msg_dialog;} var growl_area;function show_alert(txt,id){if(!growl_area){if(!$('#dialog-container').length){$('
    ').appendTo('body');} growl_area=$a($i('dialog-container'),'div','',{position:'fixed',bottom:'8px',right:'8px',width:'320px',zIndex:10});} var wrapper=$a(growl_area,'div','',{position:'relative'});var body=$a(wrapper,'div','notice');var c=$a(body,'i','icon-remove-sign',{cssFloat:'right',cursor:'pointer'});$(c).click(function(){$dh(this.wrapper)});c.wrapper=wrapper;var t=$a(body,'div','',{color:'#FFF'});$(t).html(txt);if(id){$(t).attr('id',id);} @@ -854,7 +854,7 @@ this.buttons[label]=$(repl('