From c707fccf69cfb6683d7f905d0e440ffa35874e5a Mon Sep 17 00:00:00 2001 From: Sacha Judd Date: Wed, 6 Sep 2017 10:58:06 +1200 Subject: [PATCH] NEW Allow GridFieldEditButton to have configurable HTML classes. Change edit icon. --- src/Forms/GridField/GridFieldEditButton.php | 49 ++++++++++++++++++- .../Forms/GridField/GridFieldEditButton.ss | 2 +- .../GridField/GridFieldEditButtonTest.php | 34 +++++++++++++ 3 files changed, 83 insertions(+), 2 deletions(-) diff --git a/src/Forms/GridField/GridFieldEditButton.php b/src/Forms/GridField/GridFieldEditButton.php index 0ddade088..10efe1d45 100644 --- a/src/Forms/GridField/GridFieldEditButton.php +++ b/src/Forms/GridField/GridFieldEditButton.php @@ -19,6 +19,16 @@ use SilverStripe\View\SSViewer; */ class GridFieldEditButton implements GridField_ColumnProvider { + /** + * HTML classes to be added to GridField edit buttons + * + * @var string[] + */ + protected $extraClass = [ + 'grid-field__icon-action--hidden-on-hover' => true, + 'font-icon-edit' => true, + 'btn--icon-large' => true + ]; /** * Add a column 'Delete' @@ -95,13 +105,50 @@ class GridFieldEditButton implements GridField_ColumnProvider // which can make the form readonly if no edit permissions are available. $data = new ArrayData(array( - 'Link' => Controller::join_links($gridField->Link('item'), $record->ID, 'edit') + 'Link' => Controller::join_links($gridField->Link('item'), $record->ID, 'edit'), + 'ExtraClass' => $this->getExtraClass() )); $template = SSViewer::get_templates_by_class($this, '', __CLASS__); return $data->renderWith($template); } + /** + * Get the extra HTML classes to add for edit buttons + * + * @return string + */ + public function getExtraClass() + { + return implode(' ', array_keys($this->extraClass)); + } + + /** + * Add an extra HTML class + * + * @param string $class + * @return $this + */ + public function addExtraClass($class) + { + $this->extraClass[$class] = true; + + return $this; + } + + /** + * Remove an HTML class + * + * @param string $class + * @return $this + */ + public function removeExtraClass($class) + { + unset($this->extraClass[$class]); + + return $this; + } + /** * Handle the actions and apply any changes to the GridField. * diff --git a/templates/SilverStripe/Forms/GridField/GridFieldEditButton.ss b/templates/SilverStripe/Forms/GridField/GridFieldEditButton.ss index 3c2302419..31f93b137 100644 --- a/templates/SilverStripe/Forms/GridField/GridFieldEditButton.ss +++ b/templates/SilverStripe/Forms/GridField/GridFieldEditButton.ss @@ -1,5 +1,5 @@ <%t SilverStripe\\Forms\\GridField\\GridFieldEditButton_ss.EDIT 'Edit' %> diff --git a/tests/php/Forms/GridField/GridFieldEditButtonTest.php b/tests/php/Forms/GridField/GridFieldEditButtonTest.php index 8c6c5abaa..70c9842d3 100644 --- a/tests/php/Forms/GridField/GridFieldEditButtonTest.php +++ b/tests/php/Forms/GridField/GridFieldEditButtonTest.php @@ -86,4 +86,38 @@ class GridFieldEditButtonTest extends SapphireTest $editLinks = $content->getBySelector('.edit-link'); $this->assertEquals(3, count($editLinks), 'Edit links should show when logged in.'); } + + public function testDefaultClassesAreSet() + { + $button = new GridFieldEditButton; + + $expected = [ + 'grid-field__icon-action--hidden-on-hover', + 'font-icon-edit', + 'btn--icon-large' + ]; + + $result = $button->getExtraClass(); + + foreach ($expected as $className) { + $this->assertContains($className, $result); + } + } + + public function testAddAndRemoveExtraClass() + { + $button = new GridFieldEditButton; + + $button->addExtraClass('foobar'); + $this->assertContains('foobar', $button->getExtraClass()); + + $button->removeExtraClass('foobar'); + $this->assertNotContains('foobar', $button->getExtraClass()); + + // Check that duplicates are removed + $button->addExtraClass('foobar'); + $button->addExtraClass('foobar'); + $button->removeExtraClass('foobar'); + $this->assertNotContains('foobar', $button->getExtraClass()); + } }