summaryrefslogtreecommitdiff
path: root/ishtar/furnitures/widgets.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar/furnitures/widgets.py')
-rw-r--r--ishtar/furnitures/widgets.py95
1 files changed, 72 insertions, 23 deletions
diff --git a/ishtar/furnitures/widgets.py b/ishtar/furnitures/widgets.py
index 5d184f123..5d2fc7c38 100644
--- a/ishtar/furnitures/widgets.py
+++ b/ishtar/furnitures/widgets.py
@@ -24,7 +24,7 @@ from django.forms.widgets import flatatt
from django.utils.encoding import smart_unicode
from django.utils.html import escape
from django.utils.simplejson import JSONEncoder
-from django.core.urlresolvers import resolve
+from django.core.urlresolvers import resolve, reverse
from django.utils.translation import ugettext_lazy as _
from ishtar import settings
@@ -50,7 +50,8 @@ class JQueryDate(forms.TextInput):
return rendered
class JQueryAutoComplete(forms.TextInput):
- def __init__(self, source, associated_model=None, options={}, attrs={}):
+ def __init__(self, source, associated_model=None, options={}, attrs={},
+ new=False):
"""
Source can be a list containing the autocomplete values or a
string containing the url used for the request.
@@ -62,6 +63,7 @@ class JQueryAutoComplete(forms.TextInput):
if len(options) > 0:
self.options = JSONEncoder().encode(options)
self.attrs.update(attrs)
+ self.new = new
def render_js(self, field_id):
if isinstance(self.source, list):
@@ -111,7 +113,13 @@ objects.get(pk=value))
attrs_select['id'] = 'id_select_%s' % name
if 'class' not in attrs_select:
attrs_select['class'] = 'autocomplete'
- return u'''<input%(attrs_select)s/>\
+ new = ''
+ if self.new:
+ model_name = self.associated_model._meta.object_name.lower()
+ new = u' <a href="#" onclick="open_window(\'%s\');">%s</a>' % \
+ (reverse('new-' + model_name, args=[attrs_select['id'], attrs_hidden['id']]),
+ unicode(_(u"Add")))
+ html = u'''<input%(attrs_select)s/>%(new)s\
<input type="hidden"%(attrs_hidden)s/>\
<script type="text/javascript"><!--//
$(function() {%(js)s});//--></script>
@@ -119,7 +127,9 @@ objects.get(pk=value))
'attrs_select' : flatatt(attrs_select),
'attrs_hidden' : flatatt(attrs_hidden),
'js' : self.render_js(name),
+ 'new':new
}
+ return html
class JQueryJqGrid(forms.RadioSelect):
COL_TPL = "{name:'%(idx)s', index:'%(idx)s', sortable:true}"
@@ -128,15 +138,17 @@ class JQueryJqGrid(forms.RadioSelect):
settings.COUNTRY),
'%s/js/jquery.jqGrid.min.js' % settings.MEDIA_URL,
]
- css = {'all':['%s/media/ui.jqgrid.css' % settings.MEDIA_URL]}
+ css = {'all':['%s/media/ui.jqgrid.css' % settings.MEDIA_URL,
+ ]}
def __init__(self, source, form, associated_model, attrs={},
- table_cols='TABLE_COLS'):
+ table_cols='TABLE_COLS', multiple=False):
self.source = source
self.form = form
self.attrs = attrs
self.associated_model = associated_model
self.table_cols = table_cols
+ self.multiple = multiple
def render(self, name, value=None, attrs=None):
rendered = unicode(self.form)
@@ -171,18 +183,25 @@ class JQueryJqGrid(forms.RadioSelect):
encoding = settings.ENCODING or 'utf-8'
rendered += """
<div id="foot_%s" class="gridfooter"><a href="%scsv" target="_blank">%s (%s)</a></div>
-<input type="hidden" id="hidden_%s" name="%s">""" % (name,
- unicode(self.source), unicode(_("Export as CSV")), encoding, name, name)
+""" % (name, unicode(self.source), unicode(_("Export as CSV")), encoding)
+ if self.multiple:
+ rendered += '''
+<input type="button" id="add_button_%s" value="%s"/>
+<ul id='selectmulti_%s' class='selectmulti'>
+</ul>
+''' % (name, unicode(_("Add")), name)
+ rendered += '<input type="hidden" id="hidden_%s" name="%s"/>' % (name,
+ name)
+ dct = {'name':name, 'col_names':col_names, 'extra_cols':extra_cols,
+ 'source':unicode(self.source), 'col_idx':col_idx,
+ 'no_result':unicode(_("No results")), 'loading':unicode(_("Loading...")),
+ 'remove':unicode(_("Remove")), 'sname':name.replace('-', '')}
+
rendered += """
<script type="text/javascript">
var query_vars = new Array(%(col_idx)s);
jQuery(document).ready(function(){
-jQuery("#submit_form").click(function (){
- var mygrid = jQuery("#grid_%(name)s");
- jQuery("#hidden_%(name)s").val(mygrid.getGridParam('selrow'));
- return true;
-});
-jQuery("#search_%(name)s").click(function (){
+ jQuery("#search_%(name)s").click(function (){
var data = "";
for (idx in query_vars)
{
@@ -198,17 +217,17 @@ jQuery("#search_%(name)s").click(function (){
mygrid.setGridParam({url:url});
mygrid.trigger("reloadGrid");
return false;
-});
+ });
-jQuery("#grid_%(name)s").jqGrid({
+ jQuery("#grid_%(name)s").jqGrid({
url:'%(source)s',
datatype: "json",
mtype: 'GET',
colNames:['id', '', %(col_names)s],
colModel:[
-{name:'id', index:'id', hidden:true},
-{name:'link', index:'link', width:80},
-%(extra_cols)s
+ {name:'id', index:'id', hidden:true},
+ {name:'link', index:'link', width:80},
+ %(extra_cols)s
],
sortname: 'value',
viewrecords: true,
@@ -220,11 +239,41 @@ jQuery("#grid_%(name)s").jqGrid({
pginput: false,
width:740,
jsonReader : {repeatitems: false}
-});
+ });
+""" % dct
+ if self.multiple:
+ rendered += """
+ var selItems_%(sname)s = new Array();
+ jQuery("#add_button_%(name)s").click(function (){
+ var mygrid = jQuery("#grid_%(name)s");
+ var idx = mygrid.getGridParam('selrow');
+ var label = mygrid.getCell(idx, 2);
+ for (id in selItems_%(sname)s){
+ if(selItems_%(sname)s[id] == idx){
+ return false;
+ }
+ }
+ selItems_%(sname)s.push(idx);
+ jQuery("#selectmulti_%(name)s").append(
+ "<li id='selected_%(name)s_"+idx+"'>"+label+" <a href='#' class='remove' onclick=\\"multiRemoveItem('selItems_%(sname)s', '%(name)s', "+ idx +");return false;\\">%(remove)s</a></li>");
+ return true;
+ });
+ jQuery("#submit_form").click(function (){
+ jQuery("#hidden_%(name)s").val(selItems_%(sname)s);
+ return true;
+ });
+""" % dct
+ else:
+ rendered += """
+ jQuery("#submit_form").click(function (){
+ var mygrid = jQuery("#grid_%(name)s");
+ jQuery("#hidden_%(name)s").val(mygrid.getGridParam('selrow'));
+ return true;
+ });
+""" % dct
+ rendered += """
});
</script>
-""" % {'name':name, 'col_names':col_names, 'extra_cols':extra_cols,
- 'source':unicode(self.source), 'col_idx':col_idx,
- 'no_result':unicode(_("No results")), 'loading':unicode(_("Loading..."))}
- return rendered
+"""
+ return mark_safe(rendered)