Skip to content

Commit

Permalink
Merge pull request #301 from oilee80/3
Browse files Browse the repository at this point in the history
Add Multi Class to inline add button
  • Loading branch information
nyeholt authored Jun 17, 2020
2 parents 306ad52 + 4afe5dc commit d671788
Show file tree
Hide file tree
Showing 4 changed files with 128 additions and 1 deletion.
6 changes: 5 additions & 1 deletion _config/gridfieldextensions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,8 @@
name: gridfieldextensions
---
GridFieldAddNewMultiClass:
showEmptyString: true
showEmptyString: true

SilverStripe\Forms\GridField\GridFieldDetailForm_ItemRequest:
extensions:
- Symbiote\GridFieldExtensions\Extensions\GridFieldDetailFormItemRequestExtension
22 changes: 22 additions & 0 deletions css/GridFieldExtensions.css
Original file line number Diff line number Diff line change
Expand Up @@ -201,3 +201,25 @@
.ss-gridfield-configurable-paginator .pagination-page-number input {
text-align: center;
}

.grid-field-inline-new--multi-class-list {
display: none;
background-color: #008a00;
border-radius: 5px;
bottom: 3em;
list-style: none;
margin: 0;
right: 3em;
padding: 10px;
position: fixed;

}
.grid-field-inline-new--multi-class-list a {
color: #FFF;
display: block;
margin: 5px -10px;
padding: 0 10px;
}
.grid-field-inline-new--multi-class-list__visible {
display: block;
}
18 changes: 18 additions & 0 deletions javascript/GridFieldExtensions.js
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,24 @@
}
});

$(".action--new__multi-class").entwine({
onmatch: function () {
const hrefTemplate = this.data('hrefTemplate');
const classes = this.data('classes');
const liHtml = Object.keys(classes).map(className => {
const link = hrefTemplate.replace('{class}', className);
return `<li><a href="${link}">Add: <i>${classes[className]}</i></a></li>`;
});

const listElement = $(`<ul class="grid-field-inline-new--multi-class-list">${liHtml.join('')}</ul>`);
listElement.insertBefore(this);

this.on('click', function () {
listElement.toggleClass('grid-field-inline-new--multi-class-list__visible');
});
},
});

$(".ss-gridfield-add-new-multi-class select").entwine({
onadd: function() {
this.update();
Expand Down
83 changes: 83 additions & 0 deletions src/Extensions/GridFieldDetailFormItemRequestExtension.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
<?php

namespace Symbiote\GridFieldExtensions\Extensions;

use SilverStripe\Control\Controller;
use SilverStripe\Core\Convert;
use SilverStripe\Core\Extension;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\GridField\GridFieldDetailForm_ItemRequest as CoreGridFieldDetailForm_ItemRequest;
use SilverStripe\Forms\LiteralField;
use SilverStripe\View\ArrayData;
use SilverStripe\View\HTML;
use Symbiote\GridFieldExtensions\GridFieldAddNewMultiClass;
use Symbiote\GridFieldExtensions\GridFieldExtensions;

/**
* @property CoreGridFieldDetailForm_ItemRequest $owner
*/
class GridFieldDetailFormItemRequestExtension extends Extension
{
/**
* @param FieldList $actions
*/
public function updateFormActions(FieldList &$actions)
{
$grid = $this->owner->getGridField();
$gridFieldConfig = $grid->getConfig();
$addMultiClassComponent = $gridFieldConfig->getComponentByType(GridFieldAddNewMultiClass::class);
if ($addMultiClassComponent) {
$newRecordField = static::get_new_record_field_from_actions($actions);
if ($newRecordField) {
$newRecordField->getContainerFieldList()->removeByName('new-record');
$newRecordField->getContainerFieldList()->push(
LiteralField::create('new-record', $this->getHTMLFragment($addMultiClassComponent))
);
GridFieldExtensions::include_requirements();
}
}
}

/**
* {@inheritDoc}
*/
private function getHTMLFragment(GridFieldAddNewMultiClass $component)
{
$grid = $this->owner->getGridField();

$classes = $component->getClasses($grid);

if (!count($classes)) {
return false;
}

return HTML::createTag('a', [
'data-href-template' => Controller::join_links($grid->Link(), 'add-multi-class', '{class}'),
'title' => _t(__CLASS__ . '.NEW', 'Add new record'),
'aria-label' => _t(__CLASS__ . '.NEW', 'Add new record'),
'class' => implode(' ', array(
'btn',
'btn-primary',
'font-icon-plus-thin',
'btn--circular',
'action--new',
'discard-confirmation',
'action--new__multi-class',
)),
'data-classes' => Convert::array2json($classes),
]);
}

/**
* @param FieldList $actions
* @return LiteralField OR NULL
*/
private static function get_new_record_field_from_actions(FieldList &$actions)
{
$rightGroup = $actions->fieldByName('RightGroup');
if (!$rightGroup) {
return null;
}
return $rightGroup->getChildren()->fieldByName('new-record');
}
}

0 comments on commit d671788

Please sign in to comment.