def autocomplete_typeahead_widget(f, v, **kwargs):
table_name = f._tablename
field_requires = f.requires
field_value = v
options = {'_data-provide':'typeahead', '_autocomplete': 'off'}
options.update(kwargs)
return CAT(
INPUT(_type="text", _class="string", _id="%s_%s_ac" % (table_name, field_name), **options),
INPUT(_type="hidden", _id="%s_%s" % (table_name, field_name), _name=field_name, _value=field_value, requires=field_requires),
SCRIPT("""$(function() { $('#%(table_name)s_%(field_name)s_ac').typeahead(
{ source: function (query, process) {
$.get('%(url)s.json',
{ q: query },
function (data) {
labels = []
mapped = {}
$.each(data.options, function (i, item) {
labels.push(item.option)
})
process(labels)
}
)
},
updater:function(item){ $('#%(table_name)s_%(field_name)s').val(mapped[item]); return item}
})
});""" % {'url':URL(c='test', f='autocomplete_typeahead_widget_json_feed'), 'table_name':table_name, 'field_name':field_name})
)
def autocomplete_typeahead_widget_json_feed():
rows=db(db.table.field>0).select()
options = []
for i,row in enumerate(rows):
options.append({'option': row.field, 'id':
row.id})
from gluon.contrib import simplejson
return simplejson.dumps({'options': options })
db.other_table.select_field.widget = lambda field, value: autocomplete_typeahead_widget(field, value, MORE_ARGS)