diff --git a/frappe/public/js/frappe/ui/group_by/group_by.js b/frappe/public/js/frappe/ui/group_by/group_by.js index 98d4531c5e..6141d5a89a 100644 --- a/frappe/public/js/frappe/ui/group_by/group_by.js +++ b/frappe/public/js/frappe/ui/group_by/group_by.js @@ -25,7 +25,7 @@ frappe.ui.GroupBy = class { this.groupby_select = this.groupby_edit_area.find('select.groupby'); this.aggregate_function_select = this.groupby_edit_area.find('select.aggregate-function'); this.aggregate_on_select = this.groupby_edit_area.find('select.aggregate-on'); - + this.aggregate_on_html = ``; // set default to count this.aggregate_function_select.val("count"); this.page.wrapper.find(".frappe-list").append( @@ -51,21 +51,32 @@ frappe.ui.GroupBy = class { } show_hide_aggregate_on() { - this.report_view.meta.fields.forEach((field) => { - let fn = this.aggregate_function_select.val(); - if(fn === 'sum' || fn === 'avg') { - // pick numeric fields for sum / avg - if(frappe.model.is_numeric_field(field.fieldtype)) { - this.aggregate_on_select.append( - $('`; + + for (let doctype in this.all_fields) { + const doctype_fields = this.all_fields[doctype]; + doctype_fields.forEach(field => { + // pick numeric fields for sum / avg + if (frappe.model.is_numeric_field(field.fieldtype)) { + let option_text = doctype == this.doctype + ? field.label + : `${field.label} (${doctype})`; + this.aggregate_on_html+= ``; + } + }); } - this.aggregate_on_select.show(); - } else { - // count, so no aggregate function - this.aggregate_on_select.hide(); } - }); + this.aggregate_on_select.html(this.aggregate_on_html); + this.aggregate_on_select.show(); + } else { + // count, so no aggregate function + this.aggregate_on_select.hide(); + } } get_settings() { @@ -114,8 +125,10 @@ frappe.ui.GroupBy = class { if (this.aggregate_function === 'count') { this.aggregate_on = 'name'; + this.aggregate_on_doctype = null; } else { this.aggregate_on = this.aggregate_on_select.val(); + this.aggregate_on_doctype = this.aggregate_on_select.find(':selected').attr('data-doctype'); } @@ -143,11 +156,13 @@ frappe.ui.GroupBy = class { set_args(args) { if (this.aggregate_function && this.group_by) { - let aggregate_column; - if(this.aggregate_function === 'count') { + let aggregate_column, aggregate_on_field; + if (this.aggregate_function === 'count') { aggregate_column = 'count(`tab'+ this.doctype + '`.`name`)'; } else { - aggregate_column = `${this.aggregate_function}(\`tab${this.doctype}\`.\`${this.aggregate_on}\`)`; + aggregate_column = + `${this.aggregate_function}(\`tab${this.aggregate_on_doctype}\`.\`${this.aggregate_on}\`)`; + aggregate_on_field = '`tab' + this.aggregate_on_doctype + '`.`' + this.aggregate_on + '`'; } this.report_view.group_by = this.group_by; @@ -166,10 +181,14 @@ frappe.ui.GroupBy = class { // rebuild fields for group by args.fields = this.report_view.get_fields(); - // add aggregate column in both query args and report view - this.report_view.fields.push(['_aggregate_column', this.doctype]); + // add aggregate column in both query args and report views + this.report_view.fields.push(['_aggregate_column', this.aggregate_on_doctype || this.doctype]); args.fields.push(aggregate_column + ' as _aggregate_column'); + if (aggregate_on_field) { + args.fields.push(aggregate_on_field); + } + // setup columns in datatable this.report_view.setup_columns(); @@ -195,7 +214,7 @@ frappe.ui.GroupBy = class { }; } else { // get properties of "aggregate_on", for example Net Total - docfield = Object.assign({}, frappe.meta.docfield_map[this.doctype][this.aggregate_on]); + docfield = Object.assign({}, frappe.meta.docfield_map[this.aggregate_on_doctype][this.aggregate_on]); if (this.aggregate_function === 'sum') { docfield.label = __('Sum of {0}', [docfield.label]); } else { @@ -230,9 +249,12 @@ frappe.ui.GroupBy = class { } get_group_by_fields() { - let group_by_fields = {}; + this.group_by_fields = {}; + this.all_fields = {}; + let fields = this.report_view.meta.fields.filter(f => ["Select", "Link", "Data", "Int"].includes(f.fieldtype)); - group_by_fields[this.doctype] = fields; + this.group_by_fields[this.doctype] = fields; + this.all_fields[this.doctype] = this.report_view.meta.fields; const standard_fields_filter = df => !in_list(frappe.model.no_value_type, df.fieldtype) && !df.report_hide; @@ -243,10 +265,10 @@ frappe.ui.GroupBy = class { table_fields.forEach(df => { const cdt = df.options; const child_table_fields = frappe.meta.get_docfields(cdt).filter(standard_fields_filter); - group_by_fields[cdt] = child_table_fields; + this.group_by_fields[cdt] = child_table_fields; + this.all_fields[cdt] = child_table_fields; }); - - return group_by_fields; + return this.group_by_fields; } }; diff --git a/frappe/public/js/frappe/views/reports/report_view.js b/frappe/public/js/frappe/views/reports/report_view.js index 8c965966ec..b479c4c101 100644 --- a/frappe/public/js/frappe/views/reports/report_view.js +++ b/frappe/public/js/frappe/views/reports/report_view.js @@ -1035,7 +1035,7 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { return { name: name, doctype: col.docfield.parent, - content: d[cdt_field(col.field)], + content: d[cdt_field(col.field)] || d[col.field], editable: Boolean(name && this.is_editable(col.docfield, d)), format: value => { return frappe.format(value, col.docfield, { always_show_decimals: true }, d);