you need bootstrap 2.3.2 (not tested with BS3, but I am pretty sure it is not working, too differents)...
Did you try it with a recent web2py setup? I would suggest you try with web2py 2.9.5 which is what I use actually and it works... Richard On Thu, May 7, 2015 at 9:20 AM, LoveWeb2py <atayloru...@gmail.com> wrote: > Another observation: > > All of this code: > > > >> js += '$(function() {' \ >> ' $("#%s_option_add_trigger").button({' \ >> ' text: true,' \ >> ' icons: {' \ >> ' primary: "ui-icon-circle-plus"' \ >> ' }' \ >> ' });' \ >> '});' % (my_select_id) >> js += '$(function() { ' \ >> ' $( "#%s_option_add_trigger" ).css("margin-left", >> "+=5"); ' \ >> '});' % (my_select_id) >> js += >> '$("#{modal_id}").appendTo("body");'.format(modal_id=my_select_id >> + "_modal-form") >> >>> >>> Get's commented out when it's rendered so it ends up looking like this > <!-- $(document).read(function() .... .appendTo("body");}); //--> > > Any idea why that could be happening and would that impact the button > showing the modal > > On Thursday, May 7, 2015 at 8:45:49 AM UTC-4, LoveWeb2py wrote: > >> Hi Richard! >> >> I think I'm getting close. No more errors, and I applied the widget to >> the field successfully. I see the + sign next to my field, but nothing >> happens when I click it so I'm going over the javascript with a fine tooth >> comb. Is there any additional .js or .css files I need to include? >> >> This is really looking promising! >> >> On Wednesday, May 6, 2015 at 12:42:34 PM UTC-4, Richard wrote: >> >> Let say the FK field is field2 : >> >> Field('field2','reference main_table', # Better syntax thand >> "db.main_table" >> widget=AutocompleteWidgetSelectOrAddOption( >> request=request, >> >> field=db.main_table.field1, # which is you reprensting field >> id_field=db.main_table.id >> , >> limitby=(0, 10), # how >> much records you want in the dropbox >> min_length=6, # when you >> want the autocomplete pop in or how many caracters user have to entered >> before the autocomplete kickin >> form_title=T('Add new >> title'), >> controller="controler >> name that contains the below function", >> function="your add >> function name", >> button_text=T('Add new'), >> placeholder=T('Start >> typing...')) >> >> Richard >> >> On Wed, May 6, 2015 at 12:34 PM, LoveWeb2py <atayl...@gmail.com> wrote: >> >> Thank you, Richard. I think i'm getting closer. Could you show me an >> example of how you apply this to a specific field in SQLFORM? >> >> Going back to my original model: >> >> db.define_table('main_table', >> Field('field1','string'), >> Field('field2','string'), >> migrate=False) >> >> db.define_table('second_table', >> Field('field1','db.main_table'), >> Field('field2','db.main_table') >> migrate=False) >> >> How could I integrate your widget with field 2 for a SQLFORM? >> >> >> >> >> >> >> On Wednesday, May 6, 2015 at 9:40:02 AM UTC-4, Richard wrote: >> >> The id field and what field you want to show as a representation of the >> id field of the referenced table... >> >> Start by putting the widget class in model file even if it not a good >> thing to see if you can make it works... >> >> In the module I have these imports : >> >> from gluon.html import * >> from gluon.sqlhtml import * >> from gluon import current >> from gluon.compileapp import LOAD >> >> >> Which may not be related to the widget class... >> >> Richard >> >> >> On Tue, May 5, 2015 at 4:28 PM, LoveWeb2py <atayl...@gmail.com> wrote: >> >> Hi Richard, >> >> I'm trying to get this setup, but am receiving an error self.url = >> URL(args=request.args)\nNameError: global name \'URL\' is not defined\n'. >> I'm wondering if this is because the gluon hasn't been imported yet. >> >> Also, could you ellaborate more on this? >> >> >> field=db.table.representing_field, >> >> id_field=db.table.id_field, >> >> id_field should be the foreignkey table if I am not mistaking? >> db.table.representing field, and db.table2.id_field (with foreign key) does >> that sound right? >> >> >> On Wednesday, April 29, 2015 at 10:04:35 AM UTC-4, Richard wrote: >> >> *# In a modules :* >> >> class AutocompleteWidgetSelectOrAddOption(object): >> _class = 'string' >> >> def __init__(self, >> request, >> field, >> id_field=None, >> db=None, >> orderby=None, >> limitby=(0, 10), >> keyword='_autocomplete_%(fieldname)s', >> min_length=2, >> # >> ------------------------------------------------------------- >> # From : SelectOrAddOption >> controller=None, function=None, form_title=None, >> button_text = None, dialog_width=1000, >> # >> ------------------------------------------------------------- >> placeholder=None >> ): >> self.request = request >> self.keyword = keyword % dict(fieldname=field.name) >> self.db = db or field._db >> self.orderby = orderby >> self.limitby = limitby >> self.min_length = min_length >> self.fields = [field] >> self.placeholder = placeholder >> if id_field: >> self.is_reference = True >> self.fields.append(id_field) >> else: >> self.is_reference = False >> if hasattr(request, 'application'): >> self.url = URL(args=request.args) >> self.callback() >> else: >> self.url = request >> # >> ---------------------------------------------------------------------- >> # From : SelectOrAddOption >> if form_title is None: >> self.form_title = current.T('Add New') >> else: >> self.form_title = current.T(form_title) >> if button_text is None: >> self.button_text = current.T('Add') >> else: >> self.button_text = current.T(button_text) >> self.dialog_width = dialog_width >> >> self.controller = controller >> self.function = function >> # >> ---------------------------------------------------------------------- >> >> def callback(self): >> if self.keyword in self.request.vars: >> field = self.fields[0] >> rows = self.db(field.like(self.request.vars[self.keyword]+'%') >> ).select(orderby=self.orderby, >> limitby=self.limitby, *self.fields) >> if rows: >> if self.is_reference: >> id_field = self.fields[1] >> raise HTTP(200, SELECT(_id=self.keyword, >> _class='autocomplete', >> _size=len(rows), >> _multiple=(len(rows) == 1), >> *[OPTION(s[field.name], >> _value=s[id_field.name], >> _selected=(k == 0)) >> for k, s in >> enumerate(rows)]).xml()) >> else: >> raise HTTP(200, SELECT(_id=self.keyword, >> _class='autocomplete', >> _size=len(rows), >> _multiple=(len(rows) == 1), >> *[OPTION(s[field.name], >> _selected=(k == 0)) >> for k, s in >> enumerate(rows)]).xml()) >> else: >> >> raise HTTP(200, '') >> >> def __call__(self, field, value, **attributes): >> # >> ---------------------------------------------------------------------- >> # From : SelectOrAddOption >> my_select_id = '%s_%s' % (field._tablename, field.name) >> # 'test_ph_eregistry_id' #select_widget.attributes.get('_id', >> None) >> >> add_args = [my_select_id] >> # create a div that will load the specified controller via ajax >> # form_loader_div = DIV(LOAD(c=self.controller, f=self.function, >> args=add_args, ajax=True), >> # _id=my_select_id + "_dialog-form", >> _title=self.form_title) >> form_loader_div = DIV(DIV(BUTTON('x', _type='button', >> _class='close', >> **{'_data-dismiss': 'modal', >> '_aria-hidden': 'true'}), >> H3(self.form_title, >> _id='myModalLabel'), _class='modal-header'), >> DIV(LOAD(c=self.controller, >> f=self.function, args=add_args, ajax=True, ajax_trap=True), >> _class='modal-body'), >> _id=my_select_id + "_modal-form", >> _class='modal hide fade', >> **{'_tabindex': '-1', '_role': 'dialog', >> '_aria-labelledby': 'myModalLabel', >> '_aria-hidden': 'true'}) >> # generate the "add" button that will appear next the options >> widget and open our modal >> activator_button = A(I(_class='icon-plus-sign icon-2x'), >> _id=my_select_id+"_option_add_trigger", >> _class='add-and-select-button') >> # create javascript for creating and opening the dialog >> # js = '$("#%s_dialog-form").dialog({' \ >> # ' autoOpen: false,' \ >> # ' show: "fade",' \ >> # ' hide: "fade",' \ >> # ' width: %s' \ >> # ' });' % (my_select_id, self.dialog_width) >> js = '$("#%s_modal-form").modal({ backdrop: true, keyboard: true, >> show: false });' % (my_select_id) >> # js += '$("#%s_option_add_trigger").click(function() {' \ >> # ' $("#%s_dialog-form").dialog("open");' \ >> # ' return false;' \ >> # ' }); ' % (my_select_id, my_select_id) >> js += '$("#%s_option_add_trigger").click(function() ' \ >> '{ $("#%s_modal-form").modal("show"); return false; }); ' % >> (my_select_id, my_select_id) >> # decorate our activator button for good measure >> js += '$(function() {' \ >> ' $("#%s_option_add_trigger").button({' \ >> ' text: true,' \ >> ' icons: {' \ >> ' primary: "ui-icon-circle-plus"' \ >> ' }' \ >> ' });' \ >> '});' % (my_select_id) >> js += '$(function() { ' \ >> ' $( "#%s_option_add_trigger" ).css("margin-left", >> "+=5"); ' \ >> '});' % (my_select_id) >> js += >> '$("#{modal_id}").appendTo("body");'.format(modal_id=my_select_id + >> "_modal-form") >> # jQuery .appendTo() move modal div in body to avoid nested form >> which are not allow in HTML >> js = """$(document).ready(function() { >> %s >> });""" % js >> jq_script = SCRIPT(js, _type="text/javascript") >> >> wrapper = DIV(_id=my_select_id+"_adder_wrapper") >> # >> ---------------------------------------------------------------------- >> default = dict( >> _type='text', >> value=(not value is None and str(value)) or '', >> ) >> attr = StringWidget._attributes(field, default, >> _placeholder=self.placeholder, **attributes) >> div_id = self.keyword+'_div' >> attr['_autocomplete'] = 'off' >> if self.is_reference: >> key2 = self.keyword+'_aux' >> key3 = self.keyword+'_auto' >> # >> ----------------------------------------------------------------------------- >> # find the longest record and set input size attribute >> accordingly >> length = self.fields[0].len() >> longest_record_length = len(self.db().select(self.fields[0], >> orderby=~length, >> limitby=(0, >> 1)).first()[self.fields[0].name]) >> attr['_size'] = int(longest_record_length * 1.20) # 20% >> wider field width >> # >> ----------------------------------------------------------------------------- >> attr['_class'] = 'string' >> name = attr['_name'] >> if 'requires' in attr: >> del attr['requires'] >> attr['_name'] = key2 >> value = attr['value'] >> record = self.db(self.fields[1] == >> value).select(self.fields[0]).first() >> attr['value'] = record and record[self.fields[0].name] >> attr['_onblur'] = "$('#%(div_id)s').delay(1000).fadeOut();" % >> \ >> dict(div_id=div_id, u='F'+self.keyword) >> # delay(500) is pretty important for "$('#%s').keyup(); >> $('#%s').blur();" >> # from the add_eregistry function >> attr['_onkeyup'] = \ >> "$('#%(key3)s').val('');" \ >> "var e = event.which?event.which:event.keyCode;" \ >> "function %(u)s() {" \ >> " $('#%(id)s').val($('#%(key)s :selected').text());" \ >> " $('#%(key3)s').val($('#%(key)s').val())" \ >> "};" \ >> "if (e == 39) %(u)s();" \ >> "else if (e == 40) {" \ >> " if ($('#%(key)s option:selected').next().length)" \ >> " $('#%(key)s option:selected').attr('selected', >> null).next().attr('selected', 'selected'); %(u)s();" \ >> "} else if (e == 38) {" \ >> " if ($('#%(key)s option:selected').prev().length)" \ >> " $('#%(key)s option:selected').attr('selected', >> null).prev().attr('selected', 'selected'); %(u)s();" \ >> "} else if ($('#%(id)s').val().length >= %(min_length)s)" >> \ >> " $.get('%(url)s?%(key)s=' + >> encodeURI($('#%(id)s').val()), function(data) {" \ >> " if (data == '')" \ >> " $('#%(key3)s').val('');" \ >> " else {" \ >> " $('#%(id)s').next('.error').hide();" \ >> " $('#%(div_id)s').html(data).show().focus();" >> \ >> " $('#%(div_id)s select').css('width', >> $('#%(id)s').css('width'));" \ >> " $('#%(key3)s').val($('#%(key)s').val());" \ >> " $('#%(key)s').change( %(u)s);" \ >> " $('#%(key)s').click( %(u)s);" \ >> " };" \ >> " });" \ >> "else $('#%(div_id)s').fadeOut();" % dict(url=self.url, >> min_length=self.min_length, >> >> key=self.keyword, id=attr['_id'], key2=key2, key3=key3, >> name=name, >> div_id=div_id, u='F'+self.keyword) >> if self.min_length == 0: >> attr['_onfocus'] = attr['_onkeyup'] >> wrapper.components.extend([TAG[''](INPUT(**attr), >> INPUT(_type='hidden', >> _id=key3, >> _value=value, >> _name=name, >> requires=field.requires), >> DIV(_id=div_id, >> _style='position:absolute;')), >> form_loader_div, >> activator_button, >> jq_script]) >> return wrapper >> else: >> attr['_name'] = field.name >> attr['_onblur'] = "$('#%(div_id)s').delay(1000).fadeOut();" % >> \ >> dict(div_id=div_id, u='F'+self.keyword) >> # delay(500) is pretty important for "$('#%s').keyup(); >> $('#%s').blur();" >> # from the add_eregistry function >> attr['_onkeyup'] = \ >> "var e = event.which?event.which:event.keyCode;" \ >> "function %(u)s() {" \ >> " $('#%(id)s').val($('#%(key)s').val())" \ >> "};" \ >> "if (e == 39) %(u)s();" \ >> "else if (e == 40) {" \ >> " if ($('#%(key)s option:selected').next().length)" \ >> " $('#%(key)s option:selected').attr('selected', >> null).next().attr('selected', 'selected'); %(u)s();" \ >> "} else if (e == 38) {" \ >> " if ($('#%(key)s option:selected').prev().length) >> $('#%(key)s option:selected').attr('selected', >> null).prev().attr('selected', 'selected'); %(u)s();" \ >> "} else if ($('#%(id)s').val().length >= %(min_length)s) >> $.get('%(url)s?%(key)s=' + encodeURI($('#%(id)s').val()), function(data) {" >> \ >> " $('#%(id)s').next('.error').hide();" \ >> " $('#%(div_id)s').html(data).show().focus();" \ >> " $('#%(div_id)s select').css('width', >> $('#%(id)s').css('width'));" \ >> " $('#%(key)s').change( %(u)s);" \ >> " $('#%(key)s').click( %(u)s);" \ >> "});" \ >> "else $('#%(div_id)s').fadeOut();" % dict(url=self.url, >> min_length=self.min_length, >> >> key=self.keyword, id=attr['_id'], div_id=div_id, >> >> u='F'+self.keyword) >> if self.min_length == 0: >> attr['_onfocus'] = attr['_onkeyup'] >> wrapper.components.extend([TAG[''](INPUT(**attr), >> DIV(_id=div_id, >> >> _style='position:absolute;')), >> form_loader_div, >> activator_button, >> jq_script]) >> return wrapper >> >> # In a model (a model file which is already call before you set your >> widget...) >> from a_widget import AutocompleteWidgetSelectOrAddOption >> >> *# In your controller * >> >> def add_function(): >> """ >> Modal form for adding element >> """ >> >> buttons = [TAG.button((I('', _class='icon-ok icon-large icon-white'), >> CAT(' '), STRONG(T('Add'))), >> _type='submit', >> _class='btn btn-small btn-primary', >> _id='add_button_id', >> _name='add_button', >> )] >> form = SQLFORM(db.table, buttons=buttons, formstyle=formstyle, >> separator=separator) >> response.js = '$(document).ready(function(){ >> $(".input_wrapper").has(".error").addClass("inputError"); ' \ >> '$(".w2p_fw").has(".error").addClass("control-group >> error"); ' \ >> '$(".w2p_fw").each(function(){ >> $(this).find(".error_wrapper").appendTo(this); }); });' >> response.js += '$(document).ready(function(){ >> $("textarea").elastic(); });' >> response.js += '$(document).ready(function () { >> $("[rel=tooltip]").tooltip(); });' >> if form.process(formname='add_form').accepted: >> response.flash = T("Added") >> target = request.args(0) >> # close modal >> response.js = >> '$("#{target}_modal-form").modal("hide");'.format(target=target) >> # update the select options >> response.js += """$("#{target}").append( >> "<option value='{new_id}'> >> {new_id} >> </option>");""".format(target=target, new_id= >> form.vars.id) >> # select newly added option >> response.js += """$("#{target}").val("{new_exp_num}"); >> $('#{target}').keyup(); $('#{target}').blur(); >> >> ... > > -- > Resources: > - http://web2py.com > - http://web2py.com/book (Documentation) > - http://github.com/web2py/web2py (Source code) > - https://code.google.com/p/web2py/issues/list (Report Issues) > --- > 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 web2py+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- 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 web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.