On Dec 12, 2006, at 8:54 PM, Paul Johnston wrote: > I'm developing a form, that includes a SingleSelectField. Depending on > the value entered in that field, different supplemental questions are > asked. To do this I've created the HidingSingleSelectField widget. If > you're interested, I've created a sample app that does this > http://pajhome.org.uk/hssf.tar.gz > > Can this be added to the standard widgets? I think other people would > find this useful.
TG 1.0 is currently in a feature freeze so I guess the answer would be no... However, you could build a skeleton widget egg by running tg-admin quickstart -twidget HidingSingleSelectField and distrubute the widget as stand-alone component we could download and install when needed. The setup.py that tg-admin will generate includes metadata so the CogBin (http://www.turbogears.org/cogbin) can find it once you register it at PyPI. > > Some work would be required to make it releasable. Currently it works > purely in javascript, using HTML IDs to determine which areas to hide. hmmm, maybe it would be easier and more portable to find the areas you want to hide using javascript only instead of needing to modify the template that should render the widget. For example: from turbojson import jsonify from turbogears.widgets import * class HiddingSelectField(SingleSelectField): #hide targets is a list (or dict) of targets that should be hidden indexed # by the option in the selectfield. If using jQuery you could reference # contactType_1 in your example easily using XPath: # # For your example you would pass: # ["[EMAIL PROTECTED]/../../", "input [EMAIL PROTECTED]/../../"] # so option 0 hides the tr enclosing company and 1 the one enclosing nickname params = ["hide_targets"] hide_targets = [] javascript = [hssf_js] def update_params(self, d): super(....) # JSON encode it to pass them as parameters to the JS constructor d['hide_targets'] = jsonify.encode(d['hide_targets'] ) Then customize the SSF's template to initialize a JS object that will take care of hiding the divs: <div xmlns:py="http://purl.org/kid/ns#"> <select name="${name}" class="${field_class}" id="${field_id}" py:attrs="attrs" > <optgroup py:for="group, options in grouped_options" label="${group}" py:strip="not group" > <option py:for="value, desc, attrs in options" value="${value}" py:attrs="attrs" py:content="desc" /> </optgroup> </select> <script type="text/javascript"> InitializeHSSF("${field_id}", ${hide_targets}) </script> </div> InitializeHSSF should take care of connecting an event handler to the select's 'change' event (referenced by it's id) that checks what option was selected, use it as a key to look up the target in the targets array/hash, reference it and show/hide/toggle it (could be a 3 liners in jQuery ;) BTW, in ToscaWidgets you could build that <script></script> as a JSSource inside __init__ (because the effective DOM id can be known at this time) and put it in the widget's javascript list so you don't need to modify the template... What's particulary attractive of this soultion is that once the select field is debugged and packed, it can be included in any form and can reference any element we want by just passing it parameters from python (the js-python impedance-mismatch soother) > This means you have to define the form long-hand in the template. > If we > can find some way to express this relationship between widgets, the > default forms could be used. Hmm, I'm not sure you want to relate other widget's but DOM element's instead.... else you'll have to make a widget out of a <tr> which would be overkill IMO... HTH, Alberto --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "TurboGears" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/turbogears?hl=en -~----------~----~----~----~------~----~------~--~---

