Skip to content

Commit 8b982f9

Browse files
committed
Merge pull request #15 from tahajahangir/bootstrap3
Bootstrap style <select>s and optional better renderers for relations
2 parents 973b1d0 + e9a733f commit 8b982f9

File tree

21 files changed

+2281
-51
lines changed

21 files changed

+2281
-51
lines changed
Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,31 @@
11
from fanstatic import Group, Library, Resource
22
from js.jquery import jquery
33
from js.jqueryui import jqueryui
4-
from js.bootstrap import bootstrap
4+
from js.bootstrap import bootstrap as bootstrap_orig
55
from js.jquery_tablesorter import tablesorter
66
from fa.jquery.fanstatic_resources import fa_js
77

88
fa_bootstrap_library = Library('fa_bootstrap', 'static')
99
listing = Resource(fa_bootstrap_library, 'js/listing.js', depends=[jquery])
1010
autocomplete = Resource(fa_bootstrap_library, 'js/autocomplete.js', depends=[jqueryui, fa_js])
1111

12-
bootstrap = Group([listing, bootstrap, tablesorter])
12+
13+
# bootstrap-select
14+
select_picker_js = Resource(fa_bootstrap_library, 'js/bootstrap-select.js', depends=[bootstrap_orig],
15+
minified='js/bootstrap-select.min.js')
16+
select_picker_css = Resource(fa_bootstrap_library, 'css/bootstrap-select.css')
17+
bselect_initializer = Resource(fa_bootstrap_library, 'bootstrap_select/..',
18+
renderer=lambda _: "<script>$(function(){$('.selectpicker').selectpicker()})</script>")
19+
select_picker = Group([select_picker_js, select_picker_css, bselect_initializer])
20+
21+
22+
# dual list box
23+
duallistbox_js = Resource(fa_bootstrap_library, 'js/jquery.bootstrap-duallistbox.js', depends=[bootstrap_orig],
24+
minified='js/jquery.bootstrap-duallistbox.min.js')
25+
duallistbox_css = Resource(fa_bootstrap_library, 'css/bootstrap-duallistbox.css')
26+
duallistbox_initializer_renderer = lambda _: "<script>$(function(){$('.duallistbox').bootstrapDualListbox()})</script>"
27+
duallistbox_initializer = Resource(fa_bootstrap_library, 'dual_init/..', renderer=duallistbox_initializer_renderer)
28+
duallistbox = Group([duallistbox_js, duallistbox_css, duallistbox_initializer])
29+
30+
31+
bootstrap = Group([listing, bootstrap_orig, tablesorter])

fa/bootstrap/forms.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,7 @@ class BootstrapFieldSet(FieldSet):
1313
fatypes.Numeric: renderers.BootstrapFloatFieldRenderer,
1414
fatypes.Interval: renderers.BootstrapIntervalFieldRenderer,
1515
fatypes.Boolean: renderers.BootstrapBooleanFieldRenderer,
16+
fatypes.Set: renderers.BootstrapSelectFieldRenderer,
17+
fatypes.List: renderers.BootstrapSelectFieldRenderer,
18+
'dropdown': renderers.BootstrapSelectFieldRenderer,
1619
})
55 Bytes
Binary file not shown.

fa/bootstrap/locale/de/LC_MESSAGES/fa_bootstrap.po

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ msgid ""
88
msgstr ""
99
"Project-Id-Version: fa.bootstrap 0.3.4.dev0\n"
1010
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
11-
"POT-Creation-Date: 2014-04-06 14:57+0430\n"
11+
"POT-Creation-Date: 2014-04-22 18:34+0430\n"
1212
"PO-Revision-Date: 2014-04-06 15:13+0430\n"
1313
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1414
"Language-Team: de <[email protected]>\n"
@@ -18,31 +18,35 @@ msgstr ""
1818
"Content-Transfer-Encoding: 8bit\n"
1919
"Generated-By: Babel 1.3\n"
2020

21-
#: fa/bootstrap/actions.py:76
21+
#: fa/bootstrap/actions.py:87
2222
msgid "New ${model_label}"
2323
msgstr "Hinzufügen: ${model_label}"
2424

25-
#: fa/bootstrap/actions.py:86
25+
#: fa/bootstrap/actions.py:97
2626
msgid "Save"
2727
msgstr "Speichern"
2828

29-
#: fa/bootstrap/actions.py:95
29+
#: fa/bootstrap/actions.py:105
3030
msgid "Save and add another"
3131
msgstr "Speichern und weitere Hinzufügen"
3232

33-
#: fa/bootstrap/actions.py:106
33+
#: fa/bootstrap/actions.py:116
3434
msgid "Edit"
3535
msgstr "Bearbeiten"
3636

37-
#: fa/bootstrap/actions.py:115
37+
#: fa/bootstrap/actions.py:125
3838
msgid "Back"
3939
msgstr "Zurück"
4040

41-
#: fa/bootstrap/actions.py:122
41+
#: fa/bootstrap/actions.py:132
4242
msgid "Delete"
4343
msgstr "Löschen"
4444

45-
#: fa/bootstrap/actions.py:133
45+
#: fa/bootstrap/actions.py:143
4646
msgid "Cancel"
4747
msgstr "Abbrechen"
4848

49+
#: fa/bootstrap/templates/admin/new.pt:6
50+
msgid "Add new item"
51+
msgstr "Neues Element hinzufügen"
52+
67 Bytes
Binary file not shown.

fa/bootstrap/locale/fa/LC_MESSAGES/fa_bootstrap.po

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ msgid ""
88
msgstr ""
99
"Project-Id-Version: fa.bootstrap 0.3.4.dev0\n"
1010
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
11-
"POT-Creation-Date: 2014-04-06 14:57+0430\n"
11+
"POT-Creation-Date: 2014-04-22 18:34+0430\n"
1212
"PO-Revision-Date: 2014-04-06 17:07+0430\n"
1313
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1414
"Language-Team: fa <[email protected]>\n"
@@ -18,31 +18,35 @@ msgstr ""
1818
"Content-Transfer-Encoding: 8bit\n"
1919
"Generated-By: Babel 1.3\n"
2020

21-
#: fa/bootstrap/actions.py:76
21+
#: fa/bootstrap/actions.py:87
2222
msgid "New ${model_label}"
2323
msgstr "${model_label} جدید"
2424

25-
#: fa/bootstrap/actions.py:86
25+
#: fa/bootstrap/actions.py:97
2626
msgid "Save"
2727
msgstr "ذخیره"
2828

29-
#: fa/bootstrap/actions.py:95
29+
#: fa/bootstrap/actions.py:105
3030
msgid "Save and add another"
3131
msgstr "ذخیره و ایجاد بعدی"
3232

33-
#: fa/bootstrap/actions.py:106
33+
#: fa/bootstrap/actions.py:116
3434
msgid "Edit"
3535
msgstr "ویرایش"
3636

37-
#: fa/bootstrap/actions.py:115
37+
#: fa/bootstrap/actions.py:125
3838
msgid "Back"
3939
msgstr "بازگشت"
4040

41-
#: fa/bootstrap/actions.py:122
41+
#: fa/bootstrap/actions.py:132
4242
msgid "Delete"
4343
msgstr "حذف"
4444

45-
#: fa/bootstrap/actions.py:133
45+
#: fa/bootstrap/actions.py:143
4646
msgid "Cancel"
4747
msgstr "انصراف"
4848

49+
#: fa/bootstrap/templates/admin/new.pt:6
50+
msgid "Add new item"
51+
msgstr "اضافه کردن مورد جدید"
52+

fa/bootstrap/locale/fa_bootstrap.pot

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
#, fuzzy
77
msgid ""
88
msgstr ""
9-
"Project-Id-Version: fa.bootstrap 0.3.4.dev0\n"
9+
"Project-Id-Version: fa.bootstrap 0.3.4.dev1\n"
1010
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
11-
"POT-Creation-Date: 2014-04-06 14:57+0430\n"
11+
"POT-Creation-Date: 2014-04-22 18:34+0430\n"
1212
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1313
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1414
"Language-Team: LANGUAGE <[email protected]>\n"
@@ -17,31 +17,35 @@ msgstr ""
1717
"Content-Transfer-Encoding: 8bit\n"
1818
"Generated-By: Babel 1.3\n"
1919

20-
#: fa/bootstrap/actions.py:76
20+
#: fa/bootstrap/actions.py:87
2121
msgid "New ${model_label}"
2222
msgstr ""
2323

24-
#: fa/bootstrap/actions.py:86
24+
#: fa/bootstrap/actions.py:97
2525
msgid "Save"
2626
msgstr ""
2727

28-
#: fa/bootstrap/actions.py:95
28+
#: fa/bootstrap/actions.py:105
2929
msgid "Save and add another"
3030
msgstr ""
3131

32-
#: fa/bootstrap/actions.py:106
32+
#: fa/bootstrap/actions.py:116
3333
msgid "Edit"
3434
msgstr ""
3535

36-
#: fa/bootstrap/actions.py:115
36+
#: fa/bootstrap/actions.py:125
3737
msgid "Back"
3838
msgstr ""
3939

40-
#: fa/bootstrap/actions.py:122
40+
#: fa/bootstrap/actions.py:132
4141
msgid "Delete"
4242
msgstr ""
4343

44-
#: fa/bootstrap/actions.py:133
44+
#: fa/bootstrap/actions.py:143
4545
msgid "Cancel"
4646
msgstr ""
4747

48+
#: fa/bootstrap/templates/admin/new.pt:6
49+
msgid "Add new item"
50+
msgstr ""
51+
57 Bytes
Binary file not shown.

fa/bootstrap/locale/fr/LC_MESSAGES/fa_bootstrap.po

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ msgid ""
88
msgstr ""
99
"Project-Id-Version: fa.bootstrap 0.3.4.dev0\n"
1010
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
11-
"POT-Creation-Date: 2014-04-06 14:57+0430\n"
11+
"POT-Creation-Date: 2014-04-22 18:34+0430\n"
1212
"PO-Revision-Date: 2014-04-06 16:45+0430\n"
1313
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1414
"Language-Team: fr <[email protected]>\n"
@@ -18,31 +18,35 @@ msgstr ""
1818
"Content-Transfer-Encoding: 8bit\n"
1919
"Generated-By: Babel 1.3\n"
2020

21-
#: fa/bootstrap/actions.py:76
21+
#: fa/bootstrap/actions.py:87
2222
msgid "New ${model_label}"
2323
msgstr "Nouveau ${model_label}"
2424

25-
#: fa/bootstrap/actions.py:86
25+
#: fa/bootstrap/actions.py:97
2626
msgid "Save"
2727
msgstr "Sauver"
2828

29-
#: fa/bootstrap/actions.py:95
29+
#: fa/bootstrap/actions.py:105
3030
msgid "Save and add another"
3131
msgstr "Sauver et ajouter un autre"
3232

33-
#: fa/bootstrap/actions.py:106
33+
#: fa/bootstrap/actions.py:116
3434
msgid "Edit"
3535
msgstr "Editer"
3636

37-
#: fa/bootstrap/actions.py:115
37+
#: fa/bootstrap/actions.py:125
3838
msgid "Back"
3939
msgstr "Retour"
4040

41-
#: fa/bootstrap/actions.py:122
41+
#: fa/bootstrap/actions.py:132
4242
msgid "Delete"
4343
msgstr "Supprimer"
4444

45-
#: fa/bootstrap/actions.py:133
45+
#: fa/bootstrap/actions.py:143
4646
msgid "Cancel"
4747
msgstr "Annuler"
4848

49+
#: fa/bootstrap/templates/admin/new.pt:6
50+
msgid "Add new item"
51+
msgstr "Ajouter un nouvel élément"
52+

fa/bootstrap/renderers.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def render(self, **kwargs):
5959
if 'class' in kwargs:
6060
kwargs['class'] += ' form-control'
6161
else:
62-
kwargs['class'] = ' form-control'
62+
kwargs['class'] = 'form-control'
6363
return super(BootstrapFieldMixin, self).render(**kwargs)
6464

6565

@@ -84,3 +84,32 @@ class BootstrapFloatFieldRenderer(BootstrapFieldMixin, fields.FloatFieldRenderer
8484

8585
class BootstrapIntervalFieldRenderer(BootstrapFieldMixin, fields.IntervalFieldRenderer):
8686
pass
87+
88+
89+
class BootstrapSelectFieldRenderer(BootstrapFieldMixin, fields.SelectFieldRenderer):
90+
"""
91+
accepts "width" option add applies it by patching style attribute
92+
"""
93+
def render(self, **kwargs):
94+
auto_width = kwargs.pop('width', None)
95+
if auto_width:
96+
kwargs['style'] = kwargs.get('style', '') + '; width: ' + str(auto_width)
97+
return super(BootstrapSelectFieldRenderer, self).render(**kwargs)
98+
99+
100+
class BootstrapSelectPickerFieldRenderer(BootstrapSelectFieldRenderer):
101+
"""
102+
Options can be configured via data-* attributes
103+
"""
104+
def render(self, **kwargs):
105+
fanstatic_resources.select_picker.need()
106+
kwargs['class'] = kwargs.get('class', '') + ' selectpicker'
107+
# kwargs['data-live-search'] = 'true'
108+
return fields.SelectFieldRenderer.render(self, **kwargs)
109+
110+
111+
class DualListBoxFieldRenderer(BootstrapSelectFieldRenderer):
112+
def render(self, **kwargs):
113+
fanstatic_resources.duallistbox.need()
114+
kwargs['class'] = kwargs.get('class', '') + ' duallistbox'
115+
return fields.SelectFieldRenderer.render(self, **kwargs)

0 commit comments

Comments
 (0)