author | sylvain.thenault@logilab.fr |
Fri, 10 Apr 2009 16:47:15 +0200 | |
branch | tls-sprint |
changeset 1335 | 1ad1a174da77 |
parent 1330 | 92343a468e2a |
child 1336 | 2e552353c42a |
permissions | -rw-r--r-- |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
1 |
"""widget classes for form construction |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
2 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
3 |
:organization: Logilab |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
4 |
:copyright: 2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
5 |
:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
6 |
""" |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
7 |
__docformat__ = "restructuredtext en" |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
8 |
|
1096 | 9 |
from datetime import date |
10 |
||
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
11 |
from cubicweb.common import tags |
1304 | 12 |
from cubicweb.web import stdmsgs |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
13 |
|
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
14 |
|
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
15 |
class FieldWidget(object): |
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
16 |
"""abstract widget class""" |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
17 |
# javascript / css files required by the widget |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
18 |
needs_js = () |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
19 |
needs_css = () |
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
20 |
# automatically set id and tabindex attributes ? |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
21 |
setdomid = True |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
22 |
settabindex = True |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
23 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
24 |
def __init__(self, attrs=None, setdomid=None, settabindex=None): |
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
25 |
if attrs is None: |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
26 |
attrs = {} |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
27 |
self.attrs = attrs |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
28 |
if setdomid is not None: |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
29 |
# override class's default value |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
30 |
self.setdomid = setdomid |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
31 |
if settabindex is not None: |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
32 |
# override class's default value |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
33 |
self.settabindex = settabindex |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
34 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
35 |
def add_media(self, form): |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
36 |
"""adds media (CSS & JS) required by this widget""" |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
37 |
if self.needs_js: |
1096 | 38 |
form.req.add_js(self.needs_js) |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
39 |
if self.needs_css: |
1096 | 40 |
form.req.add_css(self.needs_css) |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
41 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
42 |
def render(self, form, field): |
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
43 |
"""render the widget for the given `field` of `form`. |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
44 |
To override in concrete class |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
45 |
""" |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
46 |
raise NotImplementedError |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
47 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
48 |
def _render_attrs(self, form, field): |
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
49 |
"""return html tag name, attributes and a list of values for the field |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
50 |
""" |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
51 |
name = form.context[field]['name'] |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
52 |
values = form.context[field]['value'] |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
53 |
if not isinstance(values, (tuple, list)): |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
54 |
values = (values,) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
55 |
attrs = dict(self.attrs) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
56 |
if self.setdomid: |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
57 |
attrs['id'] = form.context[field]['id'] |
1273
64e1db70161b
don't set tabindex if already in attrs
sylvain.thenault@logilab.fr
parents:
1152
diff
changeset
|
58 |
if self.settabindex and not 'tabindex' in attrs: |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
59 |
attrs['tabindex'] = form.req.next_tabindex() |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
60 |
return name, values, attrs |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
61 |
|
1096 | 62 |
|
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
63 |
class Input(FieldWidget): |
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
64 |
"""abstract widget class for <input> tag based widgets""" |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
65 |
type = None |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
66 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
67 |
def render(self, form, field): |
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
68 |
"""render the widget for the given `field` of `form`. |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
69 |
|
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
70 |
Generate one <input> tag for each field's value |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
71 |
""" |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
72 |
self.add_media(form) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
73 |
name, values, attrs = self._render_attrs(form, field) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
74 |
inputs = [tags.input(name=name, value=value, type=self.type, **attrs) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
75 |
for value in values] |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
76 |
return u'\n'.join(inputs) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
77 |
|
1096 | 78 |
|
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
79 |
# basic html widgets ########################################################### |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
80 |
|
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
81 |
class TextInput(Input): |
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
82 |
"""<input type='text'>""" |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
83 |
type = 'text' |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
84 |
|
1096 | 85 |
|
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
86 |
class PasswordInput(Input): |
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
87 |
"""<input type='password'> and its confirmation field (using |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
88 |
<field's name>-confirm as name) |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
89 |
""" |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
90 |
type = 'password' |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
91 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
92 |
def render(self, form, field): |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
93 |
self.add_media(form) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
94 |
name, values, attrs = self._render_attrs(form, field) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
95 |
assert len(values) == 1 |
1110
c71997f514ba
fix password widget: do not duplicate dom id, fix confirm field name
sylvain.thenault@logilab.fr
parents:
1096
diff
changeset
|
96 |
id = attrs.pop('id') |
1328
c050f9f8672e
password input may be used with non eidparam fields...
sylvain.thenault@logilab.fr
parents:
1311
diff
changeset
|
97 |
try: |
c050f9f8672e
password input may be used with non eidparam fields...
sylvain.thenault@logilab.fr
parents:
1311
diff
changeset
|
98 |
confirmname = '%s-confirm:%s' % tuple(name.rsplit(':', 1)) |
1329 | 99 |
except TypeError: |
1328
c050f9f8672e
password input may be used with non eidparam fields...
sylvain.thenault@logilab.fr
parents:
1311
diff
changeset
|
100 |
confirmname = '%s-confirm' % name |
1110
c71997f514ba
fix password widget: do not duplicate dom id, fix confirm field name
sylvain.thenault@logilab.fr
parents:
1096
diff
changeset
|
101 |
inputs = [tags.input(name=name, value=values[0], type=self.type, id=id, **attrs), |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
102 |
'<br/>', |
1294
870bc725cc9a
password widget should use the same value as main field for the confirm, else if we don't notice that we got a validation error while no password modification has been done
sylvain.thenault@logilab.fr
parents:
1273
diff
changeset
|
103 |
tags.input(name=confirmname, value=values[0], type=self.type, **attrs), |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
104 |
' ', tags.span(form.req._('confirm password'), |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
105 |
**{'class': 'emphasis'})] |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
106 |
return u'\n'.join(inputs) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
107 |
|
1096 | 108 |
|
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
109 |
class FileInput(Input): |
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
110 |
"""<input type='file'>""" |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
111 |
type = 'file' |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
112 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
113 |
def _render_attrs(self, form, field): |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
114 |
# ignore value which makes no sense here (XXX even on form validation error?) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
115 |
name, values, attrs = super(FileInput, self)._render_attrs(form, field) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
116 |
return name, ('',), attrs |
1096 | 117 |
|
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
118 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
119 |
class HiddenInput(Input): |
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
120 |
"""<input type='hidden'>""" |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
121 |
type = 'hidden' |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
122 |
setdomid = False # by default, don't set id attribute on hidden input |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
123 |
settabindex = False |
1096 | 124 |
|
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
125 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
126 |
class ButtonInput(Input): |
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
127 |
"""<input type='button'> |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
128 |
|
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
129 |
if you want a global form button, look at the Button, SubmitButton, |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
130 |
ResetButton and ImgButton classes below. |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
131 |
""" |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
132 |
type = 'button' |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
133 |
|
1096 | 134 |
|
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
135 |
class TextArea(FieldWidget): |
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
136 |
"""<textarea>""" |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
137 |
def render(self, form, field): |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
138 |
name, values, attrs = self._render_attrs(form, field) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
139 |
attrs.setdefault('onkeypress', 'autogrow(this)') |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
140 |
if not values: |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
141 |
value = u'' |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
142 |
elif len(values) == 1: |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
143 |
value = values[0] |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
144 |
else: |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
145 |
raise ValueError('a textarea is not supposed to be multivalued') |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
146 |
return tags.textarea(value, name=name, **attrs) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
147 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
148 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
149 |
class FCKEditor(TextArea): |
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
150 |
"""FCKEditor enabled <textarea>""" |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
151 |
def __init__(self, *args, **kwargs): |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
152 |
super(FCKEditor, self).__init__(*args, **kwargs) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
153 |
self.attrs['cubicweb:type'] = 'wysiwyg' |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
154 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
155 |
def render(self, form, field): |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
156 |
form.req.fckeditor_config() |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
157 |
return super(FCKEditor, self).render(form, field) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
158 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
159 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
160 |
class Select(FieldWidget): |
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
161 |
"""<select>, for field having a specific vocabulary""" |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
162 |
def __init__(self, attrs=None, multiple=False): |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
163 |
super(Select, self).__init__(attrs) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
164 |
self.multiple = multiple |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
165 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
166 |
def render(self, form, field): |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
167 |
name, curvalues, attrs = self._render_attrs(form, field) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
168 |
options = [] |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
169 |
for label, value in field.vocabulary(form): |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
170 |
if value in curvalues: |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
171 |
options.append(tags.option(label, value=value, selected='selected')) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
172 |
else: |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
173 |
options.append(tags.option(label, value=value)) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
174 |
return tags.select(name=name, multiple=self.multiple, |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
175 |
options=options, **attrs) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
176 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
177 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
178 |
class CheckBox(Input): |
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
179 |
"""<input type='checkbox'>, for field having a specific vocabulary. One |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
180 |
input will be generated for each possible value. |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
181 |
""" |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
182 |
type = 'checkbox' |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
183 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
184 |
def render(self, form, field): |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
185 |
name, curvalues, attrs = self._render_attrs(form, field) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
186 |
options = [] |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
187 |
for label, value in field.vocabulary(form): |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
188 |
if value in curvalues: |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
189 |
tag = tags.input(name=name, value=value, type=self.type, |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
190 |
checked='checked', **attrs) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
191 |
else: |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
192 |
tag = tags.input(name=name, value=value, type=self.type, |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
193 |
**attrs) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
194 |
options.append(tag + label) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
195 |
return '<br/>\n'.join(options) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
196 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
197 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
198 |
class Radio(Input): |
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
199 |
"""<input type='radio'>, for field having a specific vocabulary. One |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
200 |
input will be generated for each possible value. |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
201 |
""" |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
202 |
type = 'radio' |
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
203 |
setdomid = False # by default, don't set id attribute on radio input |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
204 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
205 |
def render(self, form, field): |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
206 |
name, curvalues, attrs = self._render_attrs(form, field) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
207 |
options = [] |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
208 |
for label, value in field.vocabulary(form): |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
209 |
if value in curvalues: |
1295
3012c655a94d
oops, should use input tag in radio, not option
sylvain.thenault@logilab.fr
parents:
1294
diff
changeset
|
210 |
tag = tags.input(name=name, type=self.type, value=value, |
3012c655a94d
oops, should use input tag in radio, not option
sylvain.thenault@logilab.fr
parents:
1294
diff
changeset
|
211 |
checked='checked', **attrs) |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
212 |
else: |
1295
3012c655a94d
oops, should use input tag in radio, not option
sylvain.thenault@logilab.fr
parents:
1294
diff
changeset
|
213 |
tag = tags.input(name=name, type=self.type, value=value, **attrs) |
3012c655a94d
oops, should use input tag in radio, not option
sylvain.thenault@logilab.fr
parents:
1294
diff
changeset
|
214 |
tag += label + '<br/>' |
3012c655a94d
oops, should use input tag in radio, not option
sylvain.thenault@logilab.fr
parents:
1294
diff
changeset
|
215 |
options.append(tag) |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
216 |
return '\n'.join(options) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
217 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
218 |
|
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
219 |
# javascript widgets ########################################################### |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
220 |
|
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
221 |
class DateTimePicker(TextInput): |
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
222 |
"""<input type='text' + javascript date/time picker for date or datetime |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
223 |
fields |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
224 |
""" |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
225 |
monthnames = ('january', 'february', 'march', 'april', |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
226 |
'may', 'june', 'july', 'august', |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
227 |
'september', 'october', 'november', 'december') |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
228 |
daynames = ('monday', 'tuesday', 'wednesday', 'thursday', |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
229 |
'friday', 'saturday', 'sunday') |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
230 |
|
1311
4cc6e2723dc7
move ajax.js to base form class
sylvain.thenault@logilab.fr
parents:
1304
diff
changeset
|
231 |
needs_js = ('cubicweb.calendar.js',) |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
232 |
needs_css = ('cubicweb.calendar_popup.css',) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
233 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
234 |
@classmethod |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
235 |
def add_localized_infos(cls, req): |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
236 |
"""inserts JS variables defining localized months and days""" |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
237 |
# import here to avoid dependancy from cubicweb-common to simplejson |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
238 |
_ = req._ |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
239 |
monthnames = [_(mname) for mname in cls.monthnames] |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
240 |
daynames = [_(dname) for dname in cls.daynames] |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
241 |
req.html_headers.define_var('MONTHNAMES', monthnames) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
242 |
req.html_headers.define_var('DAYNAMES', daynames) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
243 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
244 |
def render(self, form, field): |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
245 |
txtwidget = super(DateTimePicker, self).render(form, field) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
246 |
self.add_localized_infos(form.req) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
247 |
cal_button = self._render_calendar_popup(form, field) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
248 |
return txtwidget + cal_button |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
249 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
250 |
def _render_calendar_popup(self, form, field): |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
251 |
req = form.req |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
252 |
value = form.context[field]['rawvalue'] |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
253 |
inputid = form.context[field]['id'] |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
254 |
helperid = '%shelper' % inputid |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
255 |
if not value: |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
256 |
value = date.today() |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
257 |
year, month = value.year, value.month |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
258 |
return (u"""<a onclick="toggleCalendar('%s', '%s', %s, %s);" class="calhelper"> |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
259 |
<img src="%s" title="%s" alt="" /></a><div class="calpopup hidden" id="%s"></div>""" |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
260 |
% (helperid, inputid, year, month, |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
261 |
req.external_resource('CALENDAR_ICON'), |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
262 |
req._('calendar'), helperid) ) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
263 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
264 |
|
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
265 |
# ajax widgets ################################################################ |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
266 |
|
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
267 |
class AjaxWidget(FieldWidget): |
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
268 |
"""simple <div> based ajax widget""" |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
269 |
def __init__(self, wdgtype, inputid=None, **kwargs): |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
270 |
super(AjaxWidget, self).__init__(**kwargs) |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
271 |
self.attrs.setdefault('class', 'widget') |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
272 |
self.attrs.setdefault('cubicweb:loadtype', 'auto') |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
273 |
self.attrs['cubicweb:wdgtype'] = wdgtype |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
274 |
if inputid is not None: |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
275 |
self.attrs['cubicweb:inputid'] = inputid |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
276 |
|
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
277 |
def render(self, form, field): |
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
278 |
self.add_media(form) |
1147 | 279 |
attrs = self._render_attrs(form, field)[-1] |
1081
f2a85f52b9e5
move fields and widgets to their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
280 |
return tags.div(**attrs) |
1304 | 281 |
|
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
282 |
|
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
283 |
class AutoCompletionWidget(TextInput): |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
284 |
"""ajax widget for StringField, proposing matching existing values as you |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
285 |
type. |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
286 |
""" |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
287 |
needs_js = ('cubicweb.widgets.js', 'jquery.autocomplete.js') |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
288 |
needs_css = ('jquery.autocomplete.css',) |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
289 |
wdgtype = 'SuggestField' |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
290 |
loadtype = 'auto' |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
291 |
|
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
292 |
def _render_attrs(self, form, field): |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
293 |
name, values, attrs = super(AutoCompletionWidget, self)._render_attrs(form, field) |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
294 |
if not values[0]: |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
295 |
values = (INTERNAL_FIELD_VALUE,) |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
296 |
try: |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
297 |
attrs['klass'] += ' widget' |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
298 |
except KeyError: |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
299 |
attrs['klass'] = 'widget' |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
300 |
attrs.setdefault('cubicweb:wdgtype', self.wdgtype) |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
301 |
attrs.setdefault('cubicweb:loadtype', self.loadtype) |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
302 |
# XXX entity form specific |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
303 |
attrs['cubicweb:dataurl'] = self._get_url(form.edited_entity) |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
304 |
return name, values, attrs |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
305 |
|
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
306 |
def _get_url(self, entity): |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
307 |
return entity.req.build_url('json', fname=entity.autocomplete_initfuncs[self.rschema], |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
308 |
pageid=entity.req.pageid, mode='remote') |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
309 |
|
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
310 |
|
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
311 |
class StaticFileAutoCompletionWidget(AutoCompletionWidget): |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
312 |
"""XXX describe me""" |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
313 |
wdgtype = 'StaticFileSuggestField' |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
314 |
|
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
315 |
def _get_url(self, entity): |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
316 |
return entity.req.datadir_url + entity.autocomplete_initfuncs[self.rschema] |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
317 |
|
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
318 |
|
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
319 |
class RestrictedAutoCompletionWidget(AutoCompletionWidget): |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
320 |
"""XXX describe me""" |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
321 |
wdgtype = 'RestrictedSuggestField' |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
322 |
|
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
323 |
|
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
324 |
# buttons ###################################################################### |
1304 | 325 |
|
326 |
class Button(Input): |
|
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
327 |
"""<input type='button'>, base class for global form buttons""" |
1304 | 328 |
type = 'button' |
329 |
def __init__(self, label=stdmsgs.BUTTON_OK, attrs=None, |
|
330 |
setdomid=None, settabindex=None, |
|
331 |
name='', value='', onclick=None, cwaction=None): |
|
332 |
super(Button, self).__init__(attrs, setdomid, settabindex) |
|
333 |
self.label = label |
|
334 |
self.name = name |
|
335 |
self.value = '' |
|
336 |
self.onclick = onclick |
|
337 |
self.cwaction = cwaction |
|
338 |
self.attrs.setdefault('klass', 'validateButton') |
|
339 |
||
340 |
def render(self, form, field=None): |
|
341 |
label = form.req._(self.label) |
|
342 |
attrs = self.attrs.copy() |
|
343 |
if self.cwaction: |
|
344 |
assert self.onclick is None |
|
345 |
attrs['onclick'] = "postForm('__action_%s', \'%s\', \'%s\')" % ( |
|
346 |
self.cwaction, self.label, form.domid) |
|
347 |
elif self.onclick: |
|
348 |
attrs['onclick'] = self.onclick |
|
349 |
if self.name: |
|
350 |
attrs['name'] = name |
|
351 |
if self.setdomid: |
|
352 |
attrs['id'] = self.name |
|
353 |
if self.settabindex and not 'tabindex' in attrs: |
|
354 |
attrs['tabindex'] = form.req.next_tabindex() |
|
355 |
return tags.input(value=label, type=self.type, **attrs) |
|
356 |
||
357 |
||
358 |
class SubmitButton(Button): |
|
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
359 |
"""<input type='submit'>, main button to submit a form""" |
1304 | 360 |
type = 'submit' |
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
361 |
|
1304 | 362 |
|
363 |
class ResetButton(Button): |
|
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
364 |
"""<input type='reset'>, main button to reset a form. |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
365 |
You usually don't want this. |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
366 |
""" |
1304 | 367 |
type = 'reset' |
368 |
||
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
369 |
|
1304 | 370 |
class ImgButton(object): |
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
371 |
"""<img> wrapped into a <a> tag with href triggering something (usually a |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
372 |
javascript call) |
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
373 |
""" |
1304 | 374 |
def __init__(self, domid, href, label, imgressource): |
375 |
self.domid = domid |
|
376 |
self.href = href |
|
377 |
self.imgressource = imgressource |
|
378 |
self.label = label |
|
379 |
||
380 |
def render(self, form, field=None): |
|
381 |
self.imgsrc = form.req.external_resource(self.imgressource) |
|
382 |
return '<a id="%(domid)s" href="%(href)s"><img src="%(imgsrc)s" alt="%(label)s"/>%(label)s</a>' % self.__dict__ |
|
383 |
||
384 |
||
1330
92343a468e2a
add some documentation, backport *CompletionWidget
sylvain.thenault@logilab.fr
parents:
1329
diff
changeset
|
385 |
# XXX EntityLinkComboBoxWidget, AddComboBoxWidget, RawDynamicComboBoxWidget |