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($('