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
![]() |
|||
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
|
|||
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 |