Skip to content

Commit

Permalink
implemented new button with appropriate callbacks etc
Browse files Browse the repository at this point in the history
  • Loading branch information
mikhuang committed May 30, 2013
1 parent 99982d5 commit b7531e1
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 9 deletions.
8 changes: 5 additions & 3 deletions deme_django/cms/forms.py
Expand Up @@ -47,12 +47,14 @@ def render(self, name, value, attrs=None):
if attrs is None: attrs = {}
ajax_query_string = '&'.join('ability=' + urlquote(ability) for ability in self.required_abilities)
ajax_url = reverse('item_type_url', kwargs={'viewer': model.__name__.lower(), 'format': 'json'}) + '?' + ajax_query_string
new_modal_query_string = '?modal=1&id=' + attrs.get('id', '')
new_modal_url = reverse('item_type_url', kwargs={'viewer': model.__name__.lower(), 'action': 'new'}) + new_modal_query_string
result = """
<div class="input-group">
<input type="hidden" name="%(name)s" value="%(value)s" data-model-name="%(model_name)s" data-input-id="%(id)s" data-ajax-url="%(ajax_url)s" class="ajax-model-choice-widget">
<input type="text" id="%(id)s" name="%(name)s_search" value="%(initial_search)s">
<input type="hidden" name="%(name)s" value="%(value)s" data-model-name="%(model_name)s" data-input-id="%(id)s" data-ajax-url="%(ajax_url)s" data-new-modal-url="%(new_modal_url)s" class="ajax-model-choice-widget">
<input type="text" id="%(id)s" name="%(name)s_search" value="%(initial_search)s" placeholder="Select an item...">
</div>
""" % {'name': name, 'value': value, 'id': attrs.get('id', ''), 'ajax_url': ajax_url, 'initial_search': initial_search, 'model_name': model.__name__.lower()}
""" % {'name': name, 'value': value, 'id': attrs.get('id', ''), 'ajax_url': ajax_url, 'initial_search': initial_search, 'model_name': model.__name__.lower(), 'new_modal_url': new_modal_url}
# see /javascripts/deme/ajax-model-choice-widget.js for implementation
#TODO fail in more obvious way if attrs['id'] is not set
return result
Expand Down
3 changes: 3 additions & 0 deletions deme_django/cms/templates/item/new_bare.html
Expand Up @@ -49,6 +49,9 @@
{% new_item_permission_editor item %}
</div>
<button type="submit"><img src="{{ "checkbox"|icon_url:16 }}" /> <span>Create {{ accepted_item_type_name }}</span></button>
{% if receiver_input_id %}
<input type="hidden" name="receiver_input_id" value="{{ receiver_input_id }}">
{% endif %}
</form>
{% else %}
You do not have permission to create {{ accepted_item_type_name_plural }}.
Expand Down
15 changes: 15 additions & 0 deletions deme_django/cms/templates/item/new_embed_return.html
@@ -0,0 +1,15 @@
{% load item_tags %}<html>
<head>
<title>Created...</title>
</head>
<body>
<script>
var data = {
id: "{{new_item.pk}}",
name: "{% viewable_name new_item %}"
};
window.opener.ajaxModelChoiceWidgetUpdateValue("{{receiver_input_id}}", data);
window.close();
</script>
</body>
</html>
7 changes: 7 additions & 0 deletions deme_django/cms/views.py
Expand Up @@ -379,6 +379,7 @@ def type_new_html(self, form=None):
self.context['item_types'] = item_types
is_true = lambda value: bool(value) and value.lower() not in ('false', '0')
if (is_true(self.request.GET.get('modal'))):
self.context['receiver_input_id'] = self.request.GET.get('id') # the name of the field that expects a response
template = loader.get_template('item/new_embed.html')
else:
template = loader.get_template('item/new.html')
Expand All @@ -399,6 +400,12 @@ def type_create_html(self):
membership_permissions = [OneToOnePermission(source=self.cur_agent, ability='do_anything', is_allowed=True)]
new_membership.save_versioned(action_agent=self.cur_agent, initial_permissions=membership_permissions)
redirect = self.request.GET.get('redirect', new_item.get_absolute_url())
receiver_input_id = self.request.POST.get('receiver_input_id')
if receiver_input_id:
template = loader.get_template('item/new_embed_return.html')
self.context['receiver_input_id'] = receiver_input_id
self.context['new_item'] = new_item
return HttpResponse(template.render(self.context))
return HttpResponseRedirect(redirect)
else:
return self.type_new_html(form)
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

22 changes: 17 additions & 5 deletions deme_django/static/javascripts/deme/ajax-model-choice-widget.js
@@ -1,9 +1,9 @@
$(function() {
$('.ajax-model-choice-widget').each(function(){
var id = $(this).attr('data-input-id');
var ajax_url = $(this).attr('data-ajax-url');
var search_input = $("#"+id);
var hidden_input = $(this);
var id = hidden_input.attr('data-input-id');
var ajax_url = hidden_input.attr('data-ajax-url');
var search_input = $("#"+id);
var cache = {};
var last_xhr;
search_input.autocomplete({
Expand All @@ -29,9 +29,21 @@ $(function() {
});

// set up new button
var newbtn = $('<span class="input-group-btn"><button class="btn btn-default">New</button></span>').insertAfter(search_input);
newbtn.click(function(e){
var newbtn = $('<span class="input-group-btn"><a href="#" class="btn btn-default">New</a></span>').insertAfter(search_input);
newbtn.find('a').click(function(e){
e.preventDefault();
var new_modal_url = hidden_input.attr('data-new-modal-url');
window.open(new_modal_url, 'embedform', 'width=400,toolbar=1,resizable=1,scrollbars=yes,height=400,top=100,left=100');
})
});

function ajaxModelChoiceWidgetUpdateValue(id, dict) {
var itemid = dict['id'];
var itemname = dict['name'];
var input = $('#' + id);
var hidden_input = $('[data-input-id="'+id+'"]');
hidden_input.val(itemid);
input.val(itemname);
}
window.ajaxModelChoiceWidgetUpdateValue = ajaxModelChoiceWidgetUpdateValue;
});

0 comments on commit b7531e1

Please sign in to comment.