No problem, Richard. Thank you for your help! On Thursday, May 14, 2015 at 11:45:28 AM UTC-4, Richard wrote: > > No time to hunt the issue with multiples loading... > > I guess it could come from not using the same web2py version... Or because > I made some change over app files which are binded to web2py version > /statis/js/web2py.js for instance... or views/web2py_ajax.html > > > You have at least an semi-working example... There is 2 issues that remain > : 1) The component load the whole site which he shouldn't (that may be > related to the second issue), 2) When you access the > http://hostname/appname/second_table_form/second_table there is a weird > issue with LOAD... > > I may have more time next week, but for now, I can't help you further... > > Richard > > > On Tue, May 12, 2015 at 11:11 AM, LoveWeb2py <atayl...@gmail.com > <javascript:>> wrote: > > Repeating load might be because I extended the layout in the view for the > load. > > On Tuesday, May 12, 2015 at 10:22:41 AM UTC-4, Richard wrote: > > Almost there... I make it works, but there is something weird going on > related to component... I have to figure it out... But you were doing thing > the wrong way basically... add_function is for the main_table which > contains the city name... > > I will send you back the corrected app when I found the issue with the > repeating load... > > Richard > > On Mon, May 11, 2015 at 4:39 PM, LoveWeb2py <atayl...@gmail.com> wrote: > > No rush, Richard. Thank you for your help I really appreciate it. > > On Monday, May 11, 2015 at 4:34:14 PM UTC-4, Richard wrote: > > I will try to review it ASAP... > > On Mon, May 11, 2015 at 4:30 PM, LoveWeb2py <atayl...@gmail.com> wrote: > > Here is my dummy app, Richard. > > > On Monday, May 11, 2015 at 3:50:20 PM UTC-4, Richard wrote: > > Did you make dummy app for testing it? > > Please attach it here and I have a look to your code... I can't help much > if I don't have a good idea of what you have done... > > new_exp_num=form.vars.exp_num > > This is something I left which should be adapted to your app... > form.vars.exp_num is the representation of the new inputed record... The > same field name you specify in the widget declaration for the field > attribute : db.table.representing_field, but that you get from the form > of the referenced table. > > Richard > > > On Mon, May 11, 2015 at 3:28 PM, LoveWeb2py <atayl...@gmail.com> wrote: > > Thanks haha. Just checking. Still not having much luck. I'm getting a 500 > error on the add function and can't figure out why > > when I try to edit my site I am getting an error for the "add function" > specified to add the > https://www.mywebsite.com/add_function/second_table_field > 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(); > """.format(target=target, > > new_exp_num=form.vars.exp_num) > elif form.errors: > response.flash = '' > else: > response.flash = '' > return dict(form=form) > > Do I need to actually specify the db.table? From the looks of the class I > thought it would be defined on its own... am I wrong? > > Sorry for asking so many questions. I think this will be really helpful > when it's all finished. > > > > > On Monday, May 11, 2015 at 2:59:21 PM UTC-4, Richard wrote: > > The commented lines in the class was there because I recently refactor it > to make it use boostrap modal instead of jquery ui dialog as you may > understand carefully reading the code!! > > :-P > > Richard > > On Mon, May 11, 2015 at 2:40 PM, LoveWeb2py <atayl...@gmail.com> wrote: > > Are the commented lines necessary or was that for self reference? > > # js += '$("#%s_option_add_trigger"). > click(function() {' \ > # ' $("#%s_dialog-form").dialog("open");' \ > # ' return false;' \ > # ' }); ' % (my_select_id, my_select_id) > > > > On Thursday, May 7, 2015 at 9:33:28 AM UTC-4, Richard wrote: > > 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 <atayl...@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'] = > > ...
-- 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.