Ticket #13068: prepopulate.4.diff

File prepopulate.4.diff, 12.4 KB (added by Sean Brant, 14 years ago)

Works with r12873

  • django/contrib/admin/media/js/admin/DateTimeShortcuts.js

     
    120120    },
    121121    handleClockQuicklink: function(num, val) {
    122122       DateTimeShortcuts.clockInputs[num].value = val;
     123       DateTimeShortcuts.clockInputs[num].focus();
    123124       DateTimeShortcuts.dismissClock(num);
    124125    },
    125126    // Add calendar widget to a given field.
     
    247248        format = format.replace('\n', '\\n');
    248249        format = format.replace('\t', '\\t');
    249250        format = format.replace("'", "\\'");
    250         return "function(y, m, d) { DateTimeShortcuts.calendarInputs["+num+"].value = new Date(y, m-1, d).strftime('"+format+"');document.getElementById(DateTimeShortcuts.calendarDivName1+"+num+").style.display='none';}";
     251        return ["function(y, m, d) { DateTimeShortcuts.calendarInputs[",
     252               num,
     253               "].value = new Date(y, m-1, d).strftime('",
     254               format,
     255               "');DateTimeShortcuts.calendarInputs[",
     256               num,
     257               "].focus();document.getElementById(DateTimeShortcuts.calendarDivName1+",
     258               num,
     259               ").style.display='none';}"].join('');
    251260    },
    252261    handleCalendarQuickLink: function(num, offset) {
    253262       var d = new Date();
    254263       d.setDate(d.getDate() + offset)
    255264       DateTimeShortcuts.calendarInputs[num].value = d.strftime(get_format('DATE_INPUT_FORMATS')[0]);
     265       DateTimeShortcuts.calendarInputs[num].focus();
    256266       DateTimeShortcuts.dismissCalendar(num);
    257267    },
    258268    cancelEventPropagation: function(e) {
  • django/contrib/admin/media/js/prepopulate.js

     
     1(function($) {
     2    $.fn.prepopulate = function(dependencies, maxLength) {
     3        /*
     4            Depends on urlify.js
     5            Populates a selected field with the values of the dependent fields,
     6            URLifies and shortens the string.
     7            dependencies - selected jQuery object of dependent fields
     8            maxLength - maximum length of the URLify'd string
     9        */
     10        return this.each(function() {
     11            var field = $(this);
     12
     13            field.data('_changed', false);
     14            field.change(function() {
     15                field.data('_changed', true);
     16            });
     17
     18            var populate = function () {
     19                // Bail if the fields value has changed
     20                if (field.data('_changed') == true) return;
     21 
     22                var values = [];
     23                dependencies.each(function() {
     24                    if ($(this).val().length > 0) {
     25                        values.push($(this).val());
     26                    }
     27                });
     28                field.val(URLify(values.join(' '), maxLength));
     29            };
     30
     31            dependencies.keyup(populate).change(populate).focus(populate);
     32        });
     33    };
     34})(jQuery.noConflict());
  • django/contrib/admin/media/js/inlines.js

     
    5555                                var totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS");
    5656                                var nextIndex = parseInt(totalForms.val());
    5757                                var template = $("#" + options.prefix + "-empty");
    58                                 var row = template.clone(true).get(0);
    59                                 $(row).removeClass(options.emptyCssClass).removeAttr("id").insertBefore($(template));
    60                                 $(row).html($(row).html().replace(/__prefix__/g, nextIndex));
    61                                 $(row).addClass(options.formCssClass).attr("id", options.prefix + (nextIndex + 1));
    62                                 if ($(row).is("TR")) {
     58                                var row = template.clone(true);
     59                                row.removeClass(options.emptyCssClass)
     60                                    .addClass(options.formCssClass)
     61                                    .attr("id", options.prefix + nextIndex)
     62                                    .insertBefore($(template));
     63                                row.find("*")
     64                                    .filter(function() {
     65                                        var el = $(this);
     66                                        return el.attr("id") && el.attr("id").search(/__prefix__/) >= 0;
     67                                    }).each(function() {
     68                                        var el = $(this);
     69                                        el.attr("id", el.attr("id").replace(/__prefix__/g, nextIndex));
     70                                    })
     71                                    .end()
     72                                    .filter(function() {
     73                                        var el = $(this);
     74                                        return el.attr("name") && el.attr("name").search(/__prefix__/) >= 0;
     75                                    }).each(function() {
     76                                        var el = $(this);
     77                                        el.attr("name", el.attr("name").replace(/__prefix__/g, nextIndex));
     78                                    });
     79                                if (row.is("tr")) {
    6380                                        // If the forms are laid out in table rows, insert
    6481                                        // the remove button into the last table cell:
    65                                         $(row).children(":last").append('<div><a class="' + options.deleteCssClass +'" href="javascript:void(0)">' + options.deleteText + "</a></div>");
    66                                 } else if ($(row).is("UL") || $(row).is("OL")) {
     82                                        row.children(":last").append('<div><a class="' + options.deleteCssClass +'" href="javascript:void(0)">' + options.deleteText + "</a></div>");
     83                                } else if (row.is("ul") || row.is("ol")) {
    6784                                        // If they're laid out as an ordered/unordered list,
    6885                                        // insert an <li> after the last list item:
    69                                         $(row).append('<li><a class="' + options.deleteCssClass +'" href="javascript:void(0)">' + options.deleteText + "</a></li>");
     86                                        row.append('<li><a class="' + options.deleteCssClass +'" href="javascript:void(0)">' + options.deleteText + "</a></li>");
    7087                                } else {
    7188                                        // Otherwise, just insert the remove button as the
    7289                                        // last child element of the form's container:
    73                                         $(row).children(":first").append('<span><a class="' + options.deleteCssClass + '" href="javascript:void(0)">' + options.deleteText + "</a></span>");
     90                                        row.children(":first").append('<span><a class="' + options.deleteCssClass + '" href="javascript:void(0)">' + options.deleteText + "</a></span>");
    7491                                }
    75                                 $(row).find("input,select,textarea,label,a").each(function() {
     92                                row.find("input,select,textarea,label,a").each(function() {
    7693                                        updateElementIndex(this, options.prefix, totalForms.val());
    7794                                });
    7895                                // Update number of total forms
     
    8299                                        addButton.parent().hide();
    83100                                }
    84101                                // The delete button of each row triggers a bunch of other things
    85                                 $(row).find("a." + options.deleteCssClass).click(function() {
     102                                row.find("a." + options.deleteCssClass).click(function() {
    86103                                        // Remove the parent form containing this button:
    87104                                        var row = $(this).parents("." + options.formCssClass);
    88105                                        row.remove();
     
    109126                                });
    110127                                // If a post-add callback was supplied, call it with the added form:
    111128                                if (options.added) {
    112                                         options.added($(row));
     129                                        options.added(row);
    113130                                }
    114131                                return false;
    115132                        });
  • django/contrib/admin/options.py

     
    273273            js.extend(['js/jquery.min.js', 'js/actions.min.js'])
    274274        if self.prepopulated_fields:
    275275            js.append('js/urlify.js')
     276            js.append('js/prepopulate.js')
    276277        if self.opts.get_ordered_objects():
    277278            js.extend(['js/getElementsBySelector.js', 'js/dom-drag.js' , 'js/admin/ordering.js'])
    278279
     
    11971198
    11981199    def _media(self):
    11991200        from django.conf import settings
    1200         js = ['js/jquery.min.js', 'js/inlines.min.js']
     1201        js = ['js/jquery.min.js', 'js/inlines.js']
    12011202        if self.prepopulated_fields:
    12021203            js.append('js/urlify.js')
     1204            js.append('js/prepopulate.js')
    12031205        if self.filter_vertical or self.filter_horizontal:
    12041206            js.extend(['js/SelectBox.js' , 'js/SelectFilter2.js'])
    12051207        return forms.Media(js=['%s%s' % (settings.ADMIN_MEDIA_PREFIX, url) for url in js])
  • django/contrib/admin/templates/admin/edit_inline/stacked.html

     
    4848                })
    4949            }
    5050        }
     51        var initPrepopulatedFields = function(row) {
     52            row.find('.prepopulated_field').each(function() {
     53                var field = $(this);
     54                var input = field.find('input');
     55                var dependency_list = input.data('dependency_list') || [];
     56                var dependencies = row.find(dependency_list.join(','));
     57                if (dependencies.length) {
     58                    input.prepopulate(dependencies, input.attr('maxlength'));
     59                }
     60            });
     61        }
    5162        $(rows).formset({
    5263            prefix: "{{ inline_admin_formset.formset.prefix }}",
    5364            addText: "{% blocktrans with inline_admin_formset.opts.verbose_name|title as verbose_name %}Add another {{ verbose_name }}{% endblocktrans %}",
     
    5768            emptyCssClass: "empty-form",
    5869            removed: updateInlineLabel,
    5970            added: (function(row) {
     71                initPrepopulatedFields(row);
    6072                reinitDateTimeShortCuts();
    6173                updateSelectFilter();
    6274                updateInlineLabel(row);
  • django/contrib/admin/templates/admin/edit_inline/tabular.html

     
    9494                })
    9595            }
    9696        }
     97        var initPrepopulatedFields = function(row) {
     98            row.find('.prepopulated_field').each(function() {
     99                var field = $(this);
     100                var input = field.find('input');
     101                var dependency_list = input.data('dependency_list') || [];
     102                var dependencies = row.find(dependency_list.join(','));
     103                if (dependencies.length) {
     104                    input.prepopulate(dependencies, input.attr('maxlength'));
     105                }
     106            });
     107        }
    97108        $(rows).formset({
    98109            prefix: "{{ inline_admin_formset.formset.prefix }}",
    99110            addText: "{% blocktrans with inline_admin_formset.opts.verbose_name|title as verbose_name %}Add another {{ verbose_name }}{% endblocktrans %}",
     
    103114            emptyCssClass: "empty-form",
    104115            removed: alternatingRows,
    105116            added: (function(row) {
     117                initPrepopulatedFields(row);
    106118                reinitDateTimeShortCuts();
    107119                updateSelectFilter();
    108120                alternatingRows(row);
  • django/contrib/admin/templates/admin/prepopulated_fields_js.html

     
    11<script type="text/javascript">
     2(function($) {
     3    var field = null;
     4
    25{% for field in prepopulated_fields %}
    3     document.getElementById("{{ field.field.auto_id }}").onchange = function() { this._changed = true; };
     6    field = {
     7        id: '#{{ field.field.auto_id }}',
     8        dependency_ids: [],
     9        dependency_list: [],
     10        maxLength: {{ field.field.field.max_length|default_if_none:"50" }}
     11    };
     12
    413    {% for dependency in field.dependencies %}
    5     document.getElementById("{{ dependency.auto_id }}").onkeyup = function() {
    6         var e = document.getElementById("{{ field.field.auto_id }}");
    7         if (!e._changed) { e.value = URLify({% for innerdep in field.dependencies %}document.getElementById("{{ innerdep.auto_id }}").value{% if not forloop.last %} + ' ' + {% endif %}{% endfor %}, {{ field.field.field.max_length|default_if_none:"50" }}); }
    8     }
     14    field['dependency_ids'].push('#{{ dependency.auto_id }}');
     15    field['dependency_list'].push('.{{ dependency.name }} input');
    916    {% endfor %}
     17   
     18    console.log()
     19    $('.empty-form .{{ field.field.name }}').addClass('prepopulated_field');
     20    $(field.id).data('dependency_list', field['dependency_list'])
     21               .prepopulate($(field['dependency_ids'].join(',')), field.maxLength);
    1022{% endfor %}
     23})(jQuery.noConflict());
    1124</script>
Back to Top