diff --git a/README.md b/README.md index 11ff22471d..bdb082ccdc 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ -
' + '' + __("On {0}, {1} wrote:", [frappe.datetime.global_date_format(communication_date) , last_email.sender]) + '
' + @@ -668,4 +666,4 @@ frappe.views.CommunicationComposer = Class.extend({ } fields.content.set_value(content); } -}); \ No newline at end of file +}); diff --git a/frappe/public/js/frappe/views/reports/grid_report.js b/frappe/public/js/frappe/views/reports/grid_report.js index b556288be8..f5142c117e 100644 --- a/frappe/public/js/frappe/views/reports/grid_report.js +++ b/frappe/public/js/frappe/views/reports/grid_report.js @@ -830,7 +830,7 @@ frappe.views.TreeGridReport = frappe.views.GridReportWithPlot.extend({ var with_groups = $(msgbox.body).find("[name='with_groups']").prop("checked"); var with_ledgers = $(msgbox.body).find("[name='with_ledgers']").prop("checked"); - var data = frappe.slickgrid_tools.get_view_data(me.columns, me.dataView, + var data = frappe.slickgrid_tools.get_view_data(me.columns, me.data, function(row, item) { if(with_groups) { // add row diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index 1e0acd132e..984699f3ad 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -258,7 +258,8 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { report_name: this.report_name, filters: filters, }, - callback: resolve + callback: resolve, + always: () => this.page.btn_secondary.prop('disabled', false) }) }).then(r => { let data = r.message; @@ -664,12 +665,14 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { print_report(print_settings) { const custom_format = this.report_settings.html_format || null; const filters_html = this.get_filters_html_for_print(); + const landscape = print_settings.orientation == 'Landscape'; frappe.render_grid({ template: custom_format, title: __(this.report_name), subtitle: filters_html, print_settings: print_settings, + landscape: landscape, filters: this.get_filter_values(), data: custom_format ? this.data : this.get_data_for_print(), columns: custom_format ? this.columns : this.get_columns_for_print(), @@ -729,17 +732,29 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { return; } - this.export_dialog = frappe.prompt({ - label: __('Select File Format'), - fieldname: 'file_format', - fieldtype: 'Select', - options: ['Excel', 'CSV'], - default: 'Excel', - reqd: 1 - }, ({ file_format }) => { + this.export_dialog = frappe.prompt([ + { + label: __('Select File Format'), + fieldname: 'file_format', + fieldtype: 'Select', + options: ['Excel', 'CSV'], + default: 'Excel', + reqd: 1, + onchange: () => { + this.export_dialog.set_df_property('with_indentation', + 'hidden', this.export_dialog.get_value('file_format') !== 'CSV'); + } + }, + { + label: __('With Group Indentation'), + fieldname: 'with_indentation', + fieldtype: 'Check', + hidden: 1 + } + ], ({ file_format, with_indentation }) => { if (file_format === 'CSV') { const column_row = this.columns.map(col => col.label); - const data = this.get_data_for_csv(); + const data = this.get_data_for_csv(with_indentation); const out = [column_row].concat(data); frappe.tools.downloadify(out, null, this.report_name); @@ -762,10 +777,21 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { }, __('Export Report: '+ this.report_name), __('Download')); } - get_data_for_csv() { + get_data_for_csv(with_indentation = false) { + const indices = this.datatable.datamanager.getFilteredRowIndices(); - const out = indices.map(i => this.datatable.datamanager.getRow(i).map(c => c.content)); - return out.map(row => row.slice(1)); + const rows = indices.map(i => this.datatable.datamanager.getRow(i)); + return rows.map(row => { + const standard_column_count = this.datatable.datamanager.getStandardColumnCount(); + return row + .slice(standard_column_count) + .map((cell, i) => { + if (with_indentation && i === 0) { + return ' '.repeat(row.meta.indent) + cell.content; + } + return cell.content; + }); + }); } get_data_for_print() { diff --git a/frappe/public/js/legacy/form.js b/frappe/public/js/legacy/form.js index 2193e25610..f2c26566dd 100644 --- a/frappe/public/js/legacy/form.js +++ b/frappe/public/js/legacy/form.js @@ -496,29 +496,25 @@ _f.Frm.prototype.render_form = function(is_a_different_doc) { // clear layout message this.layout.show_message(); - // header must be refreshed before client methods - // because add_custom_button - this.refresh_header(is_a_different_doc); - - // call trigger - this.script_manager.trigger("refresh"); - - // trigger global trigger - // to use this - $(document).trigger('form-refresh', [this]); - - // fields - this.refresh_fields(); - - - // call onload post render for callbacks to be fired - if(this.cscript.is_onload) { - this.script_manager.trigger("onload_post_render"); - } - - // update dashboard after refresh - frappe.timeout(0.1).then(() => this.dashboard.after_refresh()); - + frappe.run_serially([ + // header must be refreshed before client methods + // because add_custom_button + () => this.refresh_header(is_a_different_doc), + // call trigger + () => this.script_manager.trigger("refresh"), + // trigger global trigger + // to use this + () => $(document).trigger('form-refresh', [this]), + // fields + () => this.refresh_fields(), + // call onload post render for callbacks to be fired + () => { + if(this.cscript.is_onload) { + return this.script_manager.trigger("onload_post_render"); + } + }, + () => this.dashboard.after_refresh() + ]); // focus on first input if(this.is_new()) { diff --git a/frappe/public/js/lib/microtemplate.js b/frappe/public/js/lib/microtemplate.js index bfdf103f78..d352836018 100644 --- a/frappe/public/js/lib/microtemplate.js +++ b/frappe/public/js/lib/microtemplate.js @@ -96,10 +96,12 @@ frappe.render_grid = function(opts) { } // show landscape view if columns more than 10 - if (opts.columns && opts.columns.length > 10) { - opts.landscape = true; - } else { - opts.landscape = false; + if (opts.landscape == null) { + if(opts.columns && opts.columns.length > 10) { + opts.landscape = true; + } else { + opts.landscape = false; + } } // render content diff --git a/frappe/templates/emails/email_footer.html b/frappe/templates/emails/email_footer.html index 5352d817d5..4ad6cb23b5 100644 --- a/frappe/templates/emails/email_footer.html +++ b/frappe/templates/emails/email_footer.html @@ -17,6 +17,10 @@ ++ ++ {% if default_mail_footer %} {% endif %} -