diff --git a/frappe/public/build.json b/frappe/public/build.json index 73a9fae189..8dd323528d 100755 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -357,6 +357,7 @@ "public/js/frappe/views/reports/report_factory.js", "public/js/frappe/views/reports/report_view.js", "public/js/frappe/views/reports/reportview_footer.html", + "public/js/frappe/views/reports/groupby.html", "public/js/frappe/views/reports/query_report.js", "public/js/frappe/views/reports/grid_report.js", "public/js/frappe/views/reports/print_grid.html", diff --git a/frappe/public/js/frappe/model/model.js b/frappe/public/js/frappe/model/model.js index f2b1132b69..9d4ad3af1c 100644 --- a/frappe/public/js/frappe/model/model.js +++ b/frappe/public/js/frappe/model/model.js @@ -87,13 +87,18 @@ $.extend(frappe.model, { return !frappe.model.std_fields_list.includes(fieldname); }, - get_std_field: function(fieldname) { + get_std_field: function(fieldname, ignore=false) { var docfield = $.map([].concat(frappe.model.std_fields).concat(frappe.model.std_fields_table), function(d) { if(d.fieldname==fieldname) return d; }); - if(!docfield.length) { - frappe.msgprint(__("Unknown Column: {0}", [fieldname])); + if (!docfield.length) { + //Standard fields are ignored in case of adding columns as a result of groupby + if (ignore) { + return {fieldname: fieldname}; + } else { + frappe.msgprint(__("Unknown Column: {0}", [fieldname])); + } } return docfield[0]; }, diff --git a/frappe/public/js/frappe/views/reports/groupby.html b/frappe/public/js/frappe/views/reports/groupby.html new file mode 100644 index 0000000000..172d955807 --- /dev/null +++ b/frappe/public/js/frappe/views/reports/groupby.html @@ -0,0 +1,37 @@ + diff --git a/frappe/public/js/frappe/views/reports/report_view.js b/frappe/public/js/frappe/views/reports/report_view.js index 61e1513cff..b60e4e6e15 100644 --- a/frappe/public/js/frappe/views/reports/report_view.js +++ b/frappe/public/js/frappe/views/reports/report_view.js @@ -60,7 +60,6 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { } setup_sort_selector() { - console.log("Setting Sort Selector"); this.sort_selector = new frappe.ui.SortSelector({ parent: this.filter_area.$filter_list_wrapper, doctype: this.doctype, @@ -68,63 +67,120 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { onchange: this.on_sort_change.bind(this) }); - let group_by_button = $(``) - group_by_button.click(() => this.show_group_by_modal()); - this.page.wrapper.find(".active-tag-filters").append(group_by_button); + //Setup groupby for reports + this.setup_groupby_area(); } - show_group_by_modal() { - this.group_by = "customer"; - this.aggregate_on = "grand_total"; - this.aggregate_function = 'sum'; + make_groupby_button() { + let group_by_button = $(`
+
+ +
+
`); + this.page.wrapper.find(".sort-selector").before(group_by_button); + group_by_button.click(() => this.groupby_edit_area.show()); + } - const d = new frappe.ui.Dialog({ - title: __('Set Group By'), - fields: [ - { - fieldtype: 'Select', - fieldname: 'group_by', - label: 'Column for Group by', - options: this.get_group_by_fields(), - reqd: 1 - }, - { - fieldtype: 'Select', - fieldname: 'aggregate_function', - label: 'Aggregate Function', - options: ["Count", "Sum", "Average"], - reqd: 1 - }, - { - fieldtype: 'Select', - fieldname: 'aggregate_on', - label: 'Column for Aggregate', - options: this.meta.fields.map(f => f.label), - reqd: 1 + setup_groupby_area() { + this.make_groupby_button(); + let current_cols=[]; + let sql_aggregate_function = [{name:'count', label: 'Count'}, {name:'sum', label: 'Sum'}, {name:'avg', label:'Average'}]; + this.groupby_edit_area = $(frappe.render_template("groupby", { + groupby_conditions: this.get_group_by_fields(), + aggregate_function_conditions: sql_aggregate_function, + })); + $(".aggregate-function").val("count"); + this.page.wrapper.find(".frappe-list").append( + this.groupby_edit_area); + + //Set aggregate on options as numeric fields if function is sum or average + $('.aggregate-function').on('change', () => { + this.meta.fields.forEach((field) => { + let fn = $('.aggregate-function option:selected').val(); + if(fn === 'sum' || fn === 'avg') { + if(frappe.model.is_numeric_field(field.fieldtype)) { + $('.aggregate-on') + .append($('