|
<?php |
|
|
|
use SilverStripe\Control\Controller; |
|
use SilverStripe\ORM\DataObject; |
|
use SilverStripe\ORM\ValidationException; |
|
use SilverStripe\Forms\GridField\GridField; |
|
use SilverStripe\Forms\GridField\GridField_FormAction; |
|
use SilverStripe\Forms\GridField\GridField_ColumnProvider; |
|
use SilverStripe\Forms\GridField\GridField_ActionProvider; |
|
use SilverStripe\Forms\GridField\GridField_ActionMenuItem; |
|
|
|
class GridFieldRestrictedRiderAction implements GridField_ColumnProvider, GridField_ActionProvider, GridField_ActionMenuItem |
|
{ |
|
/** |
|
* |
|
*/ |
|
public function getRider($record) |
|
{ |
|
if ($record instanceof Licence) { |
|
$rider = $record->Rider(); |
|
} else { |
|
$rider = $record; |
|
} |
|
|
|
return $rider; |
|
} |
|
|
|
/** |
|
* @inheritdoc |
|
*/ |
|
public function getTitle($gridField, $record, $columnName) |
|
{ |
|
$rider = $this->getRider($record); |
|
|
|
if (!$rider->isDisqualified()) { |
|
return 'Add to Restricted Riders'; |
|
} else { |
|
return 'Remove from Restricted Riders'; |
|
} |
|
} |
|
|
|
/** |
|
* @inheritdoc |
|
*/ |
|
public function getGroup($gridField, $record, $columnName) |
|
{ |
|
$field = $this->getFormAction($gridField, $record, $columnName); |
|
|
|
return $field ? GridField_ActionMenuItem::DEFAULT_GROUP: null; |
|
} |
|
|
|
/** |
|
* |
|
* @param GridField $gridField |
|
* @param DataObject $record |
|
* @param string $columnName |
|
* @return string|null the attribles for the action |
|
*/ |
|
public function getExtraData($gridField, $record, $columnName) |
|
{ |
|
$field = $this->getFormAction($gridField, $record, $columnName); |
|
|
|
if ($field) { |
|
return $field->getAttributes(); |
|
} |
|
|
|
return null; |
|
} |
|
|
|
/** |
|
* Add a column 'Delete' |
|
* |
|
* @param GridField $gridField |
|
* @param array $columns |
|
*/ |
|
public function augmentColumns($gridField, &$columns) |
|
{ |
|
if (!in_array('Actions', $columns)) { |
|
$columns[] = 'Actions'; |
|
} |
|
} |
|
|
|
/** |
|
* Return any special attributes that will be used for FormField::create_tag() |
|
* |
|
* @param GridField $gridField |
|
* @param DataObject $record |
|
* @param string $columnName |
|
* @return array |
|
*/ |
|
public function getColumnAttributes($gridField, $record, $columnName) |
|
{ |
|
return ['class' => 'grid-field__col-compact']; |
|
} |
|
|
|
/** |
|
* Add the title |
|
* |
|
* @param GridField $gridField |
|
* @param string $columnName |
|
* @return array |
|
*/ |
|
public function getColumnMetadata($gridField, $columnName) |
|
{ |
|
if ($columnName == 'Actions') { |
|
return ['title' => '']; |
|
} |
|
} |
|
|
|
/** |
|
* Which columns are handled by this component |
|
* |
|
* @param GridField $gridField |
|
* @return array |
|
*/ |
|
public function getColumnsHandled($gridField) |
|
{ |
|
return ['Actions']; |
|
} |
|
|
|
/** |
|
* Which GridField actions are this component handling |
|
* |
|
* @param GridField $gridField |
|
* @return array |
|
*/ |
|
public function getActions($gridField) |
|
{ |
|
return ['restrictrider', 'unrestrictrider']; |
|
} |
|
|
|
/** |
|
* |
|
* @param GridField $gridField |
|
* @param DataObject $record |
|
* @param string $columnName |
|
* @return string|null the HTML for the column |
|
*/ |
|
public function getColumnContent($gridField, $record, $columnName) |
|
{ |
|
$field = $this->getFormAction($gridField, $record, $columnName); |
|
|
|
if ($field) { |
|
return $field->Field(); |
|
} |
|
|
|
return null; |
|
} |
|
|
|
/** |
|
* Handle the actions and apply any changes to the GridField |
|
* |
|
* @param GridField $gridField |
|
* @param string $actionName |
|
* @param array $arguments |
|
* @param array $data Form data |
|
* @throws ValidationException |
|
*/ |
|
public function handleAction(GridField $gridField, $actionName, $arguments, $data) |
|
{ |
|
if ($actionName == 'restrictrider' || $actionName == 'unrestrictrider') { |
|
$item = $gridField->getList()->byID($arguments['RecordID']); |
|
|
|
if (!$item) { |
|
return; |
|
} |
|
|
|
// return the correct rider from the list. If it's a licence then |
|
// it's attached, or the member. |
|
if ($item instanceof Licence) { |
|
$rider = $item->Rider(); |
|
} else { |
|
$rider = $item; |
|
} |
|
|
|
if ($actionName == 'restrictrider') { |
|
$disqualification = DisqualifiedRider::create(); |
|
$disqualification->Surname = $rider->Surname; |
|
$disqualification->FirstName = $rider->FirstName; |
|
$disqualification->DateOfBirth = $rider->dbObject('DateOfBirth')->getTimestamp(); |
|
$disqualification->LicenceNumber = $rider->getLicenceNumbers(); |
|
$disqualification->write(); |
|
|
|
$disqualification->Riders()->add($rider); |
|
|
|
foreach ($rider->getRidingLicences() as $licence) { |
|
$disqualification->Licences()->add($licence); |
|
} |
|
|
|
return Controller::curr()->redirect($disqualification->AbsoluteLink()); |
|
} else { |
|
// remove any disqualifications. |
|
$dis = $rider->isDisqualified(); |
|
|
|
if ($dis) { |
|
$dis->delete(); |
|
} |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* |
|
* @param GridField $gridField |
|
* @param DataObject $record |
|
* @param string $columnName |
|
* @return GridField_FormAction|null |
|
*/ |
|
private function getFormAction($gridField, $record, $columnName) |
|
{ |
|
$rider = $this->getRider($record); |
|
|
|
if ($rider->isDisqualified()) { |
|
$title = 'Remove from Restricted Riders'; |
|
|
|
$field = GridField_FormAction::create( |
|
$gridField, |
|
'UnrestrictRider' . $record->ID, |
|
false, |
|
"unrestrictrider", |
|
['RecordID' => $record->ID] |
|
) |
|
->addExtraClass('btn btn--no-text btn--icon-md grid-field__icon-action action-menu--handled') |
|
->setAttribute('classNames', 'font-icon-unlock') |
|
->setDescription($title) |
|
->setAttribute('aria-label', $title); |
|
} else { |
|
$title = 'Add Restricted Riders'; |
|
|
|
$field = GridField_FormAction::create( |
|
$gridField, |
|
'RestrictRider' . $record->ID, |
|
false, |
|
"restrictrider", |
|
['RecordID' => $record->ID] |
|
) |
|
->addExtraClass('btn btn--no-text btn--icon-md grid-field__icon-action action-menu--handled') |
|
->setAttribute('classNames', 'font-icon-lock') |
|
->setDescription($title) |
|
->setAttribute('aria-label', $title); |
|
} |
|
|
|
return $field; |
|
} |
|
} |