Skip to content

Commit

Permalink
API Convert SecurityAdmin to be a ModelAdmin
Browse files Browse the repository at this point in the history
Co-authored-by: Maxime Rainville <[email protected]>
  • Loading branch information
emteknetnz and Maxime Rainville committed Sep 6, 2022
1 parent ec1111f commit 1025700
Show file tree
Hide file tree
Showing 3 changed files with 159 additions and 156 deletions.
251 changes: 127 additions & 124 deletions code/SecurityAdmin.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,19 +30,19 @@
/**
* Security section of the CMS
*/
class SecurityAdmin extends LeftAndMain implements PermissionProvider
class SecurityAdmin extends ModelAdmin implements PermissionProvider
{

private static $url_segment = 'security';
private static $managed_models = [
Member::class,
Group::class,
PermissionRole::class
];

private static $url_rule = '/$Action/$ID/$OtherID';
private static $url_segment = 'security';

private static $menu_title = 'Security';

private static $tree_class = Group::class;

private static $subitem_class = Member::class;

private static $required_permission_codes = 'CMS_ACCESS_SecurityAdmin';

private static $menu_icon_class = 'font-icon-torsos-all';
Expand All @@ -63,6 +63,7 @@ class SecurityAdmin extends LeftAndMain implements PermissionProvider
*
* @param HTTPRequest $request
* @return HTTPResponse
* @deprecated 1.5
*/
public function users($request)
{
Expand All @@ -74,6 +75,7 @@ public function users($request)
*
* @param HTTPRequest $request
* @return HTTPResponse
* @deprecated 1.5
*/
public function groups($request)
{
Expand All @@ -85,129 +87,130 @@ public function groups($request)
*
* @param HTTPRequest $request
* @return HTTPResponse
* @deprecated 1.5
*/
public function roles($request)
{
return $this->index($request);
}

public function getEditForm($id = null, $fields = null)
{
// Build gridfield configs
$memberListConfig = GridFieldConfig_RecordEditor::create()
->addComponent(Injector::inst()->createWithArgs(GridFieldExportButton::class, ['buttons-before-left']));
$groupListConfig = GridFieldConfig_RecordEditor::create()
->addComponent(Injector::inst()->createWithArgs(GridFieldExportButton::class, ['buttons-before-left']));

/** @var GridFieldDetailForm $detailForm */
$detailForm = $memberListConfig->getComponentByType(GridFieldDetailForm::class);
$memberValidator = Member::singleton()->getValidator();
$detailForm->setValidator($memberValidator);

/** @var GridFieldPageCount $groupPaginator */
$groupListConfig->removeComponentsByType(GridFieldPageCount::class);
$groupListConfig->addComponent(Injector::inst()->createWithArgs(GridFieldPageCount::class, ['buttons-before-right']));

// Add import capabilities. Limit to admin since the import logic can affect assigned permissions
if (Permission::check('ADMIN')) {
// @todo when grid field is converted to react use the react component
$memberListConfig->addComponent(
GridFieldImportButton::create('buttons-before-left')
->setImportIframe($this->Link('memberimport'))
->setModalTitle(_t(__CLASS__ . '.IMPORTUSERS', 'Import users'))
);
$groupListConfig->addComponent(
GridFieldImportButton::create('buttons-before-left')
->setImportIframe($this->Link('groupimport'))
->setModalTitle(_t(__CLASS__ . '.IMPORTGROUPS', 'Import groups'))
);
}

// Build gridfield
$memberList = GridField::create(
'Members',
false,
Member::get(),
$memberListConfig
)->addExtraClass("members_grid");

// Build group fields
$groupList = GridField::create(
'Groups',
false,
Group::get(),
$groupListConfig
);
/** @var GridFieldDataColumns $columns */
$columns = $groupList->getConfig()->getComponentByType(GridFieldDataColumns::class);
$columns->setDisplayFields([
'Breadcrumbs' => Group::singleton()->fieldLabel('Title')
]);
$columns->setFieldFormatting([
'Breadcrumbs' => function ($val, $item) {
/** @var Group $item */
return Convert::raw2xml($item->getBreadcrumbs(' > '));
}
]);

$fields = FieldList::create(
TabSet::create(
'Root',
Tab::create(
'Users',
_t(__CLASS__ . '.Users', 'Users'),
LiteralField::create(
'MembersCautionText',
sprintf(
'<div class="alert alert-warning" role="alert">%s</div>',
_t(
__CLASS__ . '.MemberListCaution',
'Caution: Removing members from this list will remove them from all groups and the database'
)
)
),
$memberList
),
Tab::create(
'Groups',
Group::singleton()->i18n_plural_name(),
$groupList
)
)->setTemplate('SilverStripe\\Forms\\CMSTabSet'),
// necessary for tree node selection in LeftAndMain.EditForm.js
new HiddenField('ID', false, 0)
);

// Add roles editing interface
$rolesTab = null;
if (Permission::check('APPLY_ROLES')) {
$rolesField = GridField::create(
'Roles',
false,
PermissionRole::get(),
GridFieldConfig_RecordEditor::create()
);

$rolesTab = $fields->findOrMakeTab('Root.Roles', _t(__CLASS__ . '.TABROLES', 'Roles'));
$rolesTab->push($rolesField);
}

// Build replacement form
$form = Form::create(
$this,
'EditForm',
$fields,
new FieldList()
)->setHTMLID('Form_EditForm');
$form->addExtraClass('cms-edit-form fill-height');
$form->setTemplate($this->getTemplatesWithSuffix('_EditForm'));
$form->addExtraClass('ss-tabset cms-tabset ' . $this->BaseCSSClasses());
$form->setAttribute('data-pjax-fragment', 'CurrentForm');

$this->extend('updateEditForm', $form);

return $form;
}
// public function getEditForm($id = null, $fields = null)
// {
// // Build gridfield configs
// $memberListConfig = GridFieldConfig_RecordEditor::create()
// ->addComponent(Injector::inst()->createWithArgs(GridFieldExportButton::class, ['buttons-before-left']));
// $groupListConfig = GridFieldConfig_RecordEditor::create()
// ->addComponent(Injector::inst()->createWithArgs(GridFieldExportButton::class, ['buttons-before-left']));

// /** @var GridFieldDetailForm $detailForm */
// $detailForm = $memberListConfig->getComponentByType(GridFieldDetailForm::class);
// $memberValidator = Member::singleton()->getValidator();
// $detailForm->setValidator($memberValidator);

// /** @var GridFieldPageCount $groupPaginator */
// $groupListConfig->removeComponentsByType(GridFieldPageCount::class);
// $groupListConfig->addComponent(Injector::inst()->createWithArgs(GridFieldPageCount::class, ['buttons-before-right']));

// // Add import capabilities. Limit to admin since the import logic can affect assigned permissions
// if (Permission::check('ADMIN')) {
// // @todo when grid field is converted to react use the react component
// $memberListConfig->addComponent(
// GridFieldImportButton::create('buttons-before-left')
// ->setImportIframe($this->Link('memberimport'))
// ->setModalTitle(_t(__CLASS__ . '.IMPORTUSERS', 'Import users'))
// );
// $groupListConfig->addComponent(
// GridFieldImportButton::create('buttons-before-left')
// ->setImportIframe($this->Link('groupimport'))
// ->setModalTitle(_t(__CLASS__ . '.IMPORTGROUPS', 'Import groups'))
// );
// }

// // Build gridfield
// $memberList = GridField::create(
// 'Members',
// false,
// Member::get(),
// $memberListConfig
// )->addExtraClass("members_grid");

// // Build group fields
// $groupList = GridField::create(
// 'Groups',
// false,
// Group::get(),
// $groupListConfig
// );
// /** @var GridFieldDataColumns $columns */
// $columns = $groupList->getConfig()->getComponentByType(GridFieldDataColumns::class);
// $columns->setDisplayFields([
// 'Breadcrumbs' => Group::singleton()->fieldLabel('Title')
// ]);
// $columns->setFieldFormatting([
// 'Breadcrumbs' => function ($val, $item) {
// /** @var Group $item */
// return Convert::raw2xml($item->getBreadcrumbs(' > '));
// }
// ]);

// $fields = FieldList::create(
// TabSet::create(
// 'Root',
// Tab::create(
// 'Users',
// _t(__CLASS__ . '.Users', 'Users'),
// LiteralField::create(
// 'MembersCautionText',
// sprintf(
// '<div class="alert alert-warning" role="alert">%s</div>',
// _t(
// __CLASS__ . '.MemberListCaution',
// 'Caution: Removing members from this list will remove them from all groups and the database'
// )
// )
// ),
// $memberList
// ),
// Tab::create(
// 'Groups',
// Group::singleton()->i18n_plural_name(),
// $groupList
// )
// )->setTemplate('SilverStripe\\Forms\\CMSTabSet'),
// // necessary for tree node selection in LeftAndMain.EditForm.js
// new HiddenField('ID', false, 0)
// );

// // Add roles editing interface
// $rolesTab = null;
// if (Permission::check('APPLY_ROLES')) {
// $rolesField = GridField::create(
// 'Roles',
// false,
// PermissionRole::get(),
// GridFieldConfig_RecordEditor::create()
// );

// $rolesTab = $fields->findOrMakeTab('Root.Roles', _t(__CLASS__ . '.TABROLES', 'Roles'));
// $rolesTab->push($rolesField);
// }

// // Build replacement form
// $form = Form::create(
// $this,
// 'EditForm',
// $fields,
// new FieldList()
// )->setHTMLID('Form_EditForm');
// $form->addExtraClass('cms-edit-form fill-height');
// $form->setTemplate($this->getTemplatesWithSuffix('_EditForm'));
// $form->addExtraClass('ss-tabset cms-tabset ' . $this->BaseCSSClasses());
// $form->setAttribute('data-pjax-fragment', 'CurrentForm');

// $this->extend('updateEditForm', $form);

// return $form;
// }

public function memberimport()
{
Expand Down
Loading

0 comments on commit 1025700

Please sign in to comment.