ModularCommonTrait   A
last analyzed

Complexity

Total Complexity 18

Size/Duplication

Total Lines 146
Duplicated Lines 0 %

Importance

Changes 6
Bugs 0 Features 0
Metric Value
eloc 78
c 6
b 0
f 0
dl 0
loc 146
rs 10
wmc 18

8 Methods

Rating   Name   Duplication   Size   Complexity  
A makeEditableField() 0 11 1
A makeGridField() 0 17 3
A filterBlockClasses() 0 21 6
A buildGridFieldConfigTable() 0 26 2
A getModulars() 0 7 2
A handleNoClassCase() 0 12 1
A buildGridFieldConfig() 0 21 2
A createInlineEditors() 0 10 1
1
<?php
2
3
namespace Cita\Modular\Traits;
4
5
use SilverStripe\Forms\TextField;
6
use SilverStripe\Forms\LiteralField;
7
use SilverStripe\Forms\HeaderField;
8
use Symbiote\GridFieldExtensions\GridFieldAddNewMultiClass;
9
use Symbiote\GridFieldExtensions\GridFieldOrderableRows;
10
use SilverStripe\Forms\GridField\GridFieldAddNewButton;
11
use SilverStripe\Forms\GridField\GridFieldDataColumns;
12
use SilverStripe\Forms\GridField\GridFieldConfig_RelationEditor;
13
use SilverStripe\Forms\GridField\GridFieldDetailForm;
14
use SilverStripe\Forms\GridField\GridField;
15
use Symbiote\GridFieldExtensions\GridFieldEditableColumns;
16
use SilverStripe\Core\ClassInfo;
17
use Cita\Modular\Model\Block;
18
use Cita\Modular\Model\FlexBlock;
19
use SilverStripe\View\ViewableData;
20
use Cita\Modular\Form\BlockEditForm_ItemRequest;
21
22
trait ModularCommonTrait
23
{
24
    private function makeGridField(&$fields)
25
    {
26
        if (!$this->owner->exists()) {
27
            return;
28
        }
29
30
        $fields->removeByName(['ModularBlocks']);
31
32
        $classes = $this->filterBlockClasses(ClassInfo::subclassesFor(Block::class));
33
        $classes = array_values($classes);
34
35
        if (empty($classes)) {
36
            $this->handleNoClassCase($fields);
37
            return;
38
        }
39
40
        $this->buildGridFieldConfig($fields, $classes);
41
    }
42
43
    private function buildGridFieldConfig(&$fields, $classes)
44
    {
45
        $fields->addFieldToTab(
46
            'Root.Main',
47
            GridField::create(
48
                'ModularBlocks',
49
                'Modular blocks',
50
                $this->owner->ModularBlocks(),
51
                $config = GridFieldConfig_RelationEditor::create()
52
            )->setDescription('The blocks you add on this page will be listed under the page\'s main content')
53
        );
54
55
        $this->buildGridFieldConfigTable($config, $classes);
56
57
        if ($this->owner instanceof FlexBlock) {
58
            $this->createInlineEditors($config);
59
        }
60
61
        $config
62
            ->getComponentByType(GridFieldDetailForm::class)
63
            ->setItemRequestClass(BlockEditForm_ItemRequest::class)
64
        ;
65
    }
66
67
    private function createInlineEditors(&$config)
68
    {
69
        $config->addComponent($this->makeEditableField('ColOffset', 'Offset - default'));
70
        $config->addComponent($this->makeEditableField('ColSize', 'Grid size - default'));
71
        $config->addComponent($this->makeEditableField('ColOffsetLg', 'Offset - lg'));
72
        $config->addComponent($this->makeEditableField('ColSizeLg', 'Grid size - lg'));
73
        $config->addComponent($this->makeEditableField('ColOffsetMd', 'Offset - md'));
74
        $config->addComponent($this->makeEditableField('ColSizeMd', 'Grid size - md'));
75
        $config->addComponent($this->makeEditableField('ColSizeSm', 'Grid size - sm'));
76
        $config->addComponent($this->makeEditableField('ColOffsetSm', 'Offset - sm'));
77
    }
78
79
    private function buildGridFieldConfigTable(&$config, $classes)
80
    {
81
        $multi = new GridFieldAddNewMultiClass();
82
        $multi = $multi->setClasses($classes);
83
84
        $config
85
            ->removeComponentsByType(GridFieldAddNewButton::class)
86
            ->addComponent($multi)
87
            ->addComponent(new GridFieldOrderableRows('SortOrder'));
88
89
        $dataColumns = $config->getComponentByType(GridFieldDataColumns::class);
90
91
        $dataFields = $this->owner instanceof FlexBlock ?
92
            [
93
                'Type' => 'Type',
94
                'Title' => 'Title',
95
            ] : [
96
                'showID' => 'Anchor',
97
                'Type' => 'Type',
98
                'Title' => 'Title',
99
                'BlockSummary' => 'Summary',
100
            ]
101
        ;
102
103
        $dataColumns->setDisplayFields($dataFields)->setFieldCasting([
104
            'Type' => 'HTMLText->RAW',
105
        ]);
106
    }
107
108
    private function handleNoClassCase(&$fields)
109
    {
110
        $fields->addFieldsToTab(
111
            'Root.Main',
112
            [
113
                HeaderField::create(
114
                    'ModularBlocksNotice',
115
                    'Modular blocks'
116
                ),
117
                LiteralField::create(
118
                    'ModularBlocks',
119
                    '<p class="alert alert-warning">No block type available for this page type</p>'
120
                ),
121
            ]
122
        );
123
    }
124
125
    private function makeEditableField($fieldName, $fieldTitle)
126
    {
127
        $field = new GridFieldEditableColumns();
128
        $field->setDisplayFields(array(
129
            $fieldName => [
130
                'title' => $fieldTitle,
131
                'field' => TextField::class
132
            ]
133
        ));
134
135
        return $field;
136
    }
137
138
    private function filterBlockClasses($classes)
139
    {
140
        if (!empty($this->owner->config()->allowed_modulars)) {
141
            $classes = [];
142
143
            foreach ($this->owner->config()->allowed_modulars as $modular) {
144
                $classes[strtolower($modular)] = $modular;
145
            }
146
        } elseif (!empty($this->owner->config()->disallowed_modulars)) {
147
            foreach ($this->owner->config()->disallowed_modulars as $modular) {
148
                unset($classes[strtolower($modular)]);
149
            }
150
        }
151
152
        unset($classes[strtolower(Block::class)]);
153
154
        if ($this->owner instanceof FlexBlock) {
155
            unset($classes[strtolower(FlexBlock::class)]);
156
        }
157
158
        return $classes;
159
    }
160
161
    public function getModulars()
162
    {
163
        return ViewableData::create()
164
            ->customise(['ModularBlocks' => $this->owner->ModularBlocks()])
165
            ->renderWith(
166
                $this->owner instanceof FlexBlock ?
167
                'Cita\\Modular\\FlexModularList' : 'Cita\\Modular\\ModularList'
168
            )
169
        ;
170
    }
171
}
172