View source
<?php
namespace Drupal\gridstack_ui\Controller;
use Drupal\Core\Url;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Config\Entity\DraggableListBuilder;
use Drupal\Component\Serialization\Json;
use Drupal\Component\Utility\Html;
use Drupal\Component\Utility\NestedArray;
use Drupal\gridstack\GridStackManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class GridStackListBuilder extends DraggableListBuilder {
protected $manager;
public function __construct(EntityTypeInterface $entity_type, EntityStorageInterface $storage, GridStackManagerInterface $manager) {
parent::__construct($entity_type, $storage);
$this->manager = $manager;
}
public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
return new static($entity_type, $container
->get('entity_type.manager')
->getStorage($entity_type
->id()), $container
->get('gridstack.manager'));
}
public function getFormId() {
return 'gridstack_list_form';
}
public function buildHeader() {
$header = [
'label' => $this
->t('Optionset'),
'icon' => $this
->t('Icon'),
'framework' => $this
->t('Grid framework'),
'grids' => $this
->t('Grids : Nested'),
'provider' => $this
->t('Provider'),
];
return $header + parent::buildHeader();
}
public function buildRow(EntityInterface $entity) {
$icon_uri = $entity
->getIconUri();
$manager = $this->manager;
$framework = $manager
->configLoad('framework', 'gridstack.settings');
$use_framework = $framework && $entity
->getOption('use_framework');
$row['label'] = Html::escape($entity
->label());
$row['icon'] = [];
$row['framework'] = [];
if (!empty($icon_uri)) {
$row['icon'] = [
'#theme' => 'blazy',
'#settings' => [
'uri' => $icon_uri,
'lazy' => 'blazy',
],
];
}
$row['framework']['#markup'] = $use_framework ? ucwords($framework) : 'GridStack JS';
$grids = $entity
->getEndBreakpointGrids();
$nested = $entity
->getEndBreakpointGrids('nested');
$nested = array_filter($nested);
$counts = [];
if (!empty($nested)) {
foreach ($nested as $grid) {
if (empty($grid)) {
continue;
}
if (is_string($grid)) {
$grid = Json::decode($grid);
}
$boxes = [];
foreach ($grid as $item) {
if (!isset($item['width'])) {
continue;
}
$boxes[] = $item['width'];
}
$counts = NestedArray::mergeDeep($counts, $boxes);
}
}
$nested_grids = empty($nested) ? '0' : count($counts);
$row['grids']['#markup'] = $this
->t('@grids : @nested', [
'@grids' => count($grids),
'@nested' => $nested_grids,
]);
$dependencies = $entity
->getDependencies();
$row['provider']['#markup'] = isset($dependencies['module'][0]) ? $dependencies['module'][0] : 'gridstack';
return $row + parent::buildRow($entity);
}
public function getDefaultOperations(EntityInterface $entity) {
$operations = parent::getDefaultOperations($entity);
if (isset($operations['edit'])) {
$operations['edit']['title'] = $this
->t('Configure');
}
$operations['duplicate'] = [
'title' => $this
->t('Duplicate'),
'weight' => 15,
'url' => $entity
->toUrl('duplicate-form'),
];
if ($entity
->id() == 'default') {
unset($operations['delete'], $operations['edit']);
}
if ($entity
->id() == 'frontend') {
unset($operations['delete']);
}
return $operations;
}
public function render() {
$build['description'] = [
'#markup' => $this
->t("<p>Manage the GridStack optionsets. Optionsets are Config Entities.</p><p>By default, when this module is enabled, four optionsets are created from configuration: Default Admin, Default Frontend, Default Bootstrap/ Foundation. Install GridStack example module to speed up by cloning them. Use the Operations column to edit, clone and delete optionsets. GridStack supports both magazine layout (GridStack JS), and static float layout (Bootstrap/ Foundation). The main difference is no fixed height, no JS, just CSS, for static float layout. Visit <a href=':ui'>GridStack UI</a> page to enable its support. To generate icons, edit and save optionsets. Press <code>F5</code>, or <code>CTRL/CMD + R</code> to refresh cached icons whenever updated.<br><strong>Important!</strong><br>Avoid overriding Default Admin (hidden) optionset as it is meant for Default -- checking and cleaning the frontend. Use Duplicate Default Frontend (GridStack JS), or Default Bootstrap/ Foundation, accordingly instead. Otherwise possible messes.<br>Use <a href=':url'>config_update</a> module to revert to stored optionsets at <em>/admin/config/development/configuration/report/module/gridstack</em>, if needed.</p>", [
':ui' => Url::fromRoute('gridstack.settings')
->toString(),
':url' => '//drupal.org/project/config_update',
]),
];
$build[] = parent::render();
$build['#attached']['library'][] = 'blazy/load';
$build['#attached']['library'][] = 'gridstack/admin';
return $build;
}
public function submitForm(array &$form, FormStateInterface $form_state) {
parent::submitForm($form, $form_state);
drupal_set_message($this
->t('The optionsets order has been updated.'));
}
}