mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-09-29 12:49:06 +02:00
BUGFIX: Allow buttons to opt out of display (#8113)
* Allow buttons to opt out of display * Linting * Remove redundant function call * Add test for group delete action * Add menu group check and test for delete action * Fix linting
This commit is contained in:
parent
b20100c2f6
commit
31ad3cdaab
@ -64,7 +64,9 @@ class GridFieldDeleteAction implements GridField_ColumnProvider, GridField_Actio
|
|||||||
*/
|
*/
|
||||||
public function getGroup($gridField, $record, $columnName)
|
public function getGroup($gridField, $record, $columnName)
|
||||||
{
|
{
|
||||||
return GridField_ActionMenuItem::DEFAULT_GROUP;
|
$field = $this->getRemoveAction($gridField, $record, $columnName);
|
||||||
|
|
||||||
|
return $field ? GridField_ActionMenuItem::DEFAULT_GROUP: null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -41,6 +41,22 @@ class GridFieldGroupDeleteAction extends GridFieldDeleteAction
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the ActionMenu group (not related to Member group)
|
||||||
|
* @param GridField $gridField
|
||||||
|
* @param DataObject $record
|
||||||
|
* @param $columnName
|
||||||
|
* @return null|string
|
||||||
|
*/
|
||||||
|
public function getGroup($gridField, $record, $columnName)
|
||||||
|
{
|
||||||
|
if (!$this->canUnlink($record)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::getGroup($gridField, $record, $columnName);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle the actions and apply any changes to the GridField
|
* Handle the actions and apply any changes to the GridField
|
||||||
*
|
*
|
||||||
|
@ -31,15 +31,21 @@ class GridField_ActionMenu implements GridField_ColumnProvider, GridField_Action
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$schema = array_map(function (GridField_ActionMenuItem $item) use ($gridField, $record, $columnName) {
|
$schema = [];
|
||||||
return [
|
/* @var GridField_ActionMenuItem $item */
|
||||||
|
foreach ($items as $item) {
|
||||||
|
$group = $item->getGroup($gridField, $record, $columnName);
|
||||||
|
if (!$group) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$schema[] = [
|
||||||
'type' => $item instanceof GridField_ActionMenuLink ? 'link' : 'submit',
|
'type' => $item instanceof GridField_ActionMenuLink ? 'link' : 'submit',
|
||||||
'title' => $item->getTitle($gridField, $record, $columnName),
|
'title' => $item->getTitle($gridField, $record, $columnName),
|
||||||
'url' => $item instanceof GridField_ActionMenuLink ? $item->getUrl($gridField, $record, $columnName) : null,
|
'url' => $item instanceof GridField_ActionMenuLink ? $item->getUrl($gridField, $record, $columnName) : null,
|
||||||
'group' => $item->getGroup($gridField, $record, $columnName),
|
'group' => $group,
|
||||||
'data' => $item->getExtraData($gridField, $record, $columnName),
|
'data' => $item->getExtraData($gridField, $record, $columnName),
|
||||||
];
|
];
|
||||||
}, $items);
|
}
|
||||||
|
|
||||||
$templateData = ArrayData::create([
|
$templateData = ArrayData::create([
|
||||||
'Schema' => Convert::raw2json($schema),
|
'Schema' => Convert::raw2json($schema),
|
||||||
|
@ -40,14 +40,15 @@ interface GridField_ActionMenuItem extends GridFieldComponent
|
|||||||
public function getExtraData($gridField, $record, $columnName);
|
public function getExtraData($gridField, $record, $columnName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the group this menu item will belong to
|
* Gets the group this menu item will belong to. A null value should indicate
|
||||||
|
* the button should not display.
|
||||||
*
|
*
|
||||||
* @see {@link GridField_ActionMenu->getColumnContent()}
|
* @see {@link GridField_ActionMenu->getColumnContent()}
|
||||||
*
|
*
|
||||||
* @param GridField $gridField
|
* @param GridField $gridField
|
||||||
* @param DataObject $record
|
* @param DataObject $record
|
||||||
*
|
*
|
||||||
* @return string $group
|
* @return string|null $group
|
||||||
*/
|
*/
|
||||||
public function getGroup($gridField, $record, $columnName);
|
public function getGroup($gridField, $record, $columnName);
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ use SilverStripe\Forms\GridField\GridField_ActionMenu;
|
|||||||
use SilverStripe\Forms\GridField\GridFieldConfig;
|
use SilverStripe\Forms\GridField\GridFieldConfig;
|
||||||
use SilverStripe\Forms\GridField\GridFieldEditButton;
|
use SilverStripe\Forms\GridField\GridFieldEditButton;
|
||||||
use SilverStripe\Forms\GridField\GridFieldDeleteAction;
|
use SilverStripe\Forms\GridField\GridFieldDeleteAction;
|
||||||
|
use SilverStripe\Forms\Tests\GridField\GridFieldConfigTest\MyActionMenuItemComponent;
|
||||||
use SilverStripe\Forms\Tests\GridField\GridFieldTest\Cheerleader;
|
use SilverStripe\Forms\Tests\GridField\GridFieldTest\Cheerleader;
|
||||||
use SilverStripe\Forms\Tests\GridField\GridFieldTest\Permissions;
|
use SilverStripe\Forms\Tests\GridField\GridFieldTest\Permissions;
|
||||||
use SilverStripe\Forms\Tests\GridField\GridFieldTest\Player;
|
use SilverStripe\Forms\Tests\GridField\GridFieldTest\Player;
|
||||||
@ -84,6 +85,42 @@ class GridFieldActionMenuTest extends SapphireTest
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testHiddenActionMenuItems()
|
||||||
|
{
|
||||||
|
$config = GridFieldConfig::create()
|
||||||
|
->addComponent(new MyActionMenuItemComponent(true))
|
||||||
|
->addComponent(new GridFieldDeleteAction())
|
||||||
|
->addComponent($menu = new GridField_ActionMenu());
|
||||||
|
$this->gridField->setConfig($config);
|
||||||
|
|
||||||
|
$html = $menu->getColumnContent($this->gridField, new Team(), 'test');
|
||||||
|
$content = new CSSContentParser($html);
|
||||||
|
/* @var \SimpleXMLElement $node */
|
||||||
|
$node = $content->getBySelector('.gridfield-actionmenu__container');
|
||||||
|
$this->assertNotNull($node);
|
||||||
|
$this->assertCount(1, $node);
|
||||||
|
$schema = (string) $node[0]->attributes()['data-schema'];
|
||||||
|
$json = json_decode($schema, true);
|
||||||
|
$this->assertCount(2, $json);
|
||||||
|
|
||||||
|
// Now set the component to not display
|
||||||
|
$config = GridFieldConfig::create()
|
||||||
|
->addComponent(new MyActionMenuItemComponent(false))
|
||||||
|
->addComponent(new GridFieldDeleteAction())
|
||||||
|
->addComponent($menu = new GridField_ActionMenu());
|
||||||
|
$this->gridField->setConfig($config);
|
||||||
|
|
||||||
|
$html = $menu->getColumnContent($this->gridField, new Team(), 'test');
|
||||||
|
$content = new CSSContentParser($html);
|
||||||
|
/* @var \SimpleXMLElement $node */
|
||||||
|
$node = $content->getBySelector('.gridfield-actionmenu__container');
|
||||||
|
$this->assertNotNull($node);
|
||||||
|
$this->assertCount(1, $node);
|
||||||
|
$schema = (string) $node[0]->attributes()['data-schema'];
|
||||||
|
$json = json_decode($schema, true);
|
||||||
|
$this->assertCount(1, $json);
|
||||||
|
}
|
||||||
|
|
||||||
public function testShowEditLinksWithAdminPermission()
|
public function testShowEditLinksWithAdminPermission()
|
||||||
{
|
{
|
||||||
$this->logInWithPermission('ADMIN');
|
$this->logInWithPermission('ADMIN');
|
||||||
|
@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace SilverStripe\Forms\Tests\GridField\GridFieldConfigTest;
|
||||||
|
|
||||||
|
use SilverStripe\Dev\TestOnly;
|
||||||
|
use SilverStripe\Forms\GridField\GridField_ActionMenuItem;
|
||||||
|
use SilverStripe\Forms\GridField\GridFieldEditButton;
|
||||||
|
|
||||||
|
class MyActionMenuItemComponent extends GridFieldEditButton implements TestOnly
|
||||||
|
{
|
||||||
|
protected $shouldDisplay;
|
||||||
|
|
||||||
|
public function __construct($shouldDisplay = true)
|
||||||
|
{
|
||||||
|
$this->shouldDisplay = $shouldDisplay;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getGroup($gridField, $record, $columnName)
|
||||||
|
{
|
||||||
|
return $this->shouldDisplay ? GridField_ActionMenuItem::DEFAULT_GROUP : null;
|
||||||
|
}
|
||||||
|
}
|
@ -214,4 +214,20 @@ class GridFieldDeleteActionTest extends SapphireTest
|
|||||||
$gridField->gridFieldAlterAction(array('StateID'=>$stateID), $this->form, $request);
|
$gridField->gridFieldAlterAction(array('StateID'=>$stateID), $this->form, $request);
|
||||||
$this->assertEquals(2, $this->list->count(), 'User should be able to delete records with ADMIN permission.');
|
$this->assertEquals(2, $this->list->count(), 'User should be able to delete records with ADMIN permission.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testMenuGroup()
|
||||||
|
{
|
||||||
|
$this->logInWithPermission('ADMIN');
|
||||||
|
|
||||||
|
$config = GridFieldConfig::create()->addComponent($action = new GridFieldDeleteAction(true));
|
||||||
|
$gridField = new GridField('testfield', 'testfield', $this->list, $config);
|
||||||
|
new Form(null, 'mockform', new FieldList(array($gridField)), new FieldList());
|
||||||
|
$group = $action->getGroup($gridField, $this->list->first(), 'dummy');
|
||||||
|
$this->assertNotNull($group, 'A menu group exists when the user can delete');
|
||||||
|
|
||||||
|
$this->logOut();
|
||||||
|
|
||||||
|
$group = $action->getGroup($gridField, $this->list->first(), 'dummy');
|
||||||
|
$this->assertNull($group, 'A menu group does not exist when the user cannot delete');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
45
tests/php/Forms/GridField/GridFieldGroupDeleteActionTest.php
Normal file
45
tests/php/Forms/GridField/GridFieldGroupDeleteActionTest.php
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace SilverStripe\Forms\Tests\GridField;
|
||||||
|
|
||||||
|
use SilverStripe\Dev\SapphireTest;
|
||||||
|
use SilverStripe\Forms\FieldList;
|
||||||
|
use SilverStripe\Forms\Form;
|
||||||
|
use SilverStripe\Forms\GridField\GridField;
|
||||||
|
use SilverStripe\Forms\GridField\GridFieldGroupDeleteAction;
|
||||||
|
use SilverStripe\Security\Group;
|
||||||
|
use SilverStripe\Security\Member;
|
||||||
|
use SilverStripe\Security\Security;
|
||||||
|
|
||||||
|
class GridFieldGroupDeleteActionTest extends SapphireTest
|
||||||
|
{
|
||||||
|
protected static $fixture_file = 'GridFieldGroupDeleteActionTest.yml';
|
||||||
|
|
||||||
|
public function testCanUnlink()
|
||||||
|
{
|
||||||
|
/* @var Group $group*/
|
||||||
|
$group = $this->objFromFixture(Group::class, 'admingroup');
|
||||||
|
/* @var Group $othergroup*/
|
||||||
|
$othergroup = $this->objFromFixture(Group::class, 'otheradmingroup');
|
||||||
|
|
||||||
|
/* @var Member $member */
|
||||||
|
$member = $this->objFromFixture(Member::class, 'admin');
|
||||||
|
Security::setCurrentUser($member);
|
||||||
|
|
||||||
|
$gridField = GridField::create('test');
|
||||||
|
Form::create(null, 'dummy', FieldList::create($gridField), FieldList::create());
|
||||||
|
|
||||||
|
$button = new GridFieldGroupDeleteAction($group->ID);
|
||||||
|
$actionGroup = $button->getGroup($gridField, $member, 'dummy');
|
||||||
|
$column = $button->getColumnContent($gridField, $member, 'dummy');
|
||||||
|
$this->assertNotNull($actionGroup, 'The unlink action has a menu group if the member has another admin group');
|
||||||
|
$this->assertNotNull($column, 'The unlink action has a column content if the member has another admin group');
|
||||||
|
|
||||||
|
$member->Groups()->remove($othergroup);
|
||||||
|
|
||||||
|
$actionGroup = $button->getGroup($gridField, $member, 'dummy');
|
||||||
|
$column = $button->getColumnContent($gridField, $member, 'dummy');
|
||||||
|
$this->assertNull($actionGroup, 'The unlink action has no menu group if the member has no other admin group');
|
||||||
|
$this->assertNull($column, 'The unlink action has no column content if the member has no other admin group');
|
||||||
|
}
|
||||||
|
}
|
18
tests/php/Forms/GridField/GridFieldGroupDeleteActionTest.yml
Normal file
18
tests/php/Forms/GridField/GridFieldGroupDeleteActionTest.yml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
'SilverStripe\Security\Group':
|
||||||
|
admingroup:
|
||||||
|
Code: admingroup
|
||||||
|
otheradmingroup:
|
||||||
|
Code: otheradmingroup
|
||||||
|
SilverStripe\Security\Member:
|
||||||
|
admin:
|
||||||
|
FirstName: Admin
|
||||||
|
Groups:
|
||||||
|
- '=>SilverStripe\Security\Group.admingroup'
|
||||||
|
- '=>SilverStripe\Security\Group.otheradmingroup'
|
||||||
|
'SilverStripe\Security\Permission':
|
||||||
|
admincode:
|
||||||
|
Code: ADMIN
|
||||||
|
Group: '=>SilverStripe\Security\Group.admingroup'
|
||||||
|
otheradmincode:
|
||||||
|
Code: ADMIN
|
||||||
|
Group: '=>SilverStripe\Security\Group.otheradmingroup'
|
Loading…
Reference in New Issue
Block a user