@@ -578,3 +578,13 @@ def get_list(doctype, *args, **kwargs): | |||||
'''wrapper for DatabaseQuery''' | '''wrapper for DatabaseQuery''' | ||||
kwargs.pop('cmd', None) | kwargs.pop('cmd', None) | ||||
return DatabaseQuery(doctype).execute(None, *args, **kwargs) | return DatabaseQuery(doctype).execute(None, *args, **kwargs) | ||||
@frappe.whitelist() | |||||
def get_count(doctype, filters=None): | |||||
if filters: | |||||
filters = json.loads(filters) | |||||
if isinstance(filters, list): | |||||
filters = frappe.utils.make_filter_dict(filters) | |||||
return frappe.db.count(doctype, filters=filters) |
@@ -355,6 +355,29 @@ frappe.views.ListRenderer = Class.extend({ | |||||
this.render_tags($item_container, value); | this.render_tags($item_container, value); | ||||
}); | }); | ||||
this.render_count(values.length); | |||||
}, | |||||
render_count: function(current_count) { | |||||
console.log(this) | |||||
const $header_right = this.list_view.list_header.find('.list-item__content--activity'); | |||||
frappe.call({ | |||||
method: 'frappe.model.db_query.get_count', | |||||
args: { | |||||
doctype: this.doctype, | |||||
filters: this.list_view.get_filters_args() | |||||
} | |||||
}).then(r => { | |||||
const count = r.message; | |||||
const $html = $(`<span>${current_count} of ${count}</span>`); | |||||
$html.css({ | |||||
marginRight: '10px' | |||||
}) | |||||
$header_right.addClass('text-muted'); | |||||
$header_right.html($html); | |||||
}) | |||||
}, | }, | ||||
// returns html for a data item, | // returns html for a data item, | ||||
@@ -781,6 +781,16 @@ def make_filter_tuple(doctype, key, value): | |||||
else: | else: | ||||
return [doctype, key, "=", value] | return [doctype, key, "=", value] | ||||
def make_filter_dict(filters): | |||||
'''convert this [[doctype, key, operator, value], ..] | |||||
to this { key: (operator, value), .. } | |||||
''' | |||||
_filter = frappe._dict() | |||||
for f in filters: | |||||
_filter[f[1]] = (f[2], f[3]) | |||||
return _filter | |||||
def scrub_urls(html): | def scrub_urls(html): | ||||
html = expand_relative_urls(html) | html = expand_relative_urls(html) | ||||
# encoding should be responsibility of the composer | # encoding should be responsibility of the composer | ||||