diff --git a/tailbone/static/js/tailbone.js b/tailbone/static/js/tailbone.js
index 868e0b7b..4d3212df 100644
--- a/tailbone/static/js/tailbone.js
+++ b/tailbone/static/js/tailbone.js
@@ -220,6 +220,9 @@ $(function() {
disable_submit_button(this);
});
+ // quickie button
+ $('#submit-quickie').button('option', 'icons', {primary: 'ui-icon-zoomin'});
+
/*
* enhance dropdowns
*/
diff --git a/tailbone/templates/base.mako b/tailbone/templates/base.mako
index 00e27a60..aea0c0e5 100644
--- a/tailbone/templates/base.mako
+++ b/tailbone/templates/base.mako
@@ -84,6 +84,15 @@
% endif
+ % if quickie is not Undefined and quickie and request.has_perm(quickie.perm):
+
+ ${h.form(quickie.url, name="quickie", method="get")}
+ ${h.text('entry', placeholder=quickie.placeholder, autocomplete='off')}
+
+ ${h.end_form()}
+
+ % endif
+
diff --git a/tailbone/views/master.py b/tailbone/views/master.py
index be0a9fc3..516009df 100644
--- a/tailbone/views/master.py
+++ b/tailbone/views/master.py
@@ -39,6 +39,7 @@ import sqlalchemy_continuum as continuum
from rattail.db import model, Session as RattailSession
from rattail.db.continuum import model_transaction_query
+from rattail.core import Object
from rattail.util import prettify
from rattail.time import localtime
from rattail.threads import Thread
@@ -96,6 +97,10 @@ class MasterView(View):
supports_prev_next = False
supports_import_batch_from_file = False
+ # quickie (search)
+ supports_quickie_search = False
+ expose_quickie_search = False
+
# set to True to declare model as "contact"
is_contact = False
@@ -378,6 +383,20 @@ class MasterView(View):
the given object, or ``None``.
"""
+ def quickie(self):
+ raise NotImplementedError
+
+ def get_quickie_url(self):
+ route_prefix = self.get_route_prefix()
+ return self.request.route_url('{}.quickie'.format(route_prefix))
+
+ def get_quickie_perm(self):
+ permission_prefix = self.get_permission_prefix()
+ return '{}.quickie'.format(permission_prefix)
+
+ def get_quickie_placeholder(self):
+ pass
+
def make_row_grid(self, factory=None, key=None, data=None, columns=None, **kwargs):
"""
Make and return a new (configured) rows grid instance.
@@ -2176,8 +2195,16 @@ class MasterView(View):
'action_url': self.get_action_url,
'grid_index': self.grid_index,
'help_url': self.get_help_url(),
+ 'quickie': None,
}
+ if self.expose_quickie_search:
+ context['quickie'] = Object(
+ url=self.get_quickie_url(),
+ perm=self.get_quickie_perm(),
+ placeholder=self.get_quickie_placeholder(),
+ )
+
if self.grid_index:
context['grid_count'] = self.grid_count
@@ -3342,6 +3369,14 @@ class MasterView(View):
config.add_view(cls, attr='results_xlsx', route_name='{}.results_xlsx'.format(route_prefix),
permission='{}.results_xlsx'.format(permission_prefix))
+ # quickie (search)
+ if cls.supports_quickie_search:
+ config.add_tailbone_permission(permission_prefix, '{}.quickie'.format(permission_prefix),
+ "Do a \"quickie search\" for {}".format(model_title_plural))
+ config.add_route('{}.quickie'.format(route_prefix), '{}/quickie'.format(route_prefix),
+ request_method='GET')
+ config.add_view(cls, attr='quickie', route_name='{}.quickie'.format(route_prefix),
+ permission='{}.quickie'.format(permission_prefix))
# create
if cls.creatable or cls.mobile_creatable: