View source
<?php
namespace Drupal\gridstack;
use Drupal\Component\Serialization\Json;
use Drupal\Component\Utility\NestedArray;
use Drupal\blazy\Blazy;
use Symfony\Component\DependencyInjection\ContainerInterface;
abstract class GridStackEnginePluginBase extends GridStackPluginBase implements GridStackEnginePluginInterface {
protected $colClass = 'col';
protected $colPrefix = 'col-';
protected $sizes = [];
protected $classOptions = [];
protected $rowClassOptions = [];
protected $containerClasses = [];
protected $nestedContainerClasses = [];
protected $itemClasses = [];
protected $itemContentClasses = [];
protected $regions = [];
protected $styles = [];
protected $stylizer;
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
$instance = parent::create($container, $configuration, $plugin_id, $plugin_definition);
$instance->stylizer = $container
->get('gridstack.stylizer');
$instance->sizes = $instance
->setSizes(GridStackDefault::breakpoints());
$instance->classOptions = $instance
->setClassOptions();
$instance->rowClassOptions = $instance
->setRowClassOptions();
return $instance;
}
public function classOptions() {
return $this->classOptions;
}
protected function setClassOptions() {
return [];
}
public function rowClassOptions() {
return $this->rowClassOptions;
}
protected function setRowClassOptions() {
return [];
}
public function containerClasses() {
return $this->containerClasses;
}
protected function setContainerClasses(array $classes = []) {
$this->containerClasses = array_merge($this->containerClasses, $classes);
return $this;
}
public function sizes() {
return $this->sizes;
}
protected function setSizes(array $sizes) {
return $sizes;
}
public function styles() {
return $this->styles;
}
protected function setStyles(array $data) {
$id = $this
->getPluginId() . '-' . $this
->getOptionset()
->id();
$this->styles[Blazy::getHtmlId('gridstack', $id)][$data['context']] = $data['rules'];
return $this;
}
public function getIconBreakpoint() {
$keys = array_keys($this->sizes);
return end($keys);
}
public function getSmallestBreakpoint() {
$keys = array_keys($this->sizes);
return $keys[0];
}
public function attach(array &$load, array $attach = []) {
if (!empty($attach['debug'])) {
$load['library'][] = 'gridstack/debug';
}
}
public function build(array &$build, array &$element) {
$settings =& $build['settings'];
if (!$this->optionset || !empty($settings['_variant'])) {
$this
->setOptionset($build['optionset']);
}
$this
->prepare($element, $settings);
$element['#items'] = $this->stylizer
->getStyle('contentless', $settings) ? [] : $this
->buildItems($build);
if ($styles = $this
->styles()) {
$this->stylizer
->rootStyles($element, $styles, $settings);
}
}
private function prepare(array &$element, array &$settings) {
$attributes = $content_attributes = [];
$settings = array_merge($settings, $this->stylizer
->getStyle('all', $settings));
$settings['_level'] = GridStackDefault::LEVEL_ROOT;
$settings['rid'] = $settings['_context'] = GridStackDefault::ROOT;
$selector = '.gridstack--' . str_replace('_', '-', $settings['optionset']);
if (isset($settings['gid']) && ($gid = $settings['gid'])) {
$selector .= '.is-gs-' . str_replace([
'_',
':',
], '-', $gid);
}
if (!empty($this
->containerClasses()[0])) {
$selector .= '.' . $this
->containerClasses()[0];
}
$settings['_selector'] = $selector;
$this
->setConfiguration($settings);
$this->stylizer
->prepare($element, $attributes, $settings, $this
->getOptionset());
$this
->containerAttributes($attributes, $settings);
$this
->contentAttributes($content_attributes, $settings);
$element['#attributes'] = empty($element['#attributes']) ? $attributes : NestedArray::mergeDeep($element['#attributes'], $attributes);
$element['#content_attributes'] = empty($element['#content_attributes']) ? $content_attributes : NestedArray::mergeDeep($element['#content_attributes'], $content_attributes);
$element['#settings'] = empty($element['#settings']) ? $settings : NestedArray::mergeDeep($element['#settings'], $settings);
}
public function buildItems(array $build) {
$settings = $build['settings'];
$settings = array_diff_key($settings, GridStackDefault::regionSettings());
$grids = $this->optionset
->getLastBreakpoint();
$items = [];
$regions = $this->optionset
->prepareRegions(FALSE);
unset($settings['cache_metadata'], $settings['cache_tags'], $settings['_item']);
foreach ($build['items'] as $delta => $item) {
if (!isset($grids[$delta])) {
continue;
}
$rid = GridStackDefault::regionId($delta);
$region = isset($regions[$rid]) ? $regions[$rid] : [];
$config = isset($item['settings']) ? array_merge($settings, $item['settings']) : $settings;
$config['region'] = $region;
$config['delta'] = $config['root_delta'] = $delta;
$config['rid'] = $rid;
foreach ([
'_level',
'_context',
'_root',
] as $key) {
$config[$key] = isset($region[$key]) ? $region[$key] : FALSE;
}
$items[] = $this
->buildItem($delta, $config, $item, $regions);
}
return $items;
}
protected function buildNestedItems($delta, array &$settings, array $item, array $grids, array $regions = []) {
$items = [];
$index = $delta + 1;
foreach (array_keys($grids) as $gid) {
$rid = GridStackDefault::regionId($delta . '_' . $gid);
$region = isset($regions[$rid]) ? $regions[$rid] : [];
$nested = isset($item[$gid]) ? $item[$gid] : [];
$config = isset($nested['settings']) ? array_merge($settings, $nested['settings']) : $settings;
$config['region'] = $region;
$config['rid'] = $rid;
$config['nested_delta'] = $gid;
$config['nested_id'] = $region['_context'];
$config['use_inner'] = TRUE;
foreach ([
'_level',
'_context',
'_root',
] as $key) {
$config[$key] = isset($region[$key]) ? $region[$key] : FALSE;
}
$items[] = $this
->buildItem($gid, $config, $nested, $regions);
}
$settings['_root'] = 'grids';
$settings['_level'] = GridStackDefault::LEVEL_NESTED;
$settings['_context'] = GridStackDefault::NESTED . $index;
$settings['ungrid'] = !empty($settings['_ungrid']);
return [
'#theme' => 'gridstack',
'#items' => $items,
'#optionset' => $this->optionset,
'#settings' => $settings,
'#attributes' => $this
->nestedContainerAttributes($settings),
];
}
protected function modifyItem($delta, array &$settings, array &$content, array &$attributes, array &$content_attributes, array $regions = []) {
$settings['contentless'] = $this->stylizer
->getStyle('contentless', $settings);
$this
->itemAttributes($attributes, $settings);
$this
->itemContentAttributes($content_attributes, $settings);
if ($this
->getSetting('use_nested')) {
$this
->modifyNestedItem($delta, $settings, $content, $attributes, $content_attributes, $regions);
}
if ($this
->getSetting('_stylizer')) {
$this->stylizer
->modifyItem($delta, $settings, $content, $attributes, $content_attributes, $regions);
}
}
protected function modifyNestedItem($delta, array &$settings, array &$content, array &$attributes, array &$content_attributes, array $regions = []) {
$this
->attributes($content_attributes, $settings);
if (isset($content['box'][0], $content['box'][0]['box']) && ($nesteds = $this->optionset
->getNestedGridsByDelta($delta))) {
$settings['nested'] = TRUE;
$settings['root'] = FALSE;
$settings['use_inner'] = FALSE;
$content['box'] = $this
->buildNestedItems($delta, $settings, $content['box'], $nesteds, $regions);
$attributes['class'][] = 'box--nester';
}
if (isset($settings['_root']) && $settings['_root'] == 'nested') {
$attributes['class'][] = 'box--nested';
}
}
protected function buildItem($delta, array &$settings, array $item = [], array $regions = []) {
$content_attributes = [];
$attributes = isset($item['attributes']) ? $item['attributes'] : [];
$content = [
'box' => isset($item['box']) ? $item['box'] : [],
'caption' => isset($item['caption']) ? $item['caption'] : [],
'preface' => isset($item['preface']) ? $item['preface'] : [],
];
if (empty($settings['_dummy'])) {
$this
->modifyItem($delta, $settings, $content, $attributes, $content_attributes, $regions);
}
return [
'#theme' => 'gridstack_box',
'#item' => $content,
'#delta' => $delta,
'#attributes' => $attributes,
'#content_attributes' => $content_attributes,
'#settings' => $settings,
];
}
protected function itemAttributes(array &$attributes, array &$settings) {
$this
->setConfiguration($settings);
$attributes['class'] = empty($attributes['class']) ? $this->itemClasses : array_merge($attributes['class'], $this->itemClasses);
if ($this->stylizer
->getStyle('ete', $settings)) {
$attributes['class'][] = 'box--ete';
}
}
protected function itemContentAttributes(array &$attributes, array &$settings) {
$attributes['class'] = empty($attributes['class']) ? $this->itemContentClasses : array_merge($attributes['class'], $this->itemContentClasses);
}
public function containerAttributes(array &$attributes, array &$settings) {
$attributes['class'] = empty($settings['_ungrid']) ? $this
->containerClasses() : [];
$this
->attributes($attributes, $settings);
if ($this
->getSetting('debug') || $this
->getSetting('_ipe')) {
$attributes['class'][] = 'is-gs-debug';
if ($this
->getSetting('_ipe')) {
$attributes['class'][] = 'is-gs-lb';
$attributes['data-region'] = GridStackDefault::ROOT;
if (in_array('is-gs-parallax', $attributes['class'])) {
$removed = [
'is-gs-parallax',
'is-gs-parallax-fs',
];
$attributes['class'] = array_diff($attributes['class'], $removed);
}
}
if ($this
->getSetting('_lbux')) {
$attributes['class'][] = 'is-gs-lbux';
}
}
unset($settings['attributes'], $settings['wrapper_classes'], $settings['fw_classes']);
if ($gid = $this
->getSetting('gid')) {
$attributes['class'][] = 'is-gs-' . str_replace([
'_',
':',
], '-', $gid);
}
if ($variant = $this
->getSetting('_variant')) {
$attributes['class'][] = $this->stylizer
->style()
->getVariantClass($variant);
}
Blazy::containerAttributes($attributes, $settings);
if ($this->stylizer
->getStyle('parallax-fs', $settings)) {
$attributes['class'][] = 'is-b-scroll';
$blazy = empty($attributes['data-blazy']) ? [] : Json::decode($attributes['data-blazy']);
$blazy['container'] = '.is-b-scroll';
$attributes['data-blazy'] = Json::encode($blazy);
}
}
protected function contentAttributes(array &$attributes, array &$settings) {
if (!empty($settings['_ungrid']) && $settings['_level'] == GridStackDefault::LEVEL_ROOT) {
$attributes['class'][] = 'gridstack__inner';
}
}
protected function nestedContainerAttributes(array &$settings) {
$attributes['class'] = $this->nestedContainerClasses;
$index = isset($settings['delta']) ? $settings['delta'] + 1 : 0;
$attributes['class'][] = 'gridstack--' . $index;
if (!$this
->getSetting('no_classes')) {
$attributes['class'][] = 'gridstack--nested';
}
$this
->attributes($attributes, $settings);
if ($this
->getSetting('_ipe') && $settings['_level'] == GridStackDefault::LEVEL_NESTED) {
$attributes['data-region'] = $settings['rid'];
}
return $attributes;
}
protected function attributes(array &$attributes, array $settings) {
if (!empty($settings['_stylizer'])) {
$this->stylizer
->attributes($attributes, $settings);
if ($styles = $this->stylizer
->styles($attributes, $settings)) {
$this
->setStyles($styles);
}
}
}
protected function getVersionClasses() {
return $this->stylizer
->getInternalClasses();
}
public function previewOptions() {
return [];
}
}