265 req._('calendar'), helperid) ) |
265 req._('calendar'), helperid) ) |
266 |
266 |
267 |
267 |
268 # ajax widgets ################################################################ |
268 # ajax widgets ################################################################ |
269 |
269 |
|
270 def init_ajax_attributes(attrs, wdgtype, loadtype=u'auto'): |
|
271 try: |
|
272 attrs[u'klass'] += u' widget' |
|
273 except KeyError: |
|
274 attrs[u'klass'] = u'widget' |
|
275 attrs.setdefault(u'cubicweb:wdgtype', wdgtype) |
|
276 attrs.setdefault(u'cubicweb:loadtype', loadtype) |
|
277 |
|
278 |
270 class AjaxWidget(FieldWidget): |
279 class AjaxWidget(FieldWidget): |
271 """simple <div> based ajax widget""" |
280 """simple <div> based ajax widget""" |
272 def __init__(self, wdgtype, inputid=None, **kwargs): |
281 def __init__(self, wdgtype, inputid=None, **kwargs): |
273 super(AjaxWidget, self).__init__(**kwargs) |
282 super(AjaxWidget, self).__init__(**kwargs) |
274 self.attrs.setdefault('class', 'widget') |
283 init_ajax_attributes(self.attrs, wdgtype) |
275 self.attrs.setdefault('cubicweb:loadtype', 'auto') |
|
276 self.attrs['cubicweb:wdgtype'] = wdgtype |
|
277 if inputid is not None: |
284 if inputid is not None: |
278 self.attrs['cubicweb:inputid'] = inputid |
285 self.attrs[u'cubicweb:inputid'] = inputid |
279 |
286 |
280 def render(self, form, field): |
287 def render(self, form, field): |
281 self.add_media(form) |
288 self.add_media(form) |
282 attrs = self._render_attrs(form, field)[-1] |
289 attrs = self._render_attrs(form, field)[-1] |
283 return tags.div(**attrs) |
290 return tags.div(**attrs) |
284 |
291 |
285 |
292 |
286 class AutoCompletionWidget(TextInput): |
293 class AutoCompletionWidget(TextInput): |
287 """ajax widget for StringField, proposing matching existing values as you |
294 """ajax widget for StringField, proposing matching existing values as you |
288 type. |
295 type. |
289 """ |
296 """ |
290 needs_js = ('cubicweb.widgets.js', 'jquery.autocomplete.js') |
297 needs_js = ('cubicweb.widgets.js', 'jquery.autocomplete.js') |
294 |
301 |
295 def _render_attrs(self, form, field): |
302 def _render_attrs(self, form, field): |
296 name, values, attrs = super(AutoCompletionWidget, self)._render_attrs(form, field) |
303 name, values, attrs = super(AutoCompletionWidget, self)._render_attrs(form, field) |
297 if not values[0]: |
304 if not values[0]: |
298 values = (INTERNAL_FIELD_VALUE,) |
305 values = (INTERNAL_FIELD_VALUE,) |
299 try: |
306 init_ajax_attributes(attrs, self.wdgtype, self.loadtype) |
300 attrs['klass'] += ' widget' |
|
301 except KeyError: |
|
302 attrs['klass'] = 'widget' |
|
303 attrs.setdefault('cubicweb:wdgtype', self.wdgtype) |
|
304 attrs.setdefault('cubicweb:loadtype', self.loadtype) |
|
305 # XXX entity form specific |
307 # XXX entity form specific |
306 attrs['cubicweb:dataurl'] = self._get_url(form.edited_entity) |
308 attrs['cubicweb:dataurl'] = self._get_url(form.edited_entity) |
307 return name, values, attrs |
309 return name, values, attrs |
308 |
310 |
309 def _get_url(self, entity): |
311 def _get_url(self, entity): |
322 class RestrictedAutoCompletionWidget(AutoCompletionWidget): |
324 class RestrictedAutoCompletionWidget(AutoCompletionWidget): |
323 """XXX describe me""" |
325 """XXX describe me""" |
324 wdgtype = 'RestrictedSuggestField' |
326 wdgtype = 'RestrictedSuggestField' |
325 |
327 |
326 |
328 |
|
329 class AddComboBoxWidget(Select): |
|
330 def _render_attrs(self, form, field): |
|
331 name, values, attrs = super(AddComboBoxWidget, self)._render_attrs(form, field) |
|
332 init_ajax_attributes(self.attrs, 'AddComboBox') |
|
333 # XXX entity form specific |
|
334 entity = form.edited_entity |
|
335 attrs['cubicweb:etype_to'] = entity.e_schema |
|
336 etype_from = entity.e_schema.subject_relation(self.name).objects(entity.e_schema)[0] |
|
337 attrs['cubicweb:etype_from'] = etype_from |
|
338 |
|
339 def render(self, form, field): |
|
340 return super(AddComboBoxWidget, self).render(form, field) + u''' |
|
341 <div id="newvalue"> |
|
342 <input type="text" id="newopt" /> |
|
343 <a href="javascript:noop()" id="add_newopt"> </a></div> |
|
344 ''' |
|
345 |
327 # buttons ###################################################################### |
346 # buttons ###################################################################### |
328 |
347 |
329 class Button(Input): |
348 class Button(Input): |
330 """<input type='button'>, base class for global form buttons""" |
349 """<input type='button'>, base class for global form buttons""" |
331 type = 'button' |
350 type = 'button' |
383 def render(self, form, field=None): |
402 def render(self, form, field=None): |
384 self.imgsrc = form.req.external_resource(self.imgressource) |
403 self.imgsrc = form.req.external_resource(self.imgressource) |
385 return '<a id="%(domid)s" href="%(href)s"><img src="%(imgsrc)s" alt="%(label)s"/>%(label)s</a>' % self.__dict__ |
404 return '<a id="%(domid)s" href="%(href)s"><img src="%(imgsrc)s" alt="%(label)s"/>%(label)s</a>' % self.__dict__ |
386 |
405 |
387 |
406 |
388 # XXX EntityLinkComboBoxWidget, AddComboBoxWidget, RawDynamicComboBoxWidget |
407 # XXX EntityLinkComboBoxWidget, [Raw]DynamicComboBoxWidget |