Grid::buildColumns()   B
last analyzed

Complexity

Conditions 9
Paths 7

Size

Total Lines 29
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 9
eloc 15
c 1
b 0
f 1
nc 7
nop 0
dl 0
loc 29
rs 8.0555
1
<?php
2
3
namespace ChurakovMike\EasyGrid;
4
5
use ChurakovMike\EasyGrid\Columns\ActionColumn;
6
use ChurakovMike\EasyGrid\Columns\BaseColumn;
7
use ChurakovMike\EasyGrid\Columns\CallbackColumn;
8
use ChurakovMike\EasyGrid\Columns\DefaultColumn;
9
use ChurakovMike\EasyGrid\DataProviders\BaseDataProvider;
10
use ChurakovMike\EasyGrid\DataProviders\EloquentDataProvider;
11
use ChurakovMike\EasyGrid\Traits\Configurable;
12
use Closure;
13
use Illuminate\Http\Request;
14
use Illuminate\Pagination\LengthAwarePaginator;
15
16
/**
17
 * Class Grid.
18
 * @package ChurakovMike\EasyGrid
19
 *
20
 * @property array $config
21
 * @property BaseDataProvider @dataProvider
22
 * @property array|mixed $columns
23
 * @property boolean $filters
24
 * @property Request $request
25
 * @property LengthAwarePaginator $paginator
26
 * @property int $rowPerPage
27
 * @property int $page
28
 * @property string $title
29
 */
30
class Grid
31
{
32
    use Configurable;
33
34
    const
35
        DEFAULT_ROW_PER_PAGE = 10,
36
        DEFAULT_PAGE_NUMBER = 1;
37
38
    /**
39
     * @var array
40
     */
41
    public $config;
42
43
    /**
44
     * @var EloquentDataProvider $dataProvider
45
     */
46
    public $dataProvider;
47
48
    /**
49
     * @var array $columns
50
     */
51
    public $columns;
52
53
    /**
54
     * @var boolean $filters
55
     */
56
    public $filters = true;
57
    
58
    /**
59
     * @var array|\Illuminate\Http\Request|string
60
     */
61
    public $request;
62
63
    /**
64
     * @var LengthAwarePaginator $paginator
65
     */
66
    public $paginator;
67
68
    /**
69
     * @var int $rowPerPage
70
     */
71
    public $rowPerPage = self::DEFAULT_ROW_PER_PAGE;
72
73
    /**
74
     * @var int
75
     */
76
    public $page;
77
78
    /**
79
     * @var string
80
     */
81
    public $title;
82
83
    /**
84
     * Grid constructor.
85
     * @param array $config
86
     */
87
    public function __construct(array $config)
88
    {
89
        $this->loadConfig($config);
90
        $this->request = request();
91
    }
92
93
    /**
94
     * @return string
95
     * @throws \Throwable
96
     */
97
    public function render(): string
98
    {
99
        $this->buildColumns();
100
        $this->dataProvider->prepareQuery($this->request);
101
        $this->page = $this->request->get('page', self::DEFAULT_PAGE_NUMBER);
102
103
        if (is_null($this->request->get('perPage'))) {
104
            $this->request->perPage = self::DEFAULT_ROW_PER_PAGE;
0 ignored issues
show
Bug introduced by
The property perPage does not seem to exist on Illuminate\Http\Request.
Loading history...
105
        }
106
107
        $dataProviderCount = $this->dataProvider->getCount();
108
        $this->paginator = new LengthAwarePaginator(
109
            $this->dataProvider->get($this->request),
110
            $dataProviderCount,
111
            $this->rowPerPage,
112
            $this->page
113
        );
114
115
        return view('churakovmike_easygrid::grid', [
0 ignored issues
show
Bug Best Practice introduced by
The expression return view('churakovmik...this->title))->render() could return the type array which is incompatible with the type-hinted return string. Consider adding an additional type-check to rule them out.
Loading history...
116
            'columns' => $this->columns,
117
            'filters' => $this->filters,
118
            'paginator' => $this->paginator,
119
            'title' => $this->title,
120
        ])->render();
121
    }
122
123
    /**
124
     * @throws \Exception
125
     */
126
    protected function buildColumns()
127
    {
128
        foreach ($this->columns as $key => &$column) {
129
130
            //simple column
131
            if (is_string($column)) {
132
                $column = new DefaultColumn([
133
                    'attribute' => $column,
134
                ]);
135
136
                continue;
137
            }
138
139
            if (is_array($column)) {
140
                if (isset($column['class']) && class_exists($column['class'])) {
141
                    $column = new $column['class']($column);
142
                    if (!is_a($column, ActionColumn::class)) {
143
                        throw new \Exception('Column class must inherit from BaseColumn class');
144
                    }
145
146
                    continue;
147
                }
148
149
                if (isset($column['value']) && $column['value'] instanceof Closure) {
150
                    $column = new CallbackColumn($column);
151
                    continue;
152
                }
153
154
                $column = new DefaultColumn($column);
155
            }
156
        }
157
    }
158
}
159