38 from warnings import warn |
38 from warnings import warn |
39 |
39 |
40 from logilab.common import dictattr |
40 from logilab.common import dictattr |
41 from logilab.mtconverter import xml_escape |
41 from logilab.mtconverter import xml_escape |
42 |
42 |
43 from cubicweb import tags |
43 from cubicweb import tags, uilib |
44 from cubicweb.appobject import AppObject |
44 from cubicweb.appobject import AppObject |
45 from cubicweb.selectors import is_instance, yes |
45 from cubicweb.selectors import is_instance, yes |
46 from cubicweb.utils import json_dumps, support_args |
46 from cubicweb.utils import json_dumps, support_args |
47 from cubicweb.web import eid_param, formwidgets as fwdgs |
47 from cubicweb.web import eid_param, formwidgets as fwdgs |
48 |
48 |
110 self._set_options(values) |
110 self._set_options(values) |
111 form.add_media() |
111 form.add_media() |
112 data = [] |
112 data = [] |
113 _w = data.append |
113 _w = data.append |
114 _w(self.open_form(form, values)) |
114 _w(self.open_form(form, values)) |
115 if self.display_progress_div: |
115 self.render_content(_w, form, values) |
116 _w(u'<div id="progress">%s</div>' % self._cw._('validating...')) |
|
117 _w(u'\n<fieldset>\n') |
|
118 self.render_fields(_w, form, values) |
|
119 self.render_buttons(_w, form) |
|
120 _w(u'\n</fieldset>\n') |
|
121 _w(self.close_form(form, values)) |
116 _w(self.close_form(form, values)) |
122 errormsg = self.error_message(form) |
117 errormsg = self.error_message(form) |
123 if errormsg: |
118 if errormsg: |
124 data.insert(0, errormsg) |
119 data.insert(0, errormsg) |
125 w(''.join(data)) |
120 w(''.join(data)) |
|
121 |
|
122 def render_content(self, w, form, values): |
|
123 if self.display_progress_div: |
|
124 w(u'<div id="progress">%s</div>' % self._cw._('validating...')) |
|
125 w(u'\n<fieldset>\n') |
|
126 self.render_fields(w, form, values) |
|
127 self.render_buttons(w, form) |
|
128 w(u'\n</fieldset>\n') |
126 |
129 |
127 def render_label(self, form, field): |
130 def render_label(self, form, field): |
128 if field.label is None: |
131 if field.label is None: |
129 return u'' |
132 return u'' |
130 label = field_label(form, field) |
133 label = field_label(form, field) |
177 if len(errors) > 1: |
180 if len(errors) > 1: |
178 errormsg = '<ul>%s</ul>' % errormsg |
181 errormsg = '<ul>%s</ul>' % errormsg |
179 return u'<div class="errorMessage">%s</div>' % errormsg |
182 return u'<div class="errorMessage">%s</div>' % errormsg |
180 return u'' |
183 return u'' |
181 |
184 |
182 def open_form(self, form, values): |
185 def open_form(self, form, values, **attrs): |
183 if form.needs_multipart: |
186 if form.needs_multipart: |
184 enctype = u'multipart/form-data' |
187 enctype = u'multipart/form-data' |
185 else: |
188 else: |
186 enctype = u'application/x-www-form-urlencoded' |
189 enctype = u'application/x-www-form-urlencoded' |
187 tag = (u'<form action="%s" method="post" enctype="%s"' % ( |
190 attrs.setdefault('enctype', enctype) |
188 xml_escape(form.form_action() or '#'), enctype)) |
191 attrs.setdefault('method', 'post') |
|
192 attrs.setdefault('action', form.form_action() or '#') |
189 if form.domid: |
193 if form.domid: |
190 tag += u' id="%s"' % form.domid |
194 attrs.setdefault('id', form.domid) |
191 if form.onsubmit: |
195 if form.onsubmit: |
192 tag += u' onsubmit="%s"' % xml_escape(form.onsubmit % dictattr(form)) |
196 attrs.setdefault('onsubmit', form.onsubmit % dictattr(form)) |
193 if form.cssstyle: |
197 if form.cssstyle: |
194 tag += u' style="%s"' % xml_escape(form.cssstyle) |
198 attrs.setdefault('style', form.cssstyle) |
195 if form.cssclass: |
199 if form.cssclass: |
196 tag += u' class="%s"' % xml_escape(form.cssclass) |
200 attrs.setdefault('class', form.cssclass) |
197 if form.cwtarget: |
201 if form.cwtarget: |
198 tag += u' cubicweb:target="%s"' % xml_escape(form.cwtarget) |
202 attrs.setdefault('cubicweb:target', form.cwtarget) |
199 return tag + u'>' |
203 return '<form %s>' % uilib.sgml_attributes(attrs) |
200 |
204 |
201 def close_form(self, form, values): |
205 def close_form(self, form, values): |
202 """seems dumb but important for consistency w/ close form, and necessary |
206 """seems dumb but important for consistency w/ close form, and necessary |
203 for form renderers overriding open_form to use something else or more than |
207 for form renderers overriding open_form to use something else or more than |
204 and <form> |
208 and <form> |