[enhancement] reports now searchable from awesome bar, added in bootversion-14
@@ -104,9 +104,16 @@ def get_allowed_pages(): | |||||
def load_translations(bootinfo): | def load_translations(bootinfo): | ||||
if frappe.local.lang != 'en': | if frappe.local.lang != 'en': | ||||
bootinfo["__messages"] = frappe.get_lang_dict("boot") | |||||
messages = frappe.get_lang_dict("boot") | |||||
bootinfo["lang"] = frappe.lang | bootinfo["lang"] = frappe.lang | ||||
# load translated report names | |||||
for name in bootinfo.user.all_reports: | |||||
messages[name] = frappe._(name) | |||||
bootinfo["__messages"] = messages | |||||
def get_fullnames(): | def get_fullnames(): | ||||
"""map of user fullnames""" | """map of user fullnames""" | ||||
ret = frappe.db.sql("""select name, | ret = frappe.db.sql("""select name, | ||||
@@ -0,0 +1,3 @@ | |||||
Leave change log files in this folder for user release notes. | |||||
(this file is just a place holder, don't delete it) |
@@ -0,0 +1 @@ | |||||
- Report can now be selected from search bar (Awesome bar) |
@@ -382,26 +382,28 @@ frappe.ui.Filter = Class.extend({ | |||||
frappe.ui.FieldSelect = Class.extend({ | frappe.ui.FieldSelect = Class.extend({ | ||||
// opts parent, doctype, filter_fields, with_blank, select | // opts parent, doctype, filter_fields, with_blank, select | ||||
init: function(opts) { | init: function(opts) { | ||||
var me = this; | |||||
$.extend(this, opts); | $.extend(this, opts); | ||||
this.fields_by_name = {}; | this.fields_by_name = {}; | ||||
this.options = []; | this.options = []; | ||||
this.$select = $('<input class="form-control">').appendTo(this.parent); | |||||
var me = this; | |||||
this.$select.autocomplete({ | |||||
source: me.options, | |||||
minLength: 0, | |||||
focus: function(event, ui) { | |||||
ui.item && me.$select.val(ui.item.label); | |||||
return false; | |||||
}, | |||||
select: function(event, ui) { | |||||
me.selected_doctype = ui.item.doctype; | |||||
me.selected_fieldname = ui.item.fieldname; | |||||
me.$select.val(ui.item.label); | |||||
if(me.select) me.select(ui.item.doctype, ui.item.fieldname); | |||||
return false; | |||||
} | |||||
}); | |||||
this.$select = $('<input class="form-control">') | |||||
.appendTo(this.parent) | |||||
.on("click", function () { $(this).select(); }) | |||||
.autocomplete({ | |||||
source: me.options, | |||||
minLength: 0, | |||||
focus: function(event, ui) { | |||||
ui.item && me.$select.val(ui.item.label); | |||||
return false; | |||||
}, | |||||
select: function(event, ui) { | |||||
me.selected_doctype = ui.item.doctype; | |||||
me.selected_fieldname = ui.item.fieldname; | |||||
me.$select.val(ui.item.label); | |||||
if(me.select) me.select(ui.item.doctype, ui.item.fieldname); | |||||
return false; | |||||
} | |||||
}); | |||||
this.$select.data('ui-autocomplete')._renderItem = function(ul, item) { | this.$select.data('ui-autocomplete')._renderItem = function(ul, item) { | ||||
return $(repl('<li class="filter-field-select"><p>%(label)s</p></li>', item)) | return $(repl('<li class="filter-field-select"><p>%(label)s</p></li>', item)) | ||||
@@ -27,14 +27,14 @@ frappe.search = { | |||||
response(frappe.search.options); | response(frappe.search.options); | ||||
}, | }, | ||||
open: function() { | |||||
frappe.search.autocomplete_open = true; | |||||
open: function(event, ui) { | |||||
frappe.search.autocomplete_open = event.target; | |||||
}, | }, | ||||
close: function() { | |||||
close: function(event, ui) { | |||||
frappe.search.autocomplete_open = false; | frappe.search.autocomplete_open = false; | ||||
}, | }, | ||||
select: function(event, ui) { | select: function(event, ui) { | ||||
if(ui.item.route_options) { | |||||
if(ui.item._options) { | |||||
frappe.route_options = ui.item.route_options; | frappe.route_options = ui.item.route_options; | ||||
} | } | ||||
@@ -48,16 +48,6 @@ frappe.search = { | |||||
} | } | ||||
}; | }; | ||||
var render_item = function(ul, d) { | |||||
var html = "<span>" + __(d.label || d.value) + "</span>"; | |||||
if(d.description && d.value!==d.description) { | |||||
html += '<br><span class="text-muted">' + __(d.description) + '</span>'; | |||||
} | |||||
return $('<li></li>') | |||||
.data('item.autocomplete', d) | |||||
.html('<a><p>' + html + '</p></a>') | |||||
.appendTo(ul); | |||||
}; | |||||
var open_recent = function() { | var open_recent = function() { | ||||
if (!frappe.search.autocomplete_open) { | if (!frappe.search.autocomplete_open) { | ||||
@@ -67,15 +57,27 @@ frappe.search = { | |||||
$("#navbar-search") | $("#navbar-search") | ||||
.on("focus", open_recent) | .on("focus", open_recent) | ||||
.autocomplete(opts).data('ui-autocomplete')._renderItem = render_item; | |||||
.autocomplete(opts).data('ui-autocomplete')._renderItem = | |||||
frappe.search.render_item; | |||||
$("#sidebar-search") | $("#sidebar-search") | ||||
.on("focus", open_recent) | .on("focus", open_recent) | ||||
.autocomplete(opts).data('ui-autocomplete')._renderItem = render_item; | |||||
.autocomplete(opts).data('ui-autocomplete')._renderItem = | |||||
frappe.search.render_item; | |||||
frappe.search.make_page_title_map(); | frappe.search.make_page_title_map(); | ||||
frappe.search.setup_recent(); | frappe.search.setup_recent(); | ||||
}, | }, | ||||
render_item: function(ul, d) { | |||||
var html = "<span>" + __(d.label || d.value) + "</span>"; | |||||
if(d.description && d.value!==d.description) { | |||||
html += '<br><span class="text-muted">' + __(d.description) + '</span>'; | |||||
} | |||||
return $('<li></li>') | |||||
.data('item.autocomplete', d) | |||||
.html('<a><p>' + html + '</p></a>') | |||||
.appendTo(ul); | |||||
}, | |||||
add_help: function() { | add_help: function() { | ||||
frappe.search.options.push({ | frappe.search.options.push({ | ||||
label: __("Help on Search"), | label: __("Help on Search"), | ||||
@@ -208,12 +210,24 @@ frappe.search.verbs = [ | |||||
}); | }); | ||||
}, | }, | ||||
// pages | |||||
// reports | |||||
function(txt) { | function(txt) { | ||||
frappe.search.find(keys(frappe.search.pages), txt, function(match) { | |||||
frappe.search.find(keys(frappe.boot.user.all_reports), txt, function(match) { | |||||
var report_type = frappe.boot.user.all_reports[match]; | |||||
return { | return { | ||||
label: __("Open {0}", ["<b>"+__(match)+"</b>"]), | label: __("Open {0}", ["<b>"+__(match)+"</b>"]), | ||||
value: __("Open {0}", [__(match)]), | value: __("Open {0}", [__(match)]), | ||||
route: [report_type=="Report Builder" ? "Report" : "query-report", match] | |||||
} | |||||
}); | |||||
}, | |||||
// pages | |||||
function(txt) { | |||||
frappe.search.find(keys(frappe.search.pages), txt, function(match) { | |||||
return { | |||||
label: __("Report {0}", ["<b>"+__(match)+"</b>"]), | |||||
value: __("Report {0}", [__(match)]), | |||||
route: [frappe.search.pages[match].route || frappe.search.pages[match].name] | route: [frappe.search.pages[match].route || frappe.search.pages[match].name] | ||||
} | } | ||||
}); | }); | ||||
@@ -274,5 +288,5 @@ frappe.search.verbs = [ | |||||
} | } | ||||
}; | }; | ||||
}, | |||||
} | |||||
]; | ]; |
@@ -149,6 +149,9 @@ class User: | |||||
self.can_import = frappe.db.sql_list("""select name from `tabDocType` | self.can_import = frappe.db.sql_list("""select name from `tabDocType` | ||||
where allow_import = 1""") | where allow_import = 1""") | ||||
self.all_reports = frappe.db.sql("""select name, report_type from tabReport | |||||
where ref_doctype in ('{0}')""".format("', '".join(self.can_get_report))) | |||||
def get_defaults(self): | def get_defaults(self): | ||||
import frappe.defaults | import frappe.defaults | ||||
self.defaults = frappe.defaults.get_defaults(self.name) | self.defaults = frappe.defaults.get_defaults(self.name) | ||||
@@ -206,6 +209,7 @@ class User: | |||||
d[key] = list(set(getattr(self, key))) | d[key] = list(set(getattr(self, key))) | ||||
d.all_reports = dict(self.all_reports) | |||||
return d | return d | ||||
def get_user_fullname(user): | def get_user_fullname(user): | ||||