Passed
Push — master ( d57bd3...3dbf58 )
by Churakov
03:47
created

Grid::render()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 22
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 2
eloc 15
nc 2
nop 0
dl 0
loc 22
rs 9.7666
c 1
b 0
f 1
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 Request $request
24
 * @property LengthAwarePaginator $paginator
25
 * @property int $rowPerPage
26
 * @property int $page
27
 */
28
class Grid
29
{
30
    use Configurable;
31
32
    const
33
        DEFAULT_ROW_PER_PAGE = 10,
34
        DEFAULT_PAGE_NUMBER = 1;
35
36
    /**
37
     * @var array
38
     */
39
    public $config;
40
41
    /**
42
     * @var EloquentDataProvider $dataProvider
43
     */
44
    public $dataProvider;
45
46
    /**
47
     * @var array $columns
48
     */
49
    public $columns;
50
51
    /**
52
     * @var array|\Illuminate\Http\Request|string
53
     */
54
    public $request;
55
56
    /**
57
     * @var LengthAwarePaginator $paginator
58
     */
59
    public $paginator;
60
61
    /**
62
     * @var int $rowPerPage
63
     */
64
    public $rowPerPage = self::DEFAULT_ROW_PER_PAGE;
65
66
    /**
67
     * @var int
68
     */
69
    public $page;
70
71
    /**
72
     * Grid constructor.
73
     * @param array $config
74
     */
75
    public function __construct(array $config)
76
    {
77
        $this->loadConfig($config);
78
        $this->request = request();
79
    }
80
81
    /**
82
     * @return string
83
     * @throws \Throwable
84
     */
85
    public function render(): string
86
    {
87
        $this->buildColumns();
88
        $this->dataProvider->prepareQuery($this->request);
89
        $this->page = $this->request->get('page', self::DEFAULT_PAGE_NUMBER);
90
91
        if (is_null($this->request->get('perPage'))) {
92
            $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...
93
        }
94
95
        $dataProviderCount = $this->dataProvider->getCount();
96
        $this->paginator = new LengthAwarePaginator(
97
            $this->dataProvider->get($this->request),
98
            $dataProviderCount,
99
            $this->rowPerPage,
100
            $this->page
101
        );
102
103
        return view('churakovmike_easygrid::grid', [
0 ignored issues
show
Bug Best Practice introduced by
The expression return view('churakovmik...->paginator))->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...
104
            'columns' => $this->columns,
105
            'paginator' => $this->paginator,
106
        ])->render();
107
    }
108
109
    /**
110
     * @throws \Exception
111
     */
112
    protected function buildColumns()
113
    {
114
        foreach ($this->columns as $key => &$column) {
115
116
            //simple column
117
            if (is_string($column)) {
118
                $column = new DefaultColumn([
119
                    'attribute' => $column,
120
                ]);
121
122
                continue;
123
            }
124
125
            if (is_array($column)) {
126
                if (isset($column['class']) && class_exists($column['class']) ) {
127
                    $column = new $column['class']($column);
128
                    if (!is_a($column, ActionColumn::class)) {
129
                        throw new \Exception('Column class must inherit from BaseColumn class');
130
                    }
131
132
                    continue;
133
                }
134
135
                if (isset($column['value']) && $column['value'] instanceof Closure) {
136
                    $column = new CallbackColumn($column);
137
                    continue;
138
                }
139
140
                $column = new DefaultColumn($column);
141
            }
142
        }
143
    }
144
}
145