Parcourir la source

Closes #345: Bulk edit: allow user to select all objects on page or all matching query

Jeremy Stretch il y a 8 ans
Parent
commit
d5fc0e9ce7

+ 10 - 5
netbox/project-static/js/forms.js

@@ -1,13 +1,18 @@
 $(document).ready(function() {
 
-    // "Select all" checkbox in a table header
-    $('th input:checkbox[name=_all]').click(function (event) {
-        $(this).parents('table').find('td input:checkbox').prop('checked', $(this).prop('checked'));
+    // "Toggle all" checkbox in a table header
+    $('#toggle_all').click(function (event) {
+        $('td input:checkbox[name=pk]').prop('checked', $(this).prop('checked'));
+        if ($(this).is(':checked')) {
+            $('#select_all_box').removeClass('hidden');
+        } else {
+            $('#select_all').prop('checked', false);
+        }
     });
-    // Uncheck the "select all" checkbox if an item is unchecked
+    // Uncheck the "toggle all" checkbox if an item is unchecked
     $('input:checkbox[name=pk]').click(function (event) {
         if (!$(this).attr('checked')) {
-            $(this).parents('table').find('input:checkbox[name=_all]').prop('checked', false);
+            $('#select_all, #toggle_all').prop('checked', false);
         }
     });
 

+ 9 - 30
netbox/templates/dcim/inc/device_table.html

@@ -1,30 +1,9 @@
-{% load render_table from django_tables2 %}
-{% load helpers %}
-{% if table.model|user_can_change:request.user or table.model|user_can_delete:request.user %}
-    <form method="post" class="form form-horizontal">
-        {% csrf_token %}
-        <input type="hidden" name="redirect_url" value="{{ request.path }}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" />
-        <input type="hidden" name="pk_all" value="{% for row in table.rows %}{{ row.record.pk|default:'' }}{% if not forloop.last %},{% endif %}{% endfor %}" />
-        {% render_table table table_template|default:'table.html' %}
-        {% if perms.dcim.add_interface %}
-            <button type="submit" name="_edit" formaction="{% url 'dcim:interface_add_multi' %}" class="btn btn-primary btn-sm">
-                <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
-                Add Interfaces
-            </button>
-        {% endif %}
-        {% if bulk_edit_url and table.model|user_can_change:request.user %}
-            <button type="submit" name="_edit" formaction="{% url bulk_edit_url %}" class="btn btn-warning btn-sm">
-                <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
-                Edit Selected
-            </button>
-        {% endif %}
-        {% if bulk_delete_url and table.model|user_can_delete:request.user %}
-            <button type="submit" name="_delete" formaction="{% url bulk_delete_url %}" class="btn btn-danger btn-sm">
-                <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
-                Delete Selected
-            </button>
-        {% endif %}
-    </form>
-{% else %}
-    {% render_table table table_template|default:'table.html' %}
-{% endif %}
+{% extends 'utilities/obj_table.html' %}
+
+{% block extra_actions %}
+    {% if perms.dcim.add_interface %}
+        <button type="submit" name="_edit" formaction="{% url 'dcim:interface_add_multi' %}" class="btn btn-primary btn-sm">
+            <span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add Interfaces
+        </button>
+    {% endif %}
+{% endblock %}

+ 1 - 1
netbox/templates/utilities/bulk_edit_form.html

@@ -11,7 +11,7 @@
     <div class="row">
         <div class="col-md-7">
             <div class="panel panel-default">
-                <div class="panel-heading"><strong>{% block selected_objects_title %}Selected For Editing{% endblock %}</strong></div>
+                <div class="panel-heading"><strong>{% block selected_objects_title %}{{ selected_objects|length }} Selected For Editing{% endblock %}</strong></div>
                 <table class="panel-body table table-hover">
                     {% block select_objects_table %}{% endblock %}
                 </table>

+ 13 - 4
netbox/templates/utilities/obj_table.html

@@ -5,17 +5,26 @@
         {% csrf_token %}
         <input type="hidden" name="redirect_url" value="{{ request.path }}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" />
         <input type="hidden" name="pk_all" value="{% for row in table.rows %}{{ row.record.pk|default:'' }}{% if not forloop.last %},{% endif %}{% endfor %}" />
+        {% if table.paginator.num_pages > 1 %}
+            <div id="select_all_box" class="hidden alert alert-info">
+                <div class="checkbox-inline">
+                    <label for="select_all">
+                        <input type="checkbox" id="select_all" name="_all" />
+                        Select <strong>all {{ table.rows|length }} {{ table.data.verbose_name_plural }}</strong> matching query
+                    </label>
+                </div>
+            </div>
+        {% endif %}
         {% render_table table table_template|default:'table.html' %}
+        {% block extra_actions %}{% endblock %}
         {% if bulk_edit_url and table.model|user_can_change:request.user %}
             <button type="submit" name="_edit" formaction="{% url bulk_edit_url %}" class="btn btn-warning btn-sm">
-                <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
-                Edit Selected
+                <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Edit Selected
             </button>
         {% endif %}
         {% if bulk_delete_url and table.model|user_can_delete:request.user %}
             <button type="submit" name="_delete" formaction="{% url bulk_delete_url %}" class="btn btn-danger btn-sm">
-                <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
-                Delete Selected
+                <span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Delete Selected
             </button>
         {% endif %}
     </form>

+ 1 - 1
netbox/utilities/tables.py

@@ -27,4 +27,4 @@ class ToggleColumn(tables.CheckBoxColumn):
 
     @property
     def header(self):
-        return mark_safe('<input type="checkbox" name="_all" title="Select all" />')
+        return mark_safe('<input type="checkbox" id="toggle_all" title="Toggle all" />')