diff --git a/frappe/core/doctype/test_runner/test_runner.js b/frappe/core/doctype/test_runner/test_runner.js
index 243c2804ca..0c305e7014 100644
--- a/frappe/core/doctype/test_runner/test_runner.js
+++ b/frappe/core/doctype/test_runner/test_runner.js
@@ -62,7 +62,6 @@ frappe.ui.form.on('Test Runner', {
QUnit.done(({ total, failed, passed, runtime }) => {
// flag for selenium that test is done
- $('
').appendTo($('body'));
console.log( `Total: ${total}, Failed: ${failed}, Passed: ${passed}, Runtime: ${runtime}` ); // eslint-disable-line
@@ -72,6 +71,9 @@ frappe.ui.form.on('Test Runner', {
console.log('Tests Passed'); // eslint-disable-line
}
frappe.set_route('Form', 'Test Runner', 'Test Runner');
+
+ $('').appendTo($('body'));
+
});
});
diff --git a/frappe/desk/calendar.py b/frappe/desk/calendar.py
index fa01b3f8de..d9cd03004a 100644
--- a/frappe/desk/calendar.py
+++ b/frappe/desk/calendar.py
@@ -19,16 +19,8 @@ def update_event(args, field_map):
def get_event_conditions(doctype, filters=None):
"""Returns SQL conditions with user permissions and filters for event queries"""
- from frappe.desk.reportview import build_match_conditions
+ from frappe.desk.reportview import get_filters_cond
if not frappe.has_permission(doctype):
frappe.throw(_("Not Permitted"), frappe.PermissionError)
- conditions = build_match_conditions(doctype)
- conditions = conditions and (" and " + conditions) or ""
- if filters:
- filters = json.loads(filters)
- for key in filters:
- if filters[key]:
- conditions += 'and `{0}` = "{1}"'.format(frappe.db.escape(key), frappe.db.escape(filters[key]))
-
- return conditions
+ return get_filters_cond(doctype, filters, [], with_match_conditions = True)
diff --git a/frappe/desk/reportview.py b/frappe/desk/reportview.py
index 920fb7f36b..26c81bdbeb 100644
--- a/frappe/desk/reportview.py
+++ b/frappe/desk/reportview.py
@@ -334,7 +334,7 @@ def build_match_conditions(doctype, as_condition=True):
else:
return match_conditions
-def get_filters_cond(doctype, filters, conditions, ignore_permissions=None):
+def get_filters_cond(doctype, filters, conditions, ignore_permissions=None, with_match_conditions=False):
if filters:
flt = filters
if isinstance(filters, dict):
@@ -350,6 +350,10 @@ def get_filters_cond(doctype, filters, conditions, ignore_permissions=None):
query = DatabaseQuery(doctype)
query.filters = flt
query.conditions = conditions
+
+ if with_match_conditions:
+ query.build_match_conditions()
+
query.build_filter_conditions(flt, conditions, ignore_permissions)
cond = ' and ' + ' and '.join(query.conditions)
diff --git a/frappe/public/js/frappe/ui/page.js b/frappe/public/js/frappe/ui/page.js
index 714d474ae5..5a5a3ac725 100644
--- a/frappe/public/js/frappe/ui/page.js
+++ b/frappe/public/js/frappe/ui/page.js
@@ -113,13 +113,20 @@ frappe.ui.Page = Class.extend({
},
set_action: function(btn, opts) {
+ let me = this;
if (opts.icon) {
opts.label = this.get_icon_label(opts.icon, opts.label);
}
this.clear_action_of(btn);
- btn.removeClass("hide").prop("disabled", false).html(opts.label).on("click", opts.click);
+ btn.removeClass("hide")
+ .prop("disabled", false)
+ .html(opts.label)
+ .on("click", function() {
+ let response = opts.click.apply(this);
+ me.btn_disable_enable(btn, response);
+ });
if (opts.working_label) {
btn.attr("data-working-label", opts.working_label);
@@ -250,31 +257,35 @@ frappe.ui.Page = Class.extend({
this.get_inner_group_button(label).find("button").removeClass("btn-default").addClass("btn-primary");
},
+ btn_disable_enable: function(btn, response) {
+ if (response && response.then) {
+ btn.prop('disabled', true);
+ response.then(() => {
+ btn.prop('disabled', false);
+ })
+ } else if (response && response.always) {
+ btn.prop('disabled', true);
+ response.always(() => {
+ btn.prop('disabled', false);
+ });
+ }
+ },
+
add_inner_button: function(label, action, group) {
let _action = function() {
let btn = $(this);
- let _ret = action();
- if (_ret && _ret.then) {
- // returns a promise
- btn.attr('disabled', true);
- _ret.then(() => {
- btn.attr('disabled', false);
- })
- }
- if (_ret && _ret.always) {
- // returns frappe.call ($.ajax)
- btn.attr('disabled', true);
- _ret.always(() => {
- btn.attr('disabled', false);
- });
- }
- }
+ let response = action();
+ this.btn_disable_enable(btn, response);
+ };
if(group) {
var $group = this.get_inner_group_button(group);
- return $(''+label+'').on('click', _action).appendTo($group.find(".dropdown-menu"));
+ return $(''+label+'')
+ .on('click', _action)
+ .appendTo($group.find(".dropdown-menu"));
} else {
return $('