diff -r 0b53e850cdb5 -r 3d731478d9a8 web/formwidgets.py --- a/web/formwidgets.py Thu Jan 21 10:42:37 2010 +0100 +++ b/web/formwidgets.py Thu Jan 21 10:47:01 2010 +0100 @@ -593,4 +593,77 @@ # more widgets ################################################################# -# XXX EntityLinkComboBoxWidget, [Raw]DynamicComboBoxWidget +class EditableURLWidget(TextInput): + """custom widget to edit separatly an url path / query string (used by + default for Bookmark.path for instance), dealing with url quoting nicely + (eg user edit the unquoted value). + """ + type = 'text' + + def render(self, form, field, renderer): + """render the widget for the given `field` of `form`. + + Generate one tag for each field's value + """ + self.add_media(form) + req = form._cw + pathqname = field.input_name(form, 'path') + fqsqname = field.input_name(form, 'fqs') # formatted query string + if pathqname in form.form_previous_values: + path = form.form_previous_values[pathqname] + fqs = form.form_previous_values[fqsqname] + else: + if field.name in req.form: + value = req.form[field.name] + else: + value = self.typed_value(form, field) + try: + path, qs = value.split('?', 1) + except ValueError: + path = value + qs = '' + fqs = u'\n'.join(u'%s=%s' % (k, v) for k, v in req.url_parse_qsl(qs)) + attrs = dict(self.attrs) + if self.setdomid: + attrs['id'] = field.dom_id(form) + if self.settabindex and not 'tabindex' in attrs: + attrs['tabindex'] = req.next_tabindex() + # ensure something is rendered + inputs = [u'
', + req._('i18n_bookmark_url_path'), + u' | ', + tags.input(name=pathqname, type='string', value=path, **attrs), + u' |
---|---|
', + req._('i18n_bookmark_url_fqs'), + u' | '] + if self.setdomid: + attrs['id'] = field.dom_id(form, 'fqs') + if self.settabindex: + attrs['tabindex'] = req.next_tabindex() + attrs.setdefault('onkeyup', 'autogrow(this)') + inputs += [tags.textarea(fqs, name=fqsqname, **attrs), + u' |