Here what I come up with :
def autocomplete_typeahead_widget(f, v, **kwargs):
table_name = f._tablename
field_name = f.name
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) {
mapped[item.option] = item.id
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 = autocomplete_typeahead_widget
or
db.other_table.select_field.widget = lambda field, value:
autocomplete_typeahead_widget(field, value, MORE_ARGS)
On Mon, Mar 18, 2013 at 10:10 AM, Richard Vézina <
[email protected]> wrote:
> Hello Calvin,
>
> This seems interesting. I was planning to work un this when I get time but
> it looks that what you did is a good start!
>
> I have a question, I am not sure how you was thinking to initialize the
> widget on a select type field??
>
> Should I do something like this in order to use your typeahead
> autocomplete widget? :
>
> db.table.field.widget = lambda field, value: bs_typeahead(field, value,
> ???kwargs)
>
> ??
>
> Thanks
>
> Richard
>
>
>
>
> On Mon, Mar 11, 2013 at 4:45 AM, Calvin <[email protected]> wrote:
>
>> If of interest to anyone, eventually, I made my own autocomplete based on
>> Bootstrap Typeahead:
>>
>> def bs_typeahead(f, v, **kwargs):
>> options = {'_data-provide':'textahead'}
>> options.update(kwargs)
>> return CAT(
>> INPUT(_type="text", _class="string", _id="%s_%s_ac" % (f.
>> _tablename, f.name), **options),
>> INPUT(_type="hidden", _id="%s_%s" % (f._tablename, f.name), _name
>> =f.name, _value=v, requires=f.requires),
>> SCRIPT("$($('#%(table)s_%(field)s_ac').typeahead({minLength: 3,
>> source:function(query,process){console.log(query); return
>> $.get('%(url)s.json', {'_ac_%(table)s_%(field)s': query},
>> function(data){return process(data.options)})},
>> highlighter:function(item){return
>> item.split('_')[1]},updater:function(item){ var p=item.split('_');
>> $('#%(table)s_%(field)s').val(p[0]); return p[1]}}))" % {'url':URL(),
>> 'table':f._tablename, 'field':f.name})
>> )
>>
>> and with the appropriate handler for request.vars['ac_%s_%s'
>> %(f._tablename, f.name)]
>>
>> --
>>
>> ---
>> You received this message because you are subscribed to the Google Groups
>> "web2py-users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>>
>>
>
>
--
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.