Skip to content

Commit f712c28

Browse files
Merge pull request #1374 from suraj-webkul/datagrid-dropdown-searchable-filter
datagrid searchable dropdown.
2 parents 7f50f9c + 307a4a4 commit f712c28

File tree

7 files changed

+315
-39
lines changed

7 files changed

+315
-39
lines changed

packages/Webkul/Admin/src/DataGrids/Activity/ActivityDataGrid.php

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
use Illuminate\Support\Facades\DB;
77
use Webkul\Admin\Traits\ProvideDropdownOptions;
88
use Webkul\DataGrid\DataGrid;
9+
use Webkul\Lead\Repositories\LeadRepository;
10+
use Webkul\User\Repositories\UserRepository;
911

1012
class ActivityDataGrid extends DataGrid
1113
{
@@ -42,7 +44,7 @@ public function prepareQueryBuilder(): Builder
4244
$this->addFilter('title', 'activities.title');
4345
$this->addFilter('schedule_from', 'activities.schedule_from');
4446
$this->addFilter('created_by', 'users.name');
45-
$this->addFilter('created_by_id', 'activities.user_id');
47+
$this->addFilter('created_by_id', 'users.name');
4648
$this->addFilter('created_at', 'activities.created_at');
4749
$this->addFilter('lead_title', 'leads.title');
4850

@@ -82,12 +84,20 @@ public function prepareColumns(): void
8284
]);
8385

8486
$this->addColumn([
85-
'index' => 'created_by_id',
86-
'label' => trans('admin::app.activities.index.datagrid.created_by'),
87-
'type' => 'string',
88-
'searchable' => false,
89-
'sortable' => true,
90-
'filterable' => true,
87+
'index' => 'created_by_id',
88+
'label' => trans('admin::app.activities.index.datagrid.created_by'),
89+
'type' => 'string',
90+
'searchable' => false,
91+
'sortable' => true,
92+
'filterable' => true,
93+
'filterable_type' => 'searchable_dropdown',
94+
'filterable_options' => [
95+
'repository' => UserRepository::class,
96+
'column' => [
97+
'label' => 'name',
98+
'value' => 'name',
99+
],
100+
],
91101
'closure' => function ($row) {
92102
$route = urldecode(route('admin.settings.users.index', ['id[eq]' => $row->created_by_id]));
93103

@@ -102,12 +112,20 @@ public function prepareColumns(): void
102112
]);
103113

104114
$this->addColumn([
105-
'index' => 'lead_title',
106-
'label' => trans('admin::app.activities.index.datagrid.lead'),
107-
'type' => 'string',
108-
'searchable' => true,
109-
'filterable' => true,
110-
'sortable' => true,
115+
'index' => 'lead_title',
116+
'label' => trans('admin::app.activities.index.datagrid.lead'),
117+
'type' => 'string',
118+
'searchable' => true,
119+
'sortable' => true,
120+
'filterable' => true,
121+
'filterable_type' => 'searchable_dropdown',
122+
'filterable_options' => [
123+
'repository' => LeadRepository::class,
124+
'column' => [
125+
'label' => 'title',
126+
'value' => 'title',
127+
],
128+
],
111129
'closure' => function ($row) {
112130
if ($row->lead_title == null) {
113131
return "<span class='text-gray-800 dark:text-gray-300'>N/A</span>";

packages/Webkul/Admin/src/DataGrids/Contact/PersonDataGrid.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,14 @@ public function prepareColumns(): void
113113
'searchable' => true,
114114
'filterable' => true,
115115
'sortable' => true,
116-
'filterable_type' => 'dropdown',
117-
'filterable_options' => $this->organizationRepository->all(['name as label', 'name as value'])->toArray(),
116+
'filterable_type' => 'searchable_dropdown',
117+
'filterable_options' => [
118+
'repository' => OrganizationRepository::class,
119+
'column' => [
120+
'label' => 'name',
121+
'value' => 'name',
122+
],
123+
],
118124
]);
119125
}
120126

packages/Webkul/Admin/src/DataGrids/Lead/LeadDataGrid.php

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,8 @@ public function prepareQueryBuilder(): Builder
8585

8686
$this->addFilter('id', 'leads.id');
8787
$this->addFilter('user', 'leads.user_id');
88-
$this->addFilter('sales_person', 'leads.user_id');
89-
$this->addFilter('lead_source_name', 'lead_sources.id');
88+
$this->addFilter('sales_person', 'users.name');
89+
$this->addFilter('lead_source_name', 'lead_sources.name');
9090
$this->addFilter('person_name', 'persons.name');
9191
$this->addFilter('type', 'lead_pipeline_stages.code');
9292
$this->addFilter('stage', 'lead_pipeline_stages.id');
@@ -118,8 +118,14 @@ public function prepareColumns(): void
118118
'searchable' => false,
119119
'sortable' => true,
120120
'filterable' => true,
121-
'filterable_type' => 'dropdown',
122-
'filterable_options' => $this->userRepository->all(['name as label', 'id as value'])->toArray(),
121+
'filterable_type' => 'searchable_dropdown',
122+
'filterable_options' => [
123+
'repository' => \Webkul\Contact\Repositories\PersonRepository::class,
124+
'column' => [
125+
'label' => 'name',
126+
'value' => 'name',
127+
],
128+
],
123129
]);
124130

125131
$this->addColumn([
@@ -137,8 +143,14 @@ public function prepareColumns(): void
137143
'searchable' => false,
138144
'sortable' => true,
139145
'filterable' => true,
140-
'filterable_type' => 'dropdown',
141-
'filterable_options' => $this->sourceRepository->all(['name as label', 'id as value'])->toArray(),
146+
'filterable_type' => 'searchable_dropdown',
147+
'filterable_options' => [
148+
'repository' => SourceRepository::class,
149+
'column' => [
150+
'label' => 'name',
151+
'value' => 'name',
152+
],
153+
],
142154
]);
143155

144156
$this->addColumn([
@@ -150,12 +162,20 @@ public function prepareColumns(): void
150162
]);
151163

152164
$this->addColumn([
153-
'index' => 'person_name',
154-
'label' => trans('admin::app.leads.index.datagrid.contact-person'),
155-
'type' => 'string',
156-
'searchable' => false,
157-
'sortable' => true,
158-
'filterable' => true,
165+
'index' => 'person_name',
166+
'label' => trans('admin::app.leads.index.datagrid.contact-person'),
167+
'type' => 'string',
168+
'searchable' => false,
169+
'sortable' => true,
170+
'filterable' => true,
171+
'filterable_type' => 'searchable_dropdown',
172+
'filterable_options' => [
173+
'repository' => \Webkul\Contact\Repositories\PersonRepository::class,
174+
'column' => [
175+
'label' => 'name',
176+
'value' => 'name',
177+
],
178+
],
159179
]);
160180

161181
$this->addColumn([

packages/Webkul/Admin/src/DataGrids/Quote/QuoteDataGrid.php

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public function prepareQueryBuilder(): Builder
3939

4040
$this->addFilter('id', 'quotes.id');
4141
$this->addFilter('user', 'quotes.user_id');
42-
$this->addFilter('sales_person', 'quotes.user_id');
42+
$this->addFilter('sales_person', 'users.name');
4343
$this->addFilter('person_name', 'persons.name');
4444
$this->addFilter('expired_at', 'quotes.expired_at');
4545
$this->addFilter('created_at', 'quotes.created_at');
@@ -67,11 +67,19 @@ public function prepareColumns(): void
6767
]);
6868

6969
$this->addColumn([
70-
'index' => 'sales_person',
71-
'label' => trans('admin::app.quotes.index.datagrid.sales-person'),
72-
'type' => 'string',
73-
'sortable' => true,
74-
'filterable' => true,
70+
'index' => 'sales_person',
71+
'label' => trans('admin::app.quotes.index.datagrid.sales-person'),
72+
'type' => 'string',
73+
'sortable' => true,
74+
'filterable' => true,
75+
'filterable_type' => 'searchable_dropdown',
76+
'filterable_options' => [
77+
'repository' => \Webkul\User\Repositories\UserRepository::class,
78+
'column' => [
79+
'label' => 'name',
80+
'value' => 'name',
81+
],
82+
],
7583
'closure' => function ($row) {
7684
$route = urldecode(route('admin.settings.users.index', ['id[eq]' => $row->user_id]));
7785

@@ -82,17 +90,25 @@ public function prepareColumns(): void
8290
$this->addColumn([
8391
'index' => 'expired_quotes',
8492
'label' => trans('admin::app.quotes.index.datagrid.expired-quotes'),
85-
'type' => 'string',
93+
'type' => 'date',
8694
'searchable' => false,
8795
'filterable' => true,
8896
]);
8997

9098
$this->addColumn([
91-
'index' => 'person_name',
92-
'label' => trans('admin::app.quotes.index.datagrid.person'),
93-
'type' => 'string',
94-
'sortable' => true,
95-
'filterable' => true,
99+
'index' => 'person_name',
100+
'label' => trans('admin::app.quotes.index.datagrid.person'),
101+
'type' => 'string',
102+
'sortable' => true,
103+
'filterable' => true,
104+
'filterable_type' => 'searchable_dropdown',
105+
'filterable_options' => [
106+
'repository' => \Webkul\Contact\Repositories\PersonRepository::class,
107+
'column' => [
108+
'label' => 'name',
109+
'value' => 'name',
110+
],
111+
],
96112
'closure' => function ($row) {
97113
$route = urldecode(route('admin.contacts.persons.index', ['id[eq]' => $row->person_id]));
98114

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
namespace Webkul\Admin\Http\Controllers;
4+
5+
use Illuminate\Support\Facades\Crypt;
6+
7+
class DataGridController extends Controller
8+
{
9+
/**
10+
* Look up.
11+
*/
12+
public function lookUp()
13+
{
14+
/**
15+
* Validation for parameters.
16+
*/
17+
$params = $this->validate(request(), [
18+
'datagrid_id' => ['required'],
19+
'column' => ['required'],
20+
'search' => ['required', 'min:2'],
21+
]);
22+
23+
/**
24+
* Preparing the datagrid instance and only columns.
25+
*/
26+
$datagrid = app(Crypt::decryptString($params['datagrid_id']));
27+
$datagrid->prepareColumns();
28+
29+
/**
30+
* Finding the first column from the collection.
31+
*/
32+
$column = collect($datagrid->getColumns())->map(fn ($column) => $column->toArray())->where('index', $params['column'])->firstOrFail();
33+
34+
/**
35+
* Fetching on the basis of column options.
36+
*/
37+
return app($column['filterable_options']['repository'])
38+
->select([$column['filterable_options']['column']['label'].' as label', $column['filterable_options']['column']['value'].' as value'])
39+
->where($column['filterable_options']['column']['label'], 'LIKE', '%'.$params['search'].'%')
40+
->get();
41+
}
42+
}

0 commit comments

Comments
 (0)