Browse Source

Add new configuration parameter to show/hide mosaic button.

Alexander 9 years ago
parent
commit
4c85e0ee10

+ 18 - 1
Admin/AbstractAdmin.php

@@ -65,6 +65,8 @@ abstract class AbstractAdmin implements AdminInterface, DomainObjectInterface
             Doctrine\\\Orm|Doctrine\\\Phpcr|Doctrine\\\MongoDB|Doctrine\\\CouchDB
         )\\\(.*)@x';
 
+    const MOSAIC_ICON_CLASS = 'fa fa-th-large fa-fw';
+
     /**
      * The list FieldDescription constructed from the configureListField method.
      *
@@ -428,7 +430,7 @@ abstract class AbstractAdmin implements AdminInterface, DomainObjectInterface
             'class' => 'fa fa-list fa-fw',
         ),
         'mosaic' => array(
-            'class' => 'fa fa-th-large fa-fw',
+            'class' => self::MOSAIC_ICON_CLASS,
         ),
     );
 
@@ -2827,6 +2829,21 @@ abstract class AbstractAdmin implements AdminInterface, DomainObjectInterface
         return $actions;
     }
 
+    /**
+     * Setting to true will enable mosaic button for the admin screen.
+     * Setting to false will hide mosaic button for the admin screen.
+     *
+     * @param bool $isShown
+     */
+    final public function showMosaicButton($isShown)
+    {
+        if ($isShown) {
+            $this->listModes['mosaic'] = array('class' => self::MOSAIC_ICON_CLASS);
+        } else {
+            unset($this->listModes['mosaic']);
+        }
+    }
+
     /**
      * @param FormMapper $form
      */

+ 9 - 0
Admin/AdminInterface.php

@@ -1060,4 +1060,13 @@ interface AdminInterface
      * @return string|null
      */
     //public function getSearchResultLink($object)
+
+//    TODO: uncomment this method in 4.0
+//    /**
+//     * Setting to true will enable mosaic button for the admin screen.
+//     * Setting to false will hide mosaic button for the admin screen.
+//     *
+//     * @param bool $isShown
+//     */
+//    public function showMosaicButton($isShown);
 }

+ 2 - 0
CHANGELOG.md

@@ -6,6 +6,8 @@ This project adheres to [Semantic Versioning](http://semver.org/).
 ### Added
 - Extract the breadcrumbs building part of the `AbstractAdmin` to a separate class
 - Added `AbstractAdmin::getSearchResultLink` method
+- Add the `AbstractAdmin::showMosaicButton` method
+- Add the `show_mosaic_button` option to configuration
 
 ## [3.1.0](https://github.com/sonata-project/SonataAdminBundle/compare/3.0.0...3.1.0) - 2016-05-17
 ### Added

+ 10 - 0
DependencyInjection/Compiler/AddDependencyCallsCompilerPass.php

@@ -309,6 +309,16 @@ class AddDependencyCallsCompilerPass implements CompilerPassInterface
 
         $definition->addMethodCall('setPersistFilters', array($persistFilters));
 
+        if (isset($overwriteAdminConfiguration['show_mosaic_button'])) {
+            $showMosaicButton = $overwriteAdminConfiguration['show_mosaic_button'];
+        } elseif (isset($attributes['show_mosaic_button'])) {
+            $showMosaicButton = $attributes['show_mosaic_button'];
+        } else {
+            $showMosaicButton = $container->getParameter('sonata.admin.configuration.show.mosaic.button');
+        }
+
+        $definition->addMethodCall('showMosaicButton', array($showMosaicButton));
+
         $this->fixTemplates($container, $definition, isset($overwriteAdminConfiguration['templates']) ? $overwriteAdminConfiguration['templates'] : array('view' => array()));
 
         if ($container->hasParameter('sonata.admin.configuration.security.information') && !$definition->hasMethodCall('setSecurityInformation')) {

+ 5 - 0
DependencyInjection/Configuration.php

@@ -382,6 +382,11 @@ class Configuration implements ConfigurationInterface
 
                 ->scalarNode('persist_filters')->defaultFalse()->end()
 
+                ->booleanNode('show_mosaic_button')
+                    ->defaultTrue()
+                    ->info('Show mosaic button on all admin screens')
+                ->end()
+
             ->end()
         ->end();
 

+ 2 - 0
DependencyInjection/SonataAdminExtension.php

@@ -203,6 +203,8 @@ BOOM
         // set filter persistence
         $container->setParameter('sonata.admin.configuration.filters.persist', $config['persist_filters']);
 
+        $container->setParameter('sonata.admin.configuration.show.mosaic.button', $config['show_mosaic_button']);
+
         $this->configureClassesToCompile();
 
         $this->replacePropertyAccessor($container);

+ 28 - 0
Resources/doc/reference/action_list.rst

@@ -546,3 +546,31 @@ You can :
     }
 
 .. _`issues on GitHub`: https://github.com/sonata-project/SonataAdminBundle/issues/1519
+
+Mosaic view button
+------------------
+
+You have the possibility to show/hide mosaic view button.
+
+.. code-block:: yaml
+
+    sonata_admin:
+        # for hide mosaic view button on all screen using `false`
+        show_mosaic_button:   true
+
+You can show/hide mosaic view button using admin service configuration. You need to add option ``show_mosaic_button``
+in your admin services:
+
+.. code-block:: yaml
+
+    sonata_admin.admin.post:
+        class: Sonata\AdminBundle\Admin\PostAdmin
+        arguments: [~, Sonata\AdminBundle\Entity\Post, ~]
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: admin, label: Post, show_mosaic_button: true }
+
+    sonata_admin.admin.news:
+        class: Sonata\AdminBundle\Admin\NewsAdmin
+        arguments: [~, Sonata\AdminBundle\Entity\News, ~]
+        tags:
+            - { name: sonata.admin, manager_type: orm, group: admin, label: News, show_mosaic_button: false }

+ 1 - 0
Resources/doc/reference/configuration.rst

@@ -213,3 +213,4 @@ Full Configuration Options
                     instanceof:           []
                     uses:                 []
             persist_filters:      false
+            show_mosaic_button:   true

+ 27 - 0
Tests/Admin/AdminTest.php

@@ -1576,6 +1576,33 @@ class AdminTest extends \PHPUnit_Framework_TestCase
         $this->assertSame($expected, $modelAdmin->getBatchActions());
     }
 
+    /**
+     * @covers Sonata\AdminBundle\Admin\AbstractAdmin::showMosaicButton
+     */
+    public function testShowMosaicButton()
+    {
+        $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
+        $listModes = $admin->getListModes();
+
+        $admin->showMosaicButton(true);
+
+        $this->assertSame($listModes, $admin->getListModes());
+    }
+
+    /**
+     * @covers Sonata\AdminBundle\Admin\AbstractAdmin::showMosaicButton
+     */
+    public function testShowMosaicButtonHideMosaic()
+    {
+        $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
+        $listModes = $admin->getListModes();
+        $expected['list'] = $listModes['list'];
+
+        $admin->showMosaicButton(false);
+
+        $this->assertSame($expected, $admin->getListModes());
+    }
+
     /**
      * @covers Sonata\AdminBundle\Admin\AbstractAdmin::getDashboardActions
      * @dataProvider provideGetBaseRouteName

+ 40 - 0
Tests/DependencyInjection/Compiler/AddDependencyCallsCompilerPassTest.php

@@ -288,6 +288,36 @@ class AddDependencyCallsCompilerPassTest extends \PHPUnit_Framework_TestCase
         }
     }
 
+    public function testApplyShowMosaicButtonConfiguration()
+    {
+        $container = $this->getContainer();
+
+        $this->extension->load(array($this->getConfig()), $container);
+
+        $compilerPass = new AddDependencyCallsCompilerPass();
+        $compilerPass->process($container);
+
+        $callsReportOneAdmin = $container->getDefinition('sonata_report_one_admin')->getMethodCalls();
+
+        foreach ($callsReportOneAdmin as $call) {
+            list($name, $parameters) = $call;
+
+            if ($name == 'showMosaicButton') {
+                $this->assertSame(false, $parameters[0]);
+            }
+        }
+
+        $callsReportTwoAdmin = $container->getDefinition('sonata_report_two_admin')->getMethodCalls();
+
+        foreach ($callsReportTwoAdmin as $call) {
+            list($name, $parameters) = $call;
+
+            if ($name == 'showMosaicButton') {
+                $this->assertSame(true, $parameters[0]);
+            }
+        }
+    }
+
     public function testProcessMultipleOnTopOptions()
     {
         $container = $this->getContainer();
@@ -612,6 +642,16 @@ class AddDependencyCallsCompilerPassTest extends \PHPUnit_Framework_TestCase
             ->setClass('Sonata\AdminBundle\Tests\DependencyInjection\MockAdmin')
             ->setArguments(array('', 'Sonata\AdminBundle\Tests\DependencyInjection\Report', 'SonataAdminBundle:CRUD'))
             ->addTag('sonata.admin', array('group' => 'sonata_report_group', 'manager_type' => 'orm', 'on_top' => true));
+        $container
+            ->register('sonata_report_one_admin')
+            ->setClass('Sonata\AdminBundle\Tests\DependencyInjection\MockAdmin')
+            ->setArguments(array('', 'Sonata\AdminBundle\Tests\DependencyInjection\ReportOne', 'SonataAdminBundle:CRUD'))
+            ->addTag('sonata.admin', array('group' => 'sonata_report_one_group', 'manager_type' => 'orm', 'show_mosaic_button' => false));
+        $container
+            ->register('sonata_report_two_admin')
+            ->setClass('Sonata\AdminBundle\Tests\DependencyInjection\MockAdmin')
+            ->setArguments(array('', 'Sonata\AdminBundle\Tests\DependencyInjection\ReportTwo', 'SonataAdminBundle:CRUD'))
+            ->addTag('sonata.admin', array('group' => 'sonata_report_two_group', 'manager_type' => 'orm', 'show_mosaic_button' => true));
 
         // translator
         $container