Browse Source

Don't show filters container when no one is active or visible

Julien Herpin 10 years ago
parent
commit
5ed81b3b93

+ 13 - 0
Datagrid/Datagrid.php

@@ -242,6 +242,19 @@ class Datagrid implements DatagridInterface
         return false;
     }
 
+    /**
+     * {@inheritdoc}
+     */
+    public function hasDisplayableFilters() {
+        foreach ($this->filters as $name => $filter) {
+            if ($filter->isActive() && $filter->getOption('show_filter', true)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
     /**
      * {@inheritdoc}
      */

+ 5 - 0
Datagrid/DatagridInterface.php

@@ -96,4 +96,9 @@ interface DatagridInterface
      * @return boolean
      */
     public function hasActiveFilters();
+
+    /**
+     * @return boolean
+     */
+    public function hasDisplayableFilters();
 }

+ 1 - 1
Resources/views/CRUD/base_list.html.twig

@@ -210,7 +210,7 @@ file that was distributed with this source code.
     {% if admin.datagrid.filters %}
         {% form_theme form admin.getTemplate('filter') %}
 
-        <div class="col-xs-12 col-md-12 sonata-filters-box" style="display: {{ admin.datagrid.hasActiveFilters ? 'block' : 'none' }}" id="filter-container-{{ admin.uniqid() }}">
+        <div class="col-xs-12 col-md-12 sonata-filters-box" style="display: {{ admin.datagrid.hasDisplayableFilters ? 'block' : 'none' }}" id="filter-container-{{ admin.uniqid() }}">
             <div class="box box-primary" >
                 <div class="box-body">
                     <form class="sonata-filter-form form-horizontal {{ admin.isChild and 1 == admin.datagrid.filters|length ? 'hide' : '' }}" action="{{ admin.generateUrl('list') }}" method="GET" role="form">

+ 35 - 0
Tests/Datagrid/DatagridTest.php

@@ -238,6 +238,41 @@ class DatagridTest extends \PHPUnit_Framework_TestCase
         $this->assertTrue($this->datagrid->hasActiveFilters());
     }
 
+    public function testHasDisplayableFilters()
+    {
+        $this->assertFalse($this->datagrid->hasDisplayableFilters());
+
+        $filter1 = $this->getMock('Sonata\AdminBundle\Filter\FilterInterface');
+        $filter1->expects($this->once())
+            ->method('getName')
+            ->will($this->returnValue('foo'));
+        $filter1->expects($this->any())
+            ->method('getOption')
+            ->will($this->returnValue(false));
+        $filter1->expects($this->any())
+            ->method('isActive')
+            ->will($this->returnValue(false));
+
+        $this->datagrid->addFilter($filter1);
+
+        $this->assertFalse($this->datagrid->hasDisplayableFilters());
+
+        $filter2 = $this->getMock('Sonata\AdminBundle\Filter\FilterInterface');
+        $filter2->expects($this->once())
+            ->method('getName')
+            ->will($this->returnValue('bar'));
+        $filter2->expects($this->any())
+            ->method('getOption')
+            ->will($this->returnValue(true));
+        $filter2->expects($this->any())
+            ->method('isActive')
+            ->will($this->returnValue(true));
+
+        $this->datagrid->addFilter($filter2);
+
+        $this->assertTrue($this->datagrid->hasDisplayableFilters());
+    }
+
     public function testGetForm()
     {
         $this->assertInstanceOf('Symfony\Component\Form\Form', $this->datagrid->getForm());