diff options
| author | Justin Bronn <jbronn@gmail.com> | 2010-02-17 18:54:02 +0000 |
|---|---|---|
| committer | Justin Bronn <jbronn@gmail.com> | 2010-02-17 18:54:02 +0000 |
| commit | eaa17e13e849a18b0b0fb19468bd65a31b86b3b7 (patch) | |
| tree | 231f4269c6f29725f0e8cbfbf0ad21db063e8108 | |
| parent | 342517000cedefef6c0e9f92945362fef3d2e39b (diff) | |
Fixed #12705 -- Date/time and select filter widgets now work again with newly added inline forms in the admin.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@12454 bcc190cf-cafb-0310-a4f2-bffc1f526a37
| -rw-r--r-- | django/contrib/admin/media/js/SelectFilter2.js | 4 | ||||
| -rw-r--r-- | django/contrib/admin/media/js/admin/DateTimeShortcuts.js | 3 | ||||
| -rw-r--r-- | django/contrib/admin/media/js/inlines.js | 1 | ||||
| -rw-r--r-- | django/contrib/admin/templates/admin/edit_inline/stacked.html | 32 | ||||
| -rw-r--r-- | django/contrib/admin/templates/admin/edit_inline/tabular.html | 33 | ||||
| -rw-r--r-- | django/contrib/admin/widgets.py | 3 | ||||
| -rw-r--r-- | tests/regressiontests/admin_widgets/models.py | 8 |
7 files changed, 74 insertions, 10 deletions
diff --git a/django/contrib/admin/media/js/SelectFilter2.js b/django/contrib/admin/media/js/SelectFilter2.js index db946a6f6f..5a0344702c 100644 --- a/django/contrib/admin/media/js/SelectFilter2.js +++ b/django/contrib/admin/media/js/SelectFilter2.js @@ -16,6 +16,10 @@ function findForm(node) { var SelectFilter = { init: function(field_id, field_name, is_stacked, admin_media_prefix) { + if (field_id.match(/__prefix__/)){ + // Don't intialize on empty forms. + return; + } var from_box = document.getElementById(field_id); from_box.id += '_from'; // change its ID from_box.className = 'filtered'; diff --git a/django/contrib/admin/media/js/admin/DateTimeShortcuts.js b/django/contrib/admin/media/js/admin/DateTimeShortcuts.js index 016de90f28..fbaa599c7a 100644 --- a/django/contrib/admin/media/js/admin/DateTimeShortcuts.js +++ b/django/contrib/admin/media/js/admin/DateTimeShortcuts.js @@ -11,6 +11,7 @@ var DateTimeShortcuts = { calendarLinkName: 'calendarlink',// name of the link that is used to toggle clockDivName: 'clockbox', // name of clock <div> that gets toggled clockLinkName: 'clocklink', // name of the link that is used to toggle + shortCutsClass: 'datetimeshortcuts', // class of the clock and cal shortcuts admin_media_prefix: '', init: function() { // Deduce admin_media_prefix by looking at the <script>s in the @@ -42,6 +43,7 @@ var DateTimeShortcuts = { // Shortcut links (clock icon and "Now" link) var shortcuts_span = document.createElement('span'); + shortcuts_span.className = DateTimeShortcuts.shortCutsClass; inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); var now_link = document.createElement('a'); now_link.setAttribute('href', "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date().strftime('" + get_format('TIME_INPUT_FORMATS')[0] + "'));"); @@ -128,6 +130,7 @@ var DateTimeShortcuts = { // Shortcut links (calendar icon and "Today" link) var shortcuts_span = document.createElement('span'); + shortcuts_span.className = DateTimeShortcuts.shortCutsClass; inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); var today_link = document.createElement('a'); today_link.setAttribute('href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', 0);'); diff --git a/django/contrib/admin/media/js/inlines.js b/django/contrib/admin/media/js/inlines.js index 518ad9b303..b66d6c9b3c 100644 --- a/django/contrib/admin/media/js/inlines.js +++ b/django/contrib/admin/media/js/inlines.js @@ -34,7 +34,6 @@ var maxForms = $("#id_" + options.prefix + "-MAX_NUM_FORMS").attr("autocomplete", "off"); // only show the add button if we are allowed to add more items var showAddButton = ((maxForms.val() == 0) || ((maxForms.val()-totalForms.val()) > 0)); - var selectedItems = this; $(this).each(function(i) { $(this).not("." + options.emptyCssClass).addClass(options.formCssClass); }); diff --git a/django/contrib/admin/templates/admin/edit_inline/stacked.html b/django/contrib/admin/templates/admin/edit_inline/stacked.html index 6525fe1611..fb112a0166 100644 --- a/django/contrib/admin/templates/admin/edit_inline/stacked.html +++ b/django/contrib/admin/templates/admin/edit_inline/stacked.html @@ -1,4 +1,4 @@ -{% load i18n %} +{% load i18n adminmedia %} <div class="inline-group" id="{{ inline_admin_formset.formset.prefix }}-group"> <h2>{{ inline_admin_formset.opts.verbose_name_plural|title }}</h2> {{ inline_admin_formset.formset.management_form }} @@ -22,12 +22,32 @@ (function($) { $(document).ready(function() { var rows = "#{{ inline_admin_formset.formset.prefix }}-group .inline-related"; - updateInlineLabel = function(row) { + var updateInlineLabel = function(row) { $(rows).find(".inline_label").each(function(i) { var count = i + 1; $(this).html($(this).html().replace(/(#\d+)/g, "#" + count)); }); } + var reinitDateTimeShortCuts = function() { + // Reinitialize the calendar and clock widgets by force, yuck. + if (typeof DateTimeShortcuts != "undefined") { + $(".datetimeshortcuts").remove(); + DateTimeShortcuts.init(); + } + } + var updateSelectFilter = function() { + // If any SelectFilter widgets were added, instantiate a new instance. + if (typeof SelectFilter != "undefined"){ + $(".selectfilter").each(function(index, value){ + var namearr = value.name.split('-'); + SelectFilter.init(value.id, namearr[namearr.length-1], false, "{% admin_media_prefix %}"); + }) + $(".selectfilterstacked").each(function(index, value){ + var namearr = value.name.split('-'); + SelectFilter.init(value.id, namearr[namearr.length-1], true, "{% admin_media_prefix %}"); + }) + } + } $(rows).formset({ prefix: "{{ inline_admin_formset.formset.prefix }}", addText: "{% blocktrans with inline_admin_formset.opts.verbose_name|title as verbose_name %}Add another {{ verbose_name }}{% endblocktrans %}", @@ -36,8 +56,12 @@ deleteText: "{% trans "Remove" %}", emptyCssClass: "empty-form", removed: updateInlineLabel, - added: updateInlineLabel + added: (function(row) { + reinitDateTimeShortCuts(); + updateSelectFilter(); + updateInlineLabel(row); + }) }); }); })(jQuery.noConflict()); -</script>
\ No newline at end of file +</script> diff --git a/django/contrib/admin/templates/admin/edit_inline/tabular.html b/django/contrib/admin/templates/admin/edit_inline/tabular.html index 5c69bad24d..dc9552f454 100644 --- a/django/contrib/admin/templates/admin/edit_inline/tabular.html +++ b/django/contrib/admin/templates/admin/edit_inline/tabular.html @@ -1,4 +1,4 @@ -{% load i18n %} +{% load i18n adminmedia %} <div class="inline-group" id="{{ inline_admin_formset.formset.prefix }}-group"> <div class="tabular inline-related {% if forloop.last %}last-related{% endif %}"> {{ inline_admin_formset.formset.management_form }} @@ -68,11 +68,32 @@ (function($) { $(document).ready(function($) { var rows = "#{{ inline_admin_formset.formset.prefix }}-group .tabular.inline-related tbody tr"; - alternatingRows = function(row) { + var alternatingRows = function(row) { $(rows).not(".add-row").removeClass("row1 row2") .filter(":even").addClass("row1").end() .filter(rows + ":odd").addClass("row2"); } + var reinitDateTimeShortCuts = function() { + // Reinitialize the calendar and clock widgets by force + if (typeof DateTimeShortcuts != "undefined") { + $(".datetimeshortcuts").remove(); + DateTimeShortcuts.init(); + } + } + var updateSelectFilter = function() { + // If any SelectFilter widgets are a part of the new form, + // instantiate a new SelectFilter instance for it. + if (typeof SelectFilter != "undefined"){ + $(".selectfilter").each(function(index, value){ + var namearr = value.name.split('-'); + SelectFilter.init(value.id, namearr[namearr.length-1], false, "{% admin_media_prefix %}"); + }) + $(".selectfilterstacked").each(function(index, value){ + var namearr = value.name.split('-'); + SelectFilter.init(value.id, namearr[namearr.length-1], true, "{% admin_media_prefix %}"); + }) + } + } $(rows).formset({ prefix: "{{ inline_admin_formset.formset.prefix }}", addText: "{% blocktrans with inline_admin_formset.opts.verbose_name|title as verbose_name %}Add another {{ verbose_name }}{% endblocktrans %}", @@ -81,8 +102,12 @@ deleteText: "{% trans "Remove" %}", emptyCssClass: "empty-form", removed: alternatingRows, - added: alternatingRows + added: (function(row) { + reinitDateTimeShortCuts(); + updateSelectFilter(); + alternatingRows(row); + }) }); }); })(jQuery.noConflict()); -</script>
\ No newline at end of file +</script> diff --git a/django/contrib/admin/widgets.py b/django/contrib/admin/widgets.py index 120df94cf3..0954d3f3e2 100644 --- a/django/contrib/admin/widgets.py +++ b/django/contrib/admin/widgets.py @@ -33,6 +33,9 @@ class FilteredSelectMultiple(forms.SelectMultiple): super(FilteredSelectMultiple, self).__init__(attrs, choices) def render(self, name, value, attrs=None, choices=()): + if attrs is None: attrs = {} + attrs['class'] = 'selectfilter' + if self.is_stacked: attrs['class'] += 'stacked' output = [super(FilteredSelectMultiple, self).render(name, value, attrs, choices)] output.append(u'<script type="text/javascript">addEvent(window, "load", function(e) {') # TODO: "id_" is hard-coded here. This should instead use the correct diff --git a/tests/regressiontests/admin_widgets/models.py b/tests/regressiontests/admin_widgets/models.py index b9fe67c182..ebf93d4b75 100644 --- a/tests/regressiontests/admin_widgets/models.py +++ b/tests/regressiontests/admin_widgets/models.py @@ -90,10 +90,16 @@ HTML escaped. >>> w = FilteredSelectMultiple('test', False) >>> print conditional_escape(w.render('test', 'test')) -<select multiple="multiple" name="test"> +<select multiple="multiple" name="test" class="selectfilter"> </select><script type="text/javascript">addEvent(window, "load", function(e) {SelectFilter.init("id_test", "test", 0, "%(ADMIN_MEDIA_PREFIX)s"); });</script> <BLANKLINE> +>>> w = FilteredSelectMultiple('test', True) +>>> print conditional_escape(w.render('test', 'test')) +<select multiple="multiple" name="test" class="selectfilterstacked"> +</select><script type="text/javascript">addEvent(window, "load", function(e) {SelectFilter.init("id_test", "test", 1, "%(ADMIN_MEDIA_PREFIX)s"); });</script> +<BLANKLINE> + >>> w = AdminSplitDateTime() >>> print conditional_escape(w.render('test', datetime(2007, 12, 1, 9, 30))) <p class="datetime">Date: <input value="2007-12-01" type="text" class="vDateField" name="test_0" size="10" /><br />Time: <input value="09:30:00" type="text" class="vTimeField" name="test_1" size="8" /></p> |
