Code

Ticket #2545: collapse_empty.patch

File collapse_empty.patch, 3.3 KB (added by SmileyChris, 8 years ago)
  • django/contrib/admin/media/js/admin/CollapsedFieldsets.js

     
    1313var CollapsedFieldsets = { 
    1414    collapse_re: /\bcollapse\b/,   // Class of fieldsets that should be dealt with. 
    1515    collapsed_re: /\bcollapsed\b/, // Class that fieldsets get when they're hidden. 
     16    collapse_empty_re: /\bcollapse_empty\b/,   // Extra class which only hides fieldsets with no values (still requires "collapse" class) 
    1617    collapsed_class: 'collapsed', 
    1718    init: function() { 
    1819        var fieldsets = document.getElementsByTagName('fieldset'); 
     
    2122            // Collapse this fieldset if it has the correct class, and if it 
    2223            // doesn't have any errors. (Collapsing shouldn't apply in the case 
    2324            // of error messages.) 
    24             if (fs.className.match(CollapsedFieldsets.collapse_re) && !CollapsedFieldsets.fieldset_has_errors(fs)) { 
     25            if (fs.className.match(CollapsedFieldsets.collapse_re)  
     26              && !CollapsedFieldsets.fieldset_has_errors(fs) 
     27              && (!fs.className.match(CollapsedFieldsets.collapse_empty_re) || !CollapsedFieldsets.fieldset_not_empty(fs))) { 
    2528                collapsed_seen = true; 
    2629                // Give it an additional class, used by CSS to hide it. 
    2730                fs.className += ' ' + CollapsedFieldsets.collapsed_class; 
     
    5356        } 
    5457        return false; 
    5558    }, 
     59    fieldset_not_empty: function(fs) { 
     60        // Returns true if any fields in the fieldset have values. 
     61        var tags = new Array('select', 'textarea', 'input'); 
     62        var tag; 
     63        for (var i=0; i<tags.length; i++) { 
     64            tag = tags[i]; 
     65                var objs = fs.getElementsByTagName(tag); 
     66                for (var j=0; j<objs.length; j++) { 
     67                    o = objs[j]; 
     68                        if (tag=='input' && o.type=='checkbox') { 
     69                            if (o.checked) { 
     70                                return true; 
     71                            } 
     72                        } 
     73                        else if (tag!='input' || o.type!='radio') { 
     74                            if (o.value) { 
     75                                return true; 
     76                            } 
     77                        } 
     78                } 
     79            } 
     80        return false; 
     81    }, 
    5682    show: function(fieldset_index) { 
    5783        var fs = document.getElementsByTagName('fieldset')[fieldset_index]; 
    5884        // Remove the class name that causes the "display: none". 
  • docs/model-api.txt

     
    11711171    'classes': 'wide extrapretty', 
    11721172    } 
    11731173 
    1174 Two useful classes defined by the default admin-site stylesheet are 
     1174Some useful classes defined by the default admin-site stylesheet are 
    11751175``collapse`` and ``wide``. Fieldsets with the ``collapse`` style will be 
    11761176initially collapsed in the admin and replaced with a small "click to expand" 
    1177 link. Fieldsets with the ``wide`` style will be given extra horizontal space. 
     1177link. Use both ``collapse`` and ``collapse_empty`` to only initially collapse 
     1178the fieldset if all its fields are blank. Fieldsets with the ``wide`` style 
     1179will be given extra horizontal space. 
    11781180 
    11791181``description`` 
    11801182~~~~~~~~~~~~~~~