I found an hole in typeahead updater...

typeahead updater seems to be bit it by a trigger event only when there is
something that have been selected... But if for instance someone select
something the hidden field that get submitted is updated with the id if the
record, but the hidden field is not updated if the field is empty (for some
reason : USERS) after been filled once... So the id of the previous
selected record stay there and the form submit correctly if there is no
other validators that trigger up!!

I googled a lot about this hole and typeahead, maybe I don't have the right
keywords or the issue have not been identified since bootstrap typeahead as
only recently get the updated to support key/value field.

Richard


On Mon, Mar 18, 2013 at 9:02 PM, Richard <[email protected]>wrote:

> Hello,
>
> Wrote this and it may be handy for others in the meantime there is a
> better integration of autocomplete bootstrap typeahead :
>
> # Widget function
> 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})
>     )
>
> # Generating JSON function
> 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 })
>
> # Init of the widget
> 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)
>
> Enjoy!
>
> Richard
>
> --
>
> ---
> 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.


Reply via email to