From 19b6bac1e7678ec503b14b1b6ee44d03d5e37d5e Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Wed, 14 Apr 2021 14:03:32 +0530 Subject: [PATCH 01/45] One File Removed And Some Method Sortings Done --- packages/Webkul/Ui/src/DataGrid/DataGrid.php | 285 ++++++++++--------- packages/Webkul/Ui/src/DataGrid/notes.md | 17 -- 2 files changed, 147 insertions(+), 155 deletions(-) delete mode 100644 packages/Webkul/Ui/src/DataGrid/notes.md diff --git a/packages/Webkul/Ui/src/DataGrid/DataGrid.php b/packages/Webkul/Ui/src/DataGrid/DataGrid.php index e6dd5fc7b..63cd1c132 100644 --- a/packages/Webkul/Ui/src/DataGrid/DataGrid.php +++ b/packages/Webkul/Ui/src/DataGrid/DataGrid.php @@ -202,44 +202,6 @@ abstract class DataGrid $this->currentUser = auth()->guard('admin')->user(); } - /** - * Parse the URL and get it ready to be used. - * - * @return void - */ - private function parseUrl() - { - $parsedUrl = []; - $unparsed = url()->full(); - - $route = request()->route() ? request()->route()->getName() : ''; - - if ($route == 'admin.datagrid.export') { - $unparsed = url()->previous(); - } - - $getParametersArr = explode('?', $unparsed); - if (count($getParametersArr) > 1) { - $to_be_parsed = $getParametersArr[1]; - $to_be_parsed = urldecode($to_be_parsed); - - parse_str($to_be_parsed, $parsedUrl); - unset($parsedUrl['page']); - } - - if (isset($parsedUrl['grand_total'])) { - foreach ($parsedUrl['grand_total'] as $key => $value) { - $parsedUrl['grand_total'][$key] = str_replace(',', '.', $parsedUrl['grand_total'][$key]); - } - } - - $this->itemsPerPage = isset($parsedUrl['perPage']) ? $parsedUrl['perPage']['eq'] : $this->itemsPerPage; - - unset($parsedUrl['perPage']); - - return $parsedUrl; - } - /** * Add the index as alias of the column and use the column to make things happen. * @@ -376,22 +338,26 @@ abstract class DataGrid foreach ($parsedUrl as $key => $value) { if ($key === 'locale') { - if (! is_array($value)) { + if (!is_array($value)) { unset($parsedUrl[$key]); } - } elseif (! is_array($value)) { + } elseif (!is_array($value)) { unset($parsedUrl[$key]); } } if (count($parsedUrl)) { - $filteredOrSortedCollection = $this->sortOrFilterCollection($this->collection = $this->queryBuilder, - $parsedUrl); + $filteredOrSortedCollection = $this->sortOrFilterCollection( + $this->collection = $this->queryBuilder, + $parsedUrl + ); if ($this->paginate) { if ($this->itemsPerPage > 0) { - return $filteredOrSortedCollection->orderBy($this->index, - $this->sortOrder)->paginate($this->itemsPerPage)->appends(request()->except('page')); + return $filteredOrSortedCollection->orderBy( + $this->index, + $this->sortOrder + )->paginate($this->itemsPerPage)->appends(request()->except('page')); } } else { return $filteredOrSortedCollection->orderBy($this->index, $this->sortOrder)->get(); @@ -400,8 +366,10 @@ abstract class DataGrid if ($this->paginate) { if ($this->itemsPerPage > 0) { - $this->collection = $this->queryBuilder->orderBy($this->index, - $this->sortOrder)->paginate($this->itemsPerPage)->appends(request()->except('page')); + $this->collection = $this->queryBuilder->orderBy( + $this->index, + $this->sortOrder + )->paginate($this->itemsPerPage)->appends(request()->except('page')); } } else { $this->collection = $this->queryBuilder->orderBy($this->index, $this->sortOrder)->get(); @@ -465,9 +433,12 @@ abstract class DataGrid foreach ($this->completeColumnDetails as $column) { if ($column['searchable'] == true) { if ($this->enableFilterMap && isset($this->filterMap[$column['index']])) { - $collection->orWhere($this->filterMap[$column['index']], 'like', - '%' . $info['all'] . '%'); - } elseif ($this->enableFilterMap && ! isset($this->filterMap[$column['index']])) { + $collection->orWhere( + $this->filterMap[$column['index']], + 'like', + '%' . $info['all'] . '%' + ); + } elseif ($this->enableFilterMap && !isset($this->filterMap[$column['index']])) { $collection->orWhere($column['index'], 'like', '%' . $info['all'] . '%'); } else { $collection->orWhere($column['index'], 'like', '%' . $info['all'] . '%'); @@ -478,7 +449,7 @@ abstract class DataGrid } } else { foreach ($this->completeColumnDetails as $column) { - if ($column['index'] === $columnName && ! $column['filterable']) { + if ($column['index'] === $columnName && !$column['filterable']) { return $collection; } } @@ -491,7 +462,7 @@ abstract class DataGrid $this->operators[$condition], '%' . $filter_value . '%' ); - } elseif ($this->enableFilterMap && ! isset($this->filterMap[$columnName])) { + } elseif ($this->enableFilterMap && !isset($this->filterMap[$columnName])) { $collection->where( $columnName, $this->operators[$condition], @@ -519,7 +490,7 @@ abstract class DataGrid $this->operators[$condition], $filter_value ); - } elseif ($this->enableFilterMap && ! isset($this->filterMap[$columnName])) { + } elseif ($this->enableFilterMap && !isset($this->filterMap[$columnName])) { $collection->whereDate( $columnName, $this->operators[$condition], @@ -536,138 +507,138 @@ abstract class DataGrid if ($this->enableFilterMap && isset($this->filterMap[$columnName])) { if ($this->operators[$condition] == '=') { if ($filter_value == 1) { - $collection->Where(function($query) use($columnName, $condition, $filter_value) { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { $query->where( - $this->filterMap[$columnName], - $this->operators[$condition], - $filter_value + $this->filterMap[$columnName], + $this->operators[$condition], + $filter_value )->orWhereNotNull($this->filterMap[$columnName]); }); } else { - $collection->Where(function($query) use($columnName, $condition, $filter_value) { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { $query->where( - $this->filterMap[$columnName], - $this->operators[$condition], - $filter_value + $this->filterMap[$columnName], + $this->operators[$condition], + $filter_value )->orWhereNull($this->filterMap[$columnName]); }); } } elseif ($this->operators[$condition] == '<>') { if ($filter_value == 1) { - $collection->Where(function($query) use($columnName, $condition, $filter_value) { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { $query->where( - $this->filterMap[$columnName], - $this->operators[$condition], - $filter_value + $this->filterMap[$columnName], + $this->operators[$condition], + $filter_value )->orWhereNull($this->filterMap[$columnName]); }); } else { - $collection->Where(function($query) use($columnName, $condition, $filter_value) { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { $query->where( - $this->filterMap[$columnName], - $this->operators[$condition], - $filter_value + $this->filterMap[$columnName], + $this->operators[$condition], + $filter_value )->orWhereNotNull($this->filterMap[$columnName]); }); } } else { - $collection->Where(function($query) use($columnName, $condition, $filter_value) { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { $query->where( - $this->filterMap[$columnName], - $this->operators[$condition], - $filter_value + $this->filterMap[$columnName], + $this->operators[$condition], + $filter_value ); }); } - } elseif ($this->enableFilterMap && ! isset($this->filterMap[$columnName])) { + } elseif ($this->enableFilterMap && !isset($this->filterMap[$columnName])) { if ($this->operators[$condition] == '=') { if ($filter_value == 1) { - $collection->Where(function($query) use($columnName, $condition, $filter_value) { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { $query->where( - $columnName, - $this->operators[$condition], - $filter_value + $columnName, + $this->operators[$condition], + $filter_value )->orWhereNotNull($this->filterMap[$columnName]); }); } else { - $collection->Where(function($query) use($columnName, $condition, $filter_value) { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { $query->where( - $columnName, - $this->operators[$condition], - $filter_value + $columnName, + $this->operators[$condition], + $filter_value )->orWhereNull($this->filterMap[$columnName]); }); } } elseif ($this->operators[$condition] == '<>') { if ($filter_value == 1) { - $collection->Where(function($query) use($columnName, $condition, $filter_value) { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { $query->where( - $columnName, - $this->operators[$condition], - $filter_value + $columnName, + $this->operators[$condition], + $filter_value )->orWhereNull($this->filterMap[$columnName]); }); } else { - $collection->Where(function($query) use($columnName, $condition, $filter_value) { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { $query->where( - $columnName, - $this->operators[$condition], - $filter_value + $columnName, + $this->operators[$condition], + $filter_value )->orWhereNotNull($this->filterMap[$columnName]); }); } } else { - $collection->Where(function($query) use($columnName, $condition, $filter_value) { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { $query->where( - $columnName, - $this->operators[$condition], - $filter_value + $columnName, + $this->operators[$condition], + $filter_value ); }); } } else { if ($this->operators[$condition] == '=') { if ($filter_value == 1) { - $collection->Where(function($query) use($columnName, $condition, $filter_value) { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { $query->where( - $columnName, - $this->operators[$condition], - $filter_value + $columnName, + $this->operators[$condition], + $filter_value )->orWhereNotNull($this->filterMap[$columnName]); }); } else { - $collection->Where(function($query) use($columnName, $condition, $filter_value) { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { $query->where( - $columnName, - $this->operators[$condition], - $filter_value + $columnName, + $this->operators[$condition], + $filter_value )->orWhereNull($this->filterMap[$columnName]); }); } } elseif ($this->operators[$condition] == '<>') { if ($filter_value == 1) { - $collection->Where(function($query) use($columnName, $condition, $filter_value) { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { $query->where( - $columnName, - $this->operators[$condition], - $filter_value + $columnName, + $this->operators[$condition], + $filter_value )->orWhereNull($this->filterMap[$columnName]); }); } else { - $collection->Where(function($query) use($columnName, $condition, $filter_value) { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { $query->where( - $columnName, - $this->operators[$condition], - $filter_value + $columnName, + $this->operators[$condition], + $filter_value )->orWhereNotNull($this->filterMap[$columnName]); }); } } else { - $collection->Where(function($query) use($columnName, $condition, $filter_value) { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { $query->where( - $columnName, - $this->operators[$condition], - $filter_value + $columnName, + $this->operators[$condition], + $filter_value ); }); } @@ -679,7 +650,7 @@ abstract class DataGrid $this->operators[$condition], $filter_value ); - } elseif ($this->enableFilterMap && ! isset($this->filterMap[$columnName])) { + } elseif ($this->enableFilterMap && !isset($this->filterMap[$columnName])) { $collection->where( $columnName, $this->operators[$condition], @@ -701,28 +672,6 @@ abstract class DataGrid return $collection; } - /** - * Trigger event. - * - * @param string $name - * - * @return void - */ - protected function fireEvent($name) - { - if (isset($name)) { - $className = get_class($this->invoker); - - $className = last(explode('\\', $className)); - - $className = strtolower($className); - - $eventName = $className . '.' . $name; - - Event::dispatch($eventName, $this->invoker); - } - } - /** * Preprare mass actions. * @@ -802,6 +751,66 @@ abstract class DataGrid return $this->getCollection(); } + /** + * Trigger event. + * + * @param string $name + * + * @return void + */ + protected function fireEvent($name) + { + if (isset($name)) { + $className = get_class($this->invoker); + + $className = last(explode('\\', $className)); + + $className = strtolower($className); + + $eventName = $className . '.' . $name; + + Event::dispatch($eventName, $this->invoker); + } + } + + /** + * Parse the URL and get it ready to be used. + * + * @return array + */ + private function parseUrl() + { + $parsedUrl = []; + $unparsed = url()->full(); + + $route = request()->route() ? request()->route()->getName() : ''; + + if ($route == 'admin.datagrid.export') { + $unparsed = url()->previous(); + } + + $getParametersArr = explode('?', $unparsed); + if (count($getParametersArr) > 1) { + $to_be_parsed = $getParametersArr[1]; + $to_be_parsed = urldecode($to_be_parsed); + + parse_str($to_be_parsed, $parsedUrl); + unset($parsedUrl['page']); + } + + if (isset($parsedUrl['grand_total'])) { + foreach ($parsedUrl['grand_total'] as $key => $value) { + $parsedUrl['grand_total'][$key] = str_replace(',', '.', $parsedUrl['grand_total'][$key]); + } + } + + $this->itemsPerPage = isset($parsedUrl['perPage']) ? $parsedUrl['perPage']['eq'] : $this->itemsPerPage; + + unset($parsedUrl['perPage']); + + return $parsedUrl; + } + /** * Fetch current route acl. As no access to acl key, this will fetch acl by route name. * @@ -826,7 +835,7 @@ abstract class DataGrid private function getRouteNameFromUrl($action, $method) { return app('router')->getRoutes() - ->match(app('request')->create(str_replace(url('/'), '', $action), $method)) - ->getName(); + ->match(app('request')->create(str_replace(url('/'), '', $action), $method)) + ->getName(); } } diff --git a/packages/Webkul/Ui/src/DataGrid/notes.md b/packages/Webkul/Ui/src/DataGrid/notes.md deleted file mode 100644 index 86d7829a0..000000000 --- a/packages/Webkul/Ui/src/DataGrid/notes.md +++ /dev/null @@ -1,17 +0,0 @@ -Event::listen('attributedatagrid.before.add.column.id', function($dataGridInstance) { - $data = [ - 'index' => 'is_required', - 'label' => 'trans', - 'type' => 'boolean', - 'sortable' => true, - 'searchable' => false, - 'wrapper' => function ($value) { - if ($value->is_required == 1) - return 'True'; - else - return 'False'; - } - ]; - - $dataGridInstance->addColumn($data); -}); \ No newline at end of file From 0475a66e2df46ed8661390eae6ac45f2d32a0038 Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Wed, 14 Apr 2021 15:01:13 +0530 Subject: [PATCH 02/45] One Method Refactored --- packages/Webkul/Ui/src/DataGrid/DataGrid.php | 31 ++++++++++---------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/packages/Webkul/Ui/src/DataGrid/DataGrid.php b/packages/Webkul/Ui/src/DataGrid/DataGrid.php index 63cd1c132..4f94d7d01 100644 --- a/packages/Webkul/Ui/src/DataGrid/DataGrid.php +++ b/packages/Webkul/Ui/src/DataGrid/DataGrid.php @@ -274,18 +274,12 @@ abstract class DataGrid { $currentRouteACL = $this->fetchCurrentRouteACL($action); - if (isset($action['title'])) { - $eventName = strtolower($action['title']); - $eventName = explode(' ', $eventName); - $eventName = implode('.', $eventName); - } else { - $eventName = null; - } + $eventName = isset($action['title']) ? $this->generateEventName($action['title']) : null; if (bouncer()->hasPermission($currentRouteACL['key'] ?? null) || $specialPermission) { $this->fireEvent('action.before.' . $eventName); - array_push($this->actions, $action); + $this->actions[] = $action; $this->enableAction = true; $this->fireEvent('action.after.' . $eventName); @@ -309,13 +303,7 @@ abstract class DataGrid $currentRouteACL = $this->fetchCurrentRouteACL($massAction); - if (isset($massAction['label'])) { - $eventName = strtolower($massAction['label']); - $eventName = explode(' ', $eventName); - $eventName = implode('.', $eventName); - } else { - $eventName = null; - } + $eventName = isset($massAction['label']) ? $this->generateEventName($massAction['label']) : null; if (bouncer()->hasPermission($currentRouteACL['key'] ?? null) || $specialPermission) { $this->fireEvent('mass.action.before.' . $eventName); @@ -773,6 +761,19 @@ abstract class DataGrid } } + /** + * Generate event name. + * + * @param string $titleOrLabel + * + * @return string + */ + private function generateEventName($titleOrLabel) + { + $eventName = explode(' ', strtolower($titleOrLabel)); + return implode('.', $eventName); + } + /** * Parse the URL and get it ready to be used. * From eddb40a9573d35deb291255a2a5e72a33902d1d4 Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Wed, 14 Apr 2021 17:02:39 +0530 Subject: [PATCH 03/45] Query String Method Refactored --- packages/Webkul/Ui/src/DataGrid/DataGrid.php | 86 ++++++++++++++------ 1 file changed, 60 insertions(+), 26 deletions(-) diff --git a/packages/Webkul/Ui/src/DataGrid/DataGrid.php b/packages/Webkul/Ui/src/DataGrid/DataGrid.php index 4f94d7d01..504a257c0 100644 --- a/packages/Webkul/Ui/src/DataGrid/DataGrid.php +++ b/packages/Webkul/Ui/src/DataGrid/DataGrid.php @@ -54,9 +54,9 @@ abstract class DataGrid * Hold query builder instance of the query prepared by executing datagrid * class method `setQueryBuilder`. * - * @var array + * @var object */ - protected $queryBuilder = []; + protected $queryBuilder; /** * Final result of the datagrid program that is collection object. @@ -322,7 +322,7 @@ abstract class DataGrid */ public function getCollection() { - $parsedUrl = $this->parseUrl(); + $parsedUrl = $this->getQueryStrings(); foreach ($parsedUrl as $key => $value) { if ($key === 'locale') { @@ -775,41 +775,75 @@ abstract class DataGrid } /** - * Parse the URL and get it ready to be used. + * Parse the query strings and get it ready to be used. * * @return array */ - private function parseUrl() + private function getQueryStrings() { - $parsedUrl = []; - $unparsed = url()->full(); - $route = request()->route() ? request()->route()->getName() : ''; - if ($route == 'admin.datagrid.export') { - $unparsed = url()->previous(); + $queryString = $this->grabQueryStrings($route == 'admin.datagrid.export' ? url()->previous() : url()->full()); + + $parsedQueryStrings = $this->parseQueryStrings($queryString); + + $parsedQueryStrings = $this->updateQueryStrings($parsedQueryStrings); + + $this->itemsPerPage = isset($parsedQueryStrings['perPage']) ? $parsedQueryStrings['perPage']['eq'] : $this->itemsPerPage; + + unset($parsedQueryStrings['perPage']); + + return $parsedQueryStrings; + } + + /** + * Grab query strings from url. + * + * @param string $fullUrl + * + * @return string + */ + private function grabQueryStrings($fullUrl) + { + return explode('?', $fullUrl)[1] ?? null; + } + + /** + * Parse query strings. + * + * @param string $queryString + * + * @return array + */ + private function parseQueryStrings($queryString) + { + $parsedQueryStrings = []; + + if ($queryString) { + parse_str(urldecode($queryString), $parsedQueryStrings); + + unset($parsedQueryStrings['page']); } - $getParametersArr = explode('?', $unparsed); - if (count($getParametersArr) > 1) { - $to_be_parsed = $getParametersArr[1]; - $to_be_parsed = urldecode($to_be_parsed); + return $parsedQueryStrings; + } - parse_str($to_be_parsed, $parsedUrl); - unset($parsedUrl['page']); - } - - if (isset($parsedUrl['grand_total'])) { - foreach ($parsedUrl['grand_total'] as $key => $value) { - $parsedUrl['grand_total'][$key] = str_replace(',', '.', $parsedUrl['grand_total'][$key]); + /** + * Update query strings. + * + * @param array $parsedQueryStrings + * + * @return array + */ + private function updateQueryStrings($parsedQueryStrings) + { + if (isset($parsedQueryStrings['grand_total'])) { + foreach ($parsedQueryStrings['grand_total'] as $key => $value) { + $parsedQueryStrings['grand_total'][$key] = str_replace(',', '.', $parsedQueryStrings['grand_total'][$key]); } } - $this->itemsPerPage = isset($parsedUrl['perPage']) ? $parsedUrl['perPage']['eq'] : $this->itemsPerPage; - - unset($parsedUrl['perPage']); - - return $parsedUrl; + return $parsedQueryStrings; } /** From f54b4f65a5e0ccb21f1dd95d62ba2ff734fa5aac Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Wed, 14 Apr 2021 17:54:41 +0530 Subject: [PATCH 04/45] Get Collections Method Refactored --- packages/Webkul/Ui/src/DataGrid/DataGrid.php | 99 ++++++++++++-------- 1 file changed, 61 insertions(+), 38 deletions(-) diff --git a/packages/Webkul/Ui/src/DataGrid/DataGrid.php b/packages/Webkul/Ui/src/DataGrid/DataGrid.php index 504a257c0..b2a63ebd6 100644 --- a/packages/Webkul/Ui/src/DataGrid/DataGrid.php +++ b/packages/Webkul/Ui/src/DataGrid/DataGrid.php @@ -322,48 +322,18 @@ abstract class DataGrid */ public function getCollection() { - $parsedUrl = $this->getQueryStrings(); + $queryStrings = $this->getQueryStrings(); - foreach ($parsedUrl as $key => $value) { - if ($key === 'locale') { - if (!is_array($value)) { - unset($parsedUrl[$key]); - } - } elseif (!is_array($value)) { - unset($parsedUrl[$key]); - } - } - - if (count($parsedUrl)) { + if (count($queryStrings)) { $filteredOrSortedCollection = $this->sortOrFilterCollection( $this->collection = $this->queryBuilder, - $parsedUrl + $queryStrings ); - if ($this->paginate) { - if ($this->itemsPerPage > 0) { - return $filteredOrSortedCollection->orderBy( - $this->index, - $this->sortOrder - )->paginate($this->itemsPerPage)->appends(request()->except('page')); - } - } else { - return $filteredOrSortedCollection->orderBy($this->index, $this->sortOrder)->get(); - } + return $this->generateResults($filteredOrSortedCollection); } - if ($this->paginate) { - if ($this->itemsPerPage > 0) { - $this->collection = $this->queryBuilder->orderBy( - $this->index, - $this->sortOrder - )->paginate($this->itemsPerPage)->appends(request()->except('page')); - } - } else { - $this->collection = $this->queryBuilder->orderBy($this->index, $this->sortOrder)->get(); - } - - return $this->collection; + return $this->collection = $this->generateResults($this->queryBuilder); } /** @@ -787,13 +757,11 @@ abstract class DataGrid $parsedQueryStrings = $this->parseQueryStrings($queryString); - $parsedQueryStrings = $this->updateQueryStrings($parsedQueryStrings); - $this->itemsPerPage = isset($parsedQueryStrings['perPage']) ? $parsedQueryStrings['perPage']['eq'] : $this->itemsPerPage; unset($parsedQueryStrings['perPage']); - return $parsedQueryStrings; + return $this->updateQueryStrings($parsedQueryStrings); } /** @@ -843,9 +811,64 @@ abstract class DataGrid } } + foreach ($parsedQueryStrings as $key => $value) { + if (in_array($key, ['locale'])) { + if (! is_array($value)) { + unset($parsedQueryStrings[$key]); + } + } else if (! is_array($value)) { + unset($parsedQueryStrings[$key]); + } + } + return $parsedQueryStrings; } + /** + * Generate full results. + * + * @param object $queryBuilderOrCollection + * + * @return \Illuminate\Support\Collection + */ + private function generateResults($queryBuilderOrCollection) + { + if ($this->paginate) { + if ($this->itemsPerPage > 0) { + return $this->paginatedResults($queryBuilderOrCollection); + } + } else { + return $this->defaultResults($queryBuilderOrCollection); + } + } + + /** + * Generate paginated results. + * + * @param object $queryBuilderOrCollection + * + * @return \Illuminate\Support\Collection + */ + private function paginatedResults($queryBuilderOrCollection) + { + return $queryBuilderOrCollection->orderBy( + $this->index, + $this->sortOrder + )->paginate($this->itemsPerPage)->appends(request()->except('page')); + } + + /** + * Generate default results. + * + * @param object $queryBuilderOrCollection + * + * @return \Illuminate\Support\Collection + */ + private function defaultResults($queryBuilderOrCollection) + { + return $queryBuilderOrCollection->orderBy($this->index, $this->sortOrder)->get(); + } + /** * Fetch current route acl. As no access to acl key, this will fetch acl by route name. * From 04430502880c24a195a1a9bb180ae6d80bccdffa Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Wed, 14 Apr 2021 19:56:29 +0530 Subject: [PATCH 05/45] Sort And Filter Collection Refactored --- packages/Webkul/Ui/src/DataGrid/DataGrid.php | 614 ++++++++++-------- packages/Webkul/Ui/src/Http/routes.php | 5 - .../Ui/src/Providers/UiServiceProvider.php | 4 +- 3 files changed, 331 insertions(+), 292 deletions(-) diff --git a/packages/Webkul/Ui/src/DataGrid/DataGrid.php b/packages/Webkul/Ui/src/DataGrid/DataGrid.php index b2a63ebd6..ab8005acc 100644 --- a/packages/Webkul/Ui/src/DataGrid/DataGrid.php +++ b/packages/Webkul/Ui/src/DataGrid/DataGrid.php @@ -205,8 +205,8 @@ abstract class DataGrid /** * Add the index as alias of the column and use the column to make things happen. * - * @param string $alias - * @param string $column + * @param string $alias + * @param string $column * * @return void */ @@ -220,7 +220,7 @@ abstract class DataGrid /** * Add column. * - * @param string $column + * @param string $column * * @return void */ @@ -238,7 +238,7 @@ abstract class DataGrid /** * Set complete column details. * - * @param string $column + * @param string $column * * @return void */ @@ -250,7 +250,7 @@ abstract class DataGrid /** * Set query builder. * - * @param \Illuminate\Database\Query\Builder $queryBuilder + * @param \Illuminate\Database\Query\Builder $queryBuilder * * @return void */ @@ -264,10 +264,8 @@ abstract class DataGrid * parameters is their. If needs to give an access just pass true * in second param. * - * @param array $action - * - * @param bool $specialPermission - * + * @param array $action + * @param bool $specialPermission * @return void */ public function addAction($action, $specialPermission = false) @@ -291,10 +289,8 @@ abstract class DataGrid * parameters is their. If needs to give an access just pass true * in second param. * - * @param array $massAction - * - * @param bool $specialPermission - * + * @param array $massAction + * @param bool $specialPermission * @return void */ public function addMassAction($massAction, $specialPermission = false) @@ -339,8 +335,7 @@ abstract class DataGrid /** * To find the alias of the column and by taking the column name. * - * @param array $columnAlias - * + * @param array $columnAlias * @return array */ public function findColumnType($columnAlias) @@ -355,9 +350,8 @@ abstract class DataGrid /** * Sort or filter collection. * - * @param \Illuminate\Support\Collection $collection - * @param array $parseInfo - * + * @param \Illuminate\Support\Collection $collection + * @param array $parseInfo * @return \Illuminate\Support\Collection */ public function sortOrFilterCollection($collection, $parseInfo) @@ -366,264 +360,22 @@ abstract class DataGrid $columnType = $this->findColumnType($key)[0] ?? null; $columnName = $this->findColumnType($key)[1] ?? null; - if ($key === 'sort') { - $count_keys = count(array_keys($info)); + switch ($key) { + case 'sort': + $this->sortCollection($collection, $info); + break; - if ($count_keys > 1) { - throw new \Exception('Fatal Error! Multiple Sort keys Found, Please Resolve the URL Manually'); - } + case 'search': + $this->searchCollection($collection, $info); + break; - $columnName = $this->findColumnType(array_keys($info)[0]); - - $collection->orderBy( - $columnName[1], - array_values($info)[0] - ); - } elseif ($key === 'search') { - $count_keys = count(array_keys($info)); - - if ($count_keys > 1) { - throw new \Exception('Multiple Search keys Found, Please Resolve the URL Manually'); - } - - if ($count_keys == 1) { - $collection->where(function ($collection) use ($info) { - foreach ($this->completeColumnDetails as $column) { - if ($column['searchable'] == true) { - if ($this->enableFilterMap && isset($this->filterMap[$column['index']])) { - $collection->orWhere( - $this->filterMap[$column['index']], - 'like', - '%' . $info['all'] . '%' - ); - } elseif ($this->enableFilterMap && !isset($this->filterMap[$column['index']])) { - $collection->orWhere($column['index'], 'like', '%' . $info['all'] . '%'); - } else { - $collection->orWhere($column['index'], 'like', '%' . $info['all'] . '%'); - } - } - } - }); - } - } else { - foreach ($this->completeColumnDetails as $column) { - if ($column['index'] === $columnName && !$column['filterable']) { + default: + if ($this->exceptionCheckInColumns($collection, $columnName)) { return $collection; } - } - if (array_keys($info)[0] === 'like' || array_keys($info)[0] === 'nlike') { - foreach ($info as $condition => $filter_value) { - if ($this->enableFilterMap && isset($this->filterMap[$columnName])) { - $collection->where( - $this->filterMap[$columnName], - $this->operators[$condition], - '%' . $filter_value . '%' - ); - } elseif ($this->enableFilterMap && !isset($this->filterMap[$columnName])) { - $collection->where( - $columnName, - $this->operators[$condition], - '%' . $filter_value . '%' - ); - } else { - $collection->where( - $columnName, - $this->operators[$condition], - '%' . $filter_value . '%' - ); - } - } - } else { - foreach ($info as $condition => $filter_value) { - - if ($condition === 'undefined') { - $condition = '='; - } - - if ($columnType === 'datetime') { - if ($this->enableFilterMap && isset($this->filterMap[$columnName])) { - $collection->whereDate( - $this->filterMap[$columnName], - $this->operators[$condition], - $filter_value - ); - } elseif ($this->enableFilterMap && !isset($this->filterMap[$columnName])) { - $collection->whereDate( - $columnName, - $this->operators[$condition], - $filter_value - ); - } else { - $collection->whereDate( - $columnName, - $this->operators[$condition], - $filter_value - ); - } - } elseif ($columnType === 'boolean') { - if ($this->enableFilterMap && isset($this->filterMap[$columnName])) { - if ($this->operators[$condition] == '=') { - if ($filter_value == 1) { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $this->filterMap[$columnName], - $this->operators[$condition], - $filter_value - )->orWhereNotNull($this->filterMap[$columnName]); - }); - } else { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $this->filterMap[$columnName], - $this->operators[$condition], - $filter_value - )->orWhereNull($this->filterMap[$columnName]); - }); - } - } elseif ($this->operators[$condition] == '<>') { - if ($filter_value == 1) { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $this->filterMap[$columnName], - $this->operators[$condition], - $filter_value - )->orWhereNull($this->filterMap[$columnName]); - }); - } else { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $this->filterMap[$columnName], - $this->operators[$condition], - $filter_value - )->orWhereNotNull($this->filterMap[$columnName]); - }); - } - } else { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $this->filterMap[$columnName], - $this->operators[$condition], - $filter_value - ); - }); - } - } elseif ($this->enableFilterMap && !isset($this->filterMap[$columnName])) { - if ($this->operators[$condition] == '=') { - if ($filter_value == 1) { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $columnName, - $this->operators[$condition], - $filter_value - )->orWhereNotNull($this->filterMap[$columnName]); - }); - } else { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $columnName, - $this->operators[$condition], - $filter_value - )->orWhereNull($this->filterMap[$columnName]); - }); - } - } elseif ($this->operators[$condition] == '<>') { - if ($filter_value == 1) { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $columnName, - $this->operators[$condition], - $filter_value - )->orWhereNull($this->filterMap[$columnName]); - }); - } else { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $columnName, - $this->operators[$condition], - $filter_value - )->orWhereNotNull($this->filterMap[$columnName]); - }); - } - } else { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $columnName, - $this->operators[$condition], - $filter_value - ); - }); - } - } else { - if ($this->operators[$condition] == '=') { - if ($filter_value == 1) { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $columnName, - $this->operators[$condition], - $filter_value - )->orWhereNotNull($this->filterMap[$columnName]); - }); - } else { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $columnName, - $this->operators[$condition], - $filter_value - )->orWhereNull($this->filterMap[$columnName]); - }); - } - } elseif ($this->operators[$condition] == '<>') { - if ($filter_value == 1) { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $columnName, - $this->operators[$condition], - $filter_value - )->orWhereNull($this->filterMap[$columnName]); - }); - } else { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $columnName, - $this->operators[$condition], - $filter_value - )->orWhereNotNull($this->filterMap[$columnName]); - }); - } - } else { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $columnName, - $this->operators[$condition], - $filter_value - ); - }); - } - } - } else { - if ($this->enableFilterMap && isset($this->filterMap[$columnName])) { - $collection->where( - $this->filterMap[$columnName], - $this->operators[$condition], - $filter_value - ); - } elseif ($this->enableFilterMap && !isset($this->filterMap[$columnName])) { - $collection->where( - $columnName, - $this->operators[$condition], - $filter_value - ); - } else { - $collection->where( - $columnName, - $this->operators[$condition], - $filter_value - ); - } - } - } - } + $this->filterCollection($collection, $info, $columnType, $columnName); + break; } } @@ -712,8 +464,7 @@ abstract class DataGrid /** * Trigger event. * - * @param string $name - * + * @param string $name * @return void */ protected function fireEvent($name) @@ -735,7 +486,6 @@ abstract class DataGrid * Generate event name. * * @param string $titleOrLabel - * * @return string */ private function generateEventName($titleOrLabel) @@ -768,7 +518,6 @@ abstract class DataGrid * Grab query strings from url. * * @param string $fullUrl - * * @return string */ private function grabQueryStrings($fullUrl) @@ -780,7 +529,6 @@ abstract class DataGrid * Parse query strings. * * @param string $queryString - * * @return array */ private function parseQueryStrings($queryString) @@ -800,7 +548,6 @@ abstract class DataGrid * Update query strings. * * @param array $parsedQueryStrings - * * @return array */ private function updateQueryStrings($parsedQueryStrings) @@ -827,8 +574,7 @@ abstract class DataGrid /** * Generate full results. * - * @param object $queryBuilderOrCollection - * + * @param object $queryBuilderOrCollection * @return \Illuminate\Support\Collection */ private function generateResults($queryBuilderOrCollection) @@ -845,8 +591,7 @@ abstract class DataGrid /** * Generate paginated results. * - * @param object $queryBuilderOrCollection - * + * @param object $queryBuilderOrCollection * @return \Illuminate\Support\Collection */ private function paginatedResults($queryBuilderOrCollection) @@ -860,8 +605,7 @@ abstract class DataGrid /** * Generate default results. * - * @param object $queryBuilderOrCollection - * + * @param object $queryBuilderOrCollection * @return \Illuminate\Support\Collection */ private function defaultResults($queryBuilderOrCollection) @@ -869,11 +613,312 @@ abstract class DataGrid return $queryBuilderOrCollection->orderBy($this->index, $this->sortOrder)->get(); } + /** + * Sort collection. + * + * @param \Illuminate\Support\Collection $collection + * @param array $info + * @return void + */ + private function sortCollection($collection, $info) + { + $countKeys = count(array_keys($info)); + + if ($countKeys > 1) { + throw new \Exception('Fatal Error! Multiple sort keys found, please resolve the URL manually.'); + } + + $columnName = $this->findColumnType(array_keys($info)[0]); + + $collection->orderBy( + $columnName[1], + array_values($info)[0] + ); + } + + /** + * Search collection. + * + * @param \Illuminate\Support\Collection $collection + * @param array $info + * @return void + */ + private function searchCollection($collection, $info) + { + $countKeys = count(array_keys($info)); + + if ($countKeys > 1) { + throw new \Exception('Multiple search keys found, please resolve the URL manually.'); + } + + if ($countKeys == 1) { + $collection->where(function ($collection) use ($info) { + foreach ($this->completeColumnDetails as $column) { + if ($column['searchable'] == true) { + if ($this->enableFilterMap && isset($this->filterMap[$column['index']])) { + $collection->orWhere( + $this->filterMap[$column['index']], + 'like', + '%' . $info['all'] . '%' + ); + } else if ($this->enableFilterMap && ! isset($this->filterMap[$column['index']])) { + $collection->orWhere($column['index'], 'like', '%' . $info['all'] . '%'); + } else { + $collection->orWhere($column['index'], 'like', '%' . $info['all'] . '%'); + } + } + } + }); + } + } + + /** + * Some exceptions check in column details. + * + * @param \Illuminate\Support\Collection $collection + * @param string $columnName + * @return bool + */ + private function exceptionCheckInColumns($collection, $columnName) + { + foreach ($this->completeColumnDetails as $column) { + if ($column['index'] === $columnName && ! $column['filterable']) { + return true; + } + } + + return false; + } + + /** + * Filter collection. + * + * @param \Illuminate\Support\Collection $collection + * @param array $info + * @param string $columnType + * @param string $columnName + * @return void + */ + private function filterCollection($collection, $info, $columnType, $columnName) + { + if (array_keys($info)[0] === 'like' || array_keys($info)[0] === 'nlike') { + foreach ($info as $condition => $filter_value) { + if ($this->enableFilterMap && isset($this->filterMap[$columnName])) { + $collection->where( + $this->filterMap[$columnName], + $this->operators[$condition], + '%' . $filter_value . '%' + ); + } else if ($this->enableFilterMap && ! isset($this->filterMap[$columnName])) { + $collection->where( + $columnName, + $this->operators[$condition], + '%' . $filter_value . '%' + ); + } else { + $collection->where( + $columnName, + $this->operators[$condition], + '%' . $filter_value . '%' + ); + } + } + } else { + foreach ($info as $condition => $filter_value) { + + if ($condition === 'undefined') { + $condition = '='; + } + + if ($columnType === 'datetime') { + if ($this->enableFilterMap && isset($this->filterMap[$columnName])) { + $collection->whereDate( + $this->filterMap[$columnName], + $this->operators[$condition], + $filter_value + ); + } else if ($this->enableFilterMap && ! isset($this->filterMap[$columnName])) { + $collection->whereDate( + $columnName, + $this->operators[$condition], + $filter_value + ); + } else { + $collection->whereDate( + $columnName, + $this->operators[$condition], + $filter_value + ); + } + } else if ($columnType === 'boolean') { + if ($this->enableFilterMap && isset($this->filterMap[$columnName])) { + if ($this->operators[$condition] == '=') { + if ($filter_value == 1) { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { + $query->where( + $this->filterMap[$columnName], + $this->operators[$condition], + $filter_value + )->orWhereNotNull($this->filterMap[$columnName]); + }); + } else { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { + $query->where( + $this->filterMap[$columnName], + $this->operators[$condition], + $filter_value + )->orWhereNull($this->filterMap[$columnName]); + }); + } + } else if ($this->operators[$condition] == '<>') { + if ($filter_value == 1) { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { + $query->where( + $this->filterMap[$columnName], + $this->operators[$condition], + $filter_value + )->orWhereNull($this->filterMap[$columnName]); + }); + } else { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { + $query->where( + $this->filterMap[$columnName], + $this->operators[$condition], + $filter_value + )->orWhereNotNull($this->filterMap[$columnName]); + }); + } + } else { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { + $query->where( + $this->filterMap[$columnName], + $this->operators[$condition], + $filter_value + ); + }); + } + } else if ($this->enableFilterMap && ! isset($this->filterMap[$columnName])) { + if ($this->operators[$condition] == '=') { + if ($filter_value == 1) { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { + $query->where( + $columnName, + $this->operators[$condition], + $filter_value + )->orWhereNotNull($this->filterMap[$columnName]); + }); + } else { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { + $query->where( + $columnName, + $this->operators[$condition], + $filter_value + )->orWhereNull($this->filterMap[$columnName]); + }); + } + } else if ($this->operators[$condition] == '<>') { + if ($filter_value == 1) { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { + $query->where( + $columnName, + $this->operators[$condition], + $filter_value + )->orWhereNull($this->filterMap[$columnName]); + }); + } else { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { + $query->where( + $columnName, + $this->operators[$condition], + $filter_value + )->orWhereNotNull($this->filterMap[$columnName]); + }); + } + } else { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { + $query->where( + $columnName, + $this->operators[$condition], + $filter_value + ); + }); + } + } else { + if ($this->operators[$condition] == '=') { + if ($filter_value == 1) { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { + $query->where( + $columnName, + $this->operators[$condition], + $filter_value + )->orWhereNotNull($this->filterMap[$columnName]); + }); + } else { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { + $query->where( + $columnName, + $this->operators[$condition], + $filter_value + )->orWhereNull($this->filterMap[$columnName]); + }); + } + } else if ($this->operators[$condition] == '<>') { + if ($filter_value == 1) { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { + $query->where( + $columnName, + $this->operators[$condition], + $filter_value + )->orWhereNull($this->filterMap[$columnName]); + }); + } else { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { + $query->where( + $columnName, + $this->operators[$condition], + $filter_value + )->orWhereNotNull($this->filterMap[$columnName]); + }); + } + } else { + $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { + $query->where( + $columnName, + $this->operators[$condition], + $filter_value + ); + }); + } + } + } else { + if ($this->enableFilterMap && isset($this->filterMap[$columnName])) { + $collection->where( + $this->filterMap[$columnName], + $this->operators[$condition], + $filter_value + ); + } else if ($this->enableFilterMap && ! isset($this->filterMap[$columnName])) { + $collection->where( + $columnName, + $this->operators[$condition], + $filter_value + ); + } else { + $collection->where( + $columnName, + $this->operators[$condition], + $filter_value + ); + } + } + } + } + } + /** * Fetch current route acl. As no access to acl key, this will fetch acl by route name. * * @param $action - * * @return array */ private function fetchCurrentRouteACL($action) @@ -887,7 +932,6 @@ abstract class DataGrid * Fetch route name from full url, not the current one. * * @param $action - * * @return array */ private function getRouteNameFromUrl($action, $method) diff --git a/packages/Webkul/Ui/src/Http/routes.php b/packages/Webkul/Ui/src/Http/routes.php index 55db43b66..50048d8c1 100755 --- a/packages/Webkul/Ui/src/Http/routes.php +++ b/packages/Webkul/Ui/src/Http/routes.php @@ -3,8 +3,3 @@ Route::view('/ui-kit', 'ui::partials.ui-kit'); Route::view('/helper-classess', 'ui::partials.helper-classes')->name('ui.helper.classes'); - -// Route::get('/users', function () { -// $users = \Webkul\User\Models\Admin::paginate(1); -// echo $users->links(); -// }); \ No newline at end of file diff --git a/packages/Webkul/Ui/src/Providers/UiServiceProvider.php b/packages/Webkul/Ui/src/Providers/UiServiceProvider.php index e5a4c37ad..4692c71a8 100755 --- a/packages/Webkul/Ui/src/Providers/UiServiceProvider.php +++ b/packages/Webkul/Ui/src/Providers/UiServiceProvider.php @@ -2,8 +2,8 @@ namespace Webkul\Ui\Providers; -use Illuminate\Support\ServiceProvider; use Illuminate\Pagination\Paginator; +use Illuminate\Support\ServiceProvider; class UiServiceProvider extends ServiceProvider { @@ -25,7 +25,7 @@ class UiServiceProvider extends ServiceProvider $this->loadViewsFrom(__DIR__ . '/../Resources/views', 'ui'); Paginator::defaultView('ui::partials.pagination'); - + Paginator::defaultSimpleView('ui::partials.pagination'); } From 26aa35c6be5e24343566f3b7d64468edcf499df3 Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Wed, 14 Apr 2021 20:29:49 +0530 Subject: [PATCH 06/45] Necesssary Details Refactored --- packages/Webkul/Ui/src/DataGrid/DataGrid.php | 41 +++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/packages/Webkul/Ui/src/DataGrid/DataGrid.php b/packages/Webkul/Ui/src/DataGrid/DataGrid.php index ab8005acc..72925dfbd 100644 --- a/packages/Webkul/Ui/src/DataGrid/DataGrid.php +++ b/packages/Webkul/Ui/src/DataGrid/DataGrid.php @@ -415,29 +415,18 @@ abstract class DataGrid $this->prepareQueryBuilder(); - $necessaryExtraFilters = []; - if (in_array('channels', $this->extraFilters)) { - $necessaryExtraFilters['channels'] = core()->getAllChannels(); - } - if (in_array('locales', $this->extraFilters)) { - $necessaryExtraFilters['locales'] = core()->getAllLocales(); - } - if (in_array('customer_groups', $this->extraFilters)) { - $necessaryExtraFilters['customer_groups'] = core()->getAllCustomerGroups(); - } - return view('ui::datagrid.table')->with('results', [ + 'index' => $this->index, 'records' => $this->getCollection(), 'columns' => $this->completeColumnDetails, 'actions' => $this->actions, 'massactions' => $this->massActions, - 'index' => $this->index, - 'enableMassActions' => $this->enableMassAction, 'enableActions' => $this->enableAction, + 'enableMassActions' => $this->enableMassAction, 'paginated' => $this->paginate, 'itemsPerPage' => $this->itemsPerPage, 'norecords' => __('ui::app.datagrid.no-records'), - 'extraFilters' => $necessaryExtraFilters + 'extraFilters' => $this->getNecessaryExtraFilters() ]); } @@ -915,6 +904,30 @@ abstract class DataGrid } } + /** + * Get necessary extra details. + * + * @return array + */ + private function getNecessaryExtraFilters() + { + $necessaryExtraFilters = []; + + $checks = [ + 'channels' => core()->getAllChannels(), + 'locales' => core()->getAllLocales(), + 'customer_groups' => core()->getAllCustomerGroups() + ]; + + foreach ($checks as $key => $val) { + if (in_array($key, $this->extraFilters)) { + $necessaryExtraFilters[$key] = $val; + } + } + + return $necessaryExtraFilters; + } + /** * Fetch current route acl. As no access to acl key, this will fetch acl by route name. * From 7eb2e5328ee709d226c26ce6bf2eb01fb8462ab9 Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Thu, 15 Apr 2021 12:17:24 +0530 Subject: [PATCH 07/45] Completed Datagrid Improvement --- packages/Webkul/Ui/src/DataGrid/DataGrid.php | 346 +++++++------------ 1 file changed, 117 insertions(+), 229 deletions(-) diff --git a/packages/Webkul/Ui/src/DataGrid/DataGrid.php b/packages/Webkul/Ui/src/DataGrid/DataGrid.php index 72925dfbd..228b29390 100644 --- a/packages/Webkul/Ui/src/DataGrid/DataGrid.php +++ b/packages/Webkul/Ui/src/DataGrid/DataGrid.php @@ -186,10 +186,6 @@ abstract class DataGrid */ protected $currentUser; - abstract public function prepareQueryBuilder(); - - abstract public function addColumns(); - /** * Create datagrid instance. * @@ -202,6 +198,16 @@ abstract class DataGrid $this->currentUser = auth()->guard('admin')->user(); } + /** + * Abstract method. + */ + abstract public function prepareQueryBuilder(); + + /** + * Abstract method. + */ + abstract public function addColumns(); + /** * Add the index as alias of the column and use the column to make things happen. * @@ -360,22 +366,16 @@ abstract class DataGrid $columnType = $this->findColumnType($key)[0] ?? null; $columnName = $this->findColumnType($key)[1] ?? null; - switch ($key) { - case 'sort': - $this->sortCollection($collection, $info); - break; + if ($key === 'sort') { + $this->sortCollection($collection, $info); + } else if ($key === 'search') { + $this->searchCollection($collection, $info); + } else { + if ($this->exceptionCheckInColumns($collection, $columnName)) { + return $collection; + } - case 'search': - $this->searchCollection($collection, $info); - break; - - default: - if ($this->exceptionCheckInColumns($collection, $columnName)) { - return $collection; - } - - $this->filterCollection($collection, $info, $columnType, $columnName); - break; + $this->filterCollection($collection, $info, $columnType, $columnName); } } @@ -644,17 +644,7 @@ abstract class DataGrid $collection->where(function ($collection) use ($info) { foreach ($this->completeColumnDetails as $column) { if ($column['searchable'] == true) { - if ($this->enableFilterMap && isset($this->filterMap[$column['index']])) { - $collection->orWhere( - $this->filterMap[$column['index']], - 'like', - '%' . $info['all'] . '%' - ); - } else if ($this->enableFilterMap && ! isset($this->filterMap[$column['index']])) { - $collection->orWhere($column['index'], 'like', '%' . $info['all'] . '%'); - } else { - $collection->orWhere($column['index'], 'like', '%' . $info['all'] . '%'); - } + $this->resolve($collection, $column['index'], 'like', '%' . $info['all'] . '%', 'orWhere'); } } }); @@ -692,218 +682,116 @@ abstract class DataGrid { if (array_keys($info)[0] === 'like' || array_keys($info)[0] === 'nlike') { foreach ($info as $condition => $filter_value) { - if ($this->enableFilterMap && isset($this->filterMap[$columnName])) { - $collection->where( - $this->filterMap[$columnName], - $this->operators[$condition], - '%' . $filter_value . '%' - ); - } else if ($this->enableFilterMap && ! isset($this->filterMap[$columnName])) { - $collection->where( - $columnName, - $this->operators[$condition], - '%' . $filter_value . '%' - ); - } else { - $collection->where( - $columnName, - $this->operators[$condition], - '%' . $filter_value . '%' - ); - } + $this->resolve($collection, $columnName, $condition, '%' . $filter_value . '%'); } } else { foreach ($info as $condition => $filter_value) { - if ($condition === 'undefined') { - $condition = '='; - } + $condition = ($condition === 'undefined') ? '=' : $condition; if ($columnType === 'datetime') { - if ($this->enableFilterMap && isset($this->filterMap[$columnName])) { - $collection->whereDate( - $this->filterMap[$columnName], - $this->operators[$condition], - $filter_value - ); - } else if ($this->enableFilterMap && ! isset($this->filterMap[$columnName])) { - $collection->whereDate( - $columnName, - $this->operators[$condition], - $filter_value - ); - } else { - $collection->whereDate( - $columnName, - $this->operators[$condition], - $filter_value - ); - } + $this->resolve($collection, $columnName, $condition, $filter_value, 'whereDate'); } else if ($columnType === 'boolean') { - if ($this->enableFilterMap && isset($this->filterMap[$columnName])) { - if ($this->operators[$condition] == '=') { - if ($filter_value == 1) { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $this->filterMap[$columnName], - $this->operators[$condition], - $filter_value - )->orWhereNotNull($this->filterMap[$columnName]); - }); - } else { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $this->filterMap[$columnName], - $this->operators[$condition], - $filter_value - )->orWhereNull($this->filterMap[$columnName]); - }); - } - } else if ($this->operators[$condition] == '<>') { - if ($filter_value == 1) { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $this->filterMap[$columnName], - $this->operators[$condition], - $filter_value - )->orWhereNull($this->filterMap[$columnName]); - }); - } else { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $this->filterMap[$columnName], - $this->operators[$condition], - $filter_value - )->orWhereNotNull($this->filterMap[$columnName]); - }); - } - } else { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $this->filterMap[$columnName], - $this->operators[$condition], - $filter_value - ); - }); - } - } else if ($this->enableFilterMap && ! isset($this->filterMap[$columnName])) { - if ($this->operators[$condition] == '=') { - if ($filter_value == 1) { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $columnName, - $this->operators[$condition], - $filter_value - )->orWhereNotNull($this->filterMap[$columnName]); - }); - } else { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $columnName, - $this->operators[$condition], - $filter_value - )->orWhereNull($this->filterMap[$columnName]); - }); - } - } else if ($this->operators[$condition] == '<>') { - if ($filter_value == 1) { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $columnName, - $this->operators[$condition], - $filter_value - )->orWhereNull($this->filterMap[$columnName]); - }); - } else { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $columnName, - $this->operators[$condition], - $filter_value - )->orWhereNotNull($this->filterMap[$columnName]); - }); - } - } else { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $columnName, - $this->operators[$condition], - $filter_value - ); - }); - } - } else { - if ($this->operators[$condition] == '=') { - if ($filter_value == 1) { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $columnName, - $this->operators[$condition], - $filter_value - )->orWhereNotNull($this->filterMap[$columnName]); - }); - } else { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $columnName, - $this->operators[$condition], - $filter_value - )->orWhereNull($this->filterMap[$columnName]); - }); - } - } else if ($this->operators[$condition] == '<>') { - if ($filter_value == 1) { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $columnName, - $this->operators[$condition], - $filter_value - )->orWhereNull($this->filterMap[$columnName]); - }); - } else { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $columnName, - $this->operators[$condition], - $filter_value - )->orWhereNotNull($this->filterMap[$columnName]); - }); - } - } else { - $collection->Where(function ($query) use ($columnName, $condition, $filter_value) { - $query->where( - $columnName, - $this->operators[$condition], - $filter_value - ); - }); - } - } + $this->resolve($collection, $columnName, $condition, $filter_value, 'where', 'resolveBooleanQuery'); } else { - if ($this->enableFilterMap && isset($this->filterMap[$columnName])) { - $collection->where( - $this->filterMap[$columnName], - $this->operators[$condition], - $filter_value - ); - } else if ($this->enableFilterMap && ! isset($this->filterMap[$columnName])) { - $collection->where( - $columnName, - $this->operators[$condition], - $filter_value - ); - } else { - $collection->where( - $columnName, - $this->operators[$condition], - $filter_value - ); - } + $this->resolve($collection, $columnName, $condition, $filter_value); } } } } + /** + * Resolve query. + * + * @param \Illuminate\Support\Collection $collection + * @param string $columnName + * @param string $condition + * @param string $filter_value + * @param string $clause + * @param string $method + * @return void + */ + private function resolve($collection, $columnName, $condition, $filter_value, $clause = 'where', $method = 'resolveQuery') + { + if ($this->enableFilterMap && isset($this->filterMap[$columnName])) { + $this->$method($collection, $this->filterMap[$columnName], $condition, $filter_value, $clause); + } else if ($this->enableFilterMap && ! isset($this->filterMap[$columnName])) { + $this->$method($collection, $columnName, $condition, $filter_value, $clause); + } else { + $this->$method($collection, $columnName, $condition, $filter_value, $clause); + } + } + + /** + * Resolve boolean query. + * + * @param \Illuminate\Support\Collection $collection + * @param string $columnName + * @param string $condition + * @param string $filter_value + * @return void + */ + private function resolveBooleanQuery($collection, $columnName, $condition, $filter_value) + { + if ($this->operators[$condition] == '=') { + if ($filter_value == 1) { + $this->resolveFilterQuery($collection, $columnName, $condition, $filter_value, false); + } else { + $this->resolveFilterQuery($collection, $columnName, $condition, $filter_value, true); + } + } else if ($this->operators[$condition] == '<>') { + if ($filter_value == 1) { + $this->resolveFilterQuery($collection, $columnName, $condition, $filter_value, true); + } else { + $this->resolveFilterQuery($collection, $columnName, $condition, $filter_value, false); + } + } else { + $this->resolveFilterQuery($collection, $columnName, $condition, $filter_value); + } + } + + /** + * Resolve filter query. + * + * @param \Illuminate\Support\Collection $collection + * @param string $columnName + * @param string $condition + * @param string $filter_value + * @param null|boolean $nullCheck + * @return void + */ + private function resolveFilterQuery($collection, $columnName, $condition, $filter_value, $nullCheck = null) + { + $clause = is_null($nullCheck) ? null : ( $nullCheck ? 'orWhereNull' : 'orWhereNotNull' ); + + $collection->where(function ($query) use ($columnName, $condition, $filter_value, $clause) { + $this->resolveQuery($query, $columnName, $condition, $filter_value); + + if (! is_null($clause)) { + $query->$clause(($this->filterMap[$columnName])); + } + }); + } + + /** + * Resolve query. + * + * @param object $query + * @param string $columnName + * @param string $condition + * @param string $filter_value + * @param null|boolean $nullCheck + * @return void + */ + private function resolveQuery($query, $columnName, $condition, $filter_value, $clause = 'where') + { + $query->$clause( + $columnName, + $this->operators[$condition], + $filter_value + ); + } + /** * Get necessary extra details. * From 234d8b4f763e54c887bf783bcf5b323e404e6404 Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Thu, 15 Apr 2021 13:47:22 +0530 Subject: [PATCH 08/45] DataGrid Further Enhanced --- packages/Webkul/Ui/src/DataGrid/DataGrid.php | 472 ++---------------- .../Ui/src/DataGrid/Traits/ProvideBouncer.php | 39 ++ .../src/DataGrid/Traits/ProvideCollection.php | 213 ++++++++ .../DataGrid/Traits/ProvideQueryResolver.php | 98 ++++ .../Traits/ProvideQueryStringParser.php | 83 +++ .../DataGrid/Traits/ProvideRouteResolver.php | 32 ++ 6 files changed, 498 insertions(+), 439 deletions(-) create mode 100644 packages/Webkul/Ui/src/DataGrid/Traits/ProvideBouncer.php create mode 100644 packages/Webkul/Ui/src/DataGrid/Traits/ProvideCollection.php create mode 100644 packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryResolver.php create mode 100644 packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryStringParser.php create mode 100644 packages/Webkul/Ui/src/DataGrid/Traits/ProvideRouteResolver.php diff --git a/packages/Webkul/Ui/src/DataGrid/DataGrid.php b/packages/Webkul/Ui/src/DataGrid/DataGrid.php index 228b29390..51a253f1b 100644 --- a/packages/Webkul/Ui/src/DataGrid/DataGrid.php +++ b/packages/Webkul/Ui/src/DataGrid/DataGrid.php @@ -3,9 +3,13 @@ namespace Webkul\Ui\DataGrid; use Illuminate\Support\Facades\Event; +use Webkul\Ui\DataGrid\Traits\ProvideBouncer; +use Webkul\Ui\DataGrid\Traits\ProvideCollection; abstract class DataGrid { + use ProvideBouncer, ProvideCollection; + /** * Set index columns, ex: id. * @@ -276,18 +280,14 @@ abstract class DataGrid */ public function addAction($action, $specialPermission = false) { - $currentRouteACL = $this->fetchCurrentRouteACL($action); - - $eventName = isset($action['title']) ? $this->generateEventName($action['title']) : null; - - if (bouncer()->hasPermission($currentRouteACL['key'] ?? null) || $specialPermission) { + $this->checkPermissions($action, $specialPermission, function ($action, $eventName) { $this->fireEvent('action.before.' . $eventName); $this->actions[] = $action; $this->enableAction = true; $this->fireEvent('action.after.' . $eventName); - } + }); } /** @@ -303,83 +303,14 @@ abstract class DataGrid { $massAction['route'] = $this->getRouteNameFromUrl($massAction['action'], $massAction['method']); - $currentRouteACL = $this->fetchCurrentRouteACL($massAction); - - $eventName = isset($massAction['label']) ? $this->generateEventName($massAction['label']) : null; - - if (bouncer()->hasPermission($currentRouteACL['key'] ?? null) || $specialPermission) { + $this->checkPermissions($massAction, $specialPermission, function ($action, $eventName) { $this->fireEvent('mass.action.before.' . $eventName); - $this->massActions[] = $massAction; + $this->massActions[] = $action; $this->enableMassAction = true; $this->fireEvent('mass.action.after.' . $eventName); - } - } - - /** - * Get collections. - * - * @return \Illuminate\Support\Collection - */ - public function getCollection() - { - $queryStrings = $this->getQueryStrings(); - - if (count($queryStrings)) { - $filteredOrSortedCollection = $this->sortOrFilterCollection( - $this->collection = $this->queryBuilder, - $queryStrings - ); - - return $this->generateResults($filteredOrSortedCollection); - } - - return $this->collection = $this->generateResults($this->queryBuilder); - } - - /** - * To find the alias of the column and by taking the column name. - * - * @param array $columnAlias - * @return array - */ - public function findColumnType($columnAlias) - { - foreach ($this->completeColumnDetails as $column) { - if ($column['index'] == $columnAlias) { - return [$column['type'], $column['index']]; - } - } - } - - /** - * Sort or filter collection. - * - * @param \Illuminate\Support\Collection $collection - * @param array $parseInfo - * @return \Illuminate\Support\Collection - */ - public function sortOrFilterCollection($collection, $parseInfo) - { - foreach ($parseInfo as $key => $info) { - $columnType = $this->findColumnType($key)[0] ?? null; - $columnName = $this->findColumnType($key)[1] ?? null; - - if ($key === 'sort') { - $this->sortCollection($collection, $info); - } else if ($key === 'search') { - $this->searchCollection($collection, $info); - } else { - if ($this->exceptionCheckInColumns($collection, $columnName)) { - return $collection; - } - - $this->filterCollection($collection, $info, $columnType, $columnName); - } - } - - return $collection; + }, 'label'); } /** @@ -415,19 +346,7 @@ abstract class DataGrid $this->prepareQueryBuilder(); - return view('ui::datagrid.table')->with('results', [ - 'index' => $this->index, - 'records' => $this->getCollection(), - 'columns' => $this->completeColumnDetails, - 'actions' => $this->actions, - 'massactions' => $this->massActions, - 'enableActions' => $this->enableAction, - 'enableMassActions' => $this->enableMassAction, - 'paginated' => $this->paginate, - 'itemsPerPage' => $this->itemsPerPage, - 'norecords' => __('ui::app.datagrid.no-records'), - 'extraFilters' => $this->getNecessaryExtraFilters() - ]); + return view('ui::datagrid.table')->with('results', $this->prepareViewData()); } /** @@ -450,6 +369,28 @@ abstract class DataGrid return $this->getCollection(); } + /** + * Prepare view data. + * + * @return array + */ + public function prepareViewData() + { + return [ + 'index' => $this->index, + 'records' => $this->getCollection(), + 'columns' => $this->completeColumnDetails, + 'actions' => $this->actions, + 'enableActions' => $this->enableAction, + 'massactions' => $this->massActions, + 'enableMassActions' => $this->enableMassAction, + 'paginated' => $this->paginate, + 'itemsPerPage' => $this->itemsPerPage, + 'norecords' => __('ui::app.datagrid.no-records'), + 'extraFilters' => $this->getNecessaryExtraFilters() + ]; + } + /** * Trigger event. * @@ -471,333 +412,12 @@ abstract class DataGrid } } - /** - * Generate event name. - * - * @param string $titleOrLabel - * @return string - */ - private function generateEventName($titleOrLabel) - { - $eventName = explode(' ', strtolower($titleOrLabel)); - return implode('.', $eventName); - } - - /** - * Parse the query strings and get it ready to be used. - * - * @return array - */ - private function getQueryStrings() - { - $route = request()->route() ? request()->route()->getName() : ''; - - $queryString = $this->grabQueryStrings($route == 'admin.datagrid.export' ? url()->previous() : url()->full()); - - $parsedQueryStrings = $this->parseQueryStrings($queryString); - - $this->itemsPerPage = isset($parsedQueryStrings['perPage']) ? $parsedQueryStrings['perPage']['eq'] : $this->itemsPerPage; - - unset($parsedQueryStrings['perPage']); - - return $this->updateQueryStrings($parsedQueryStrings); - } - - /** - * Grab query strings from url. - * - * @param string $fullUrl - * @return string - */ - private function grabQueryStrings($fullUrl) - { - return explode('?', $fullUrl)[1] ?? null; - } - - /** - * Parse query strings. - * - * @param string $queryString - * @return array - */ - private function parseQueryStrings($queryString) - { - $parsedQueryStrings = []; - - if ($queryString) { - parse_str(urldecode($queryString), $parsedQueryStrings); - - unset($parsedQueryStrings['page']); - } - - return $parsedQueryStrings; - } - - /** - * Update query strings. - * - * @param array $parsedQueryStrings - * @return array - */ - private function updateQueryStrings($parsedQueryStrings) - { - if (isset($parsedQueryStrings['grand_total'])) { - foreach ($parsedQueryStrings['grand_total'] as $key => $value) { - $parsedQueryStrings['grand_total'][$key] = str_replace(',', '.', $parsedQueryStrings['grand_total'][$key]); - } - } - - foreach ($parsedQueryStrings as $key => $value) { - if (in_array($key, ['locale'])) { - if (! is_array($value)) { - unset($parsedQueryStrings[$key]); - } - } else if (! is_array($value)) { - unset($parsedQueryStrings[$key]); - } - } - - return $parsedQueryStrings; - } - - /** - * Generate full results. - * - * @param object $queryBuilderOrCollection - * @return \Illuminate\Support\Collection - */ - private function generateResults($queryBuilderOrCollection) - { - if ($this->paginate) { - if ($this->itemsPerPage > 0) { - return $this->paginatedResults($queryBuilderOrCollection); - } - } else { - return $this->defaultResults($queryBuilderOrCollection); - } - } - - /** - * Generate paginated results. - * - * @param object $queryBuilderOrCollection - * @return \Illuminate\Support\Collection - */ - private function paginatedResults($queryBuilderOrCollection) - { - return $queryBuilderOrCollection->orderBy( - $this->index, - $this->sortOrder - )->paginate($this->itemsPerPage)->appends(request()->except('page')); - } - - /** - * Generate default results. - * - * @param object $queryBuilderOrCollection - * @return \Illuminate\Support\Collection - */ - private function defaultResults($queryBuilderOrCollection) - { - return $queryBuilderOrCollection->orderBy($this->index, $this->sortOrder)->get(); - } - - /** - * Sort collection. - * - * @param \Illuminate\Support\Collection $collection - * @param array $info - * @return void - */ - private function sortCollection($collection, $info) - { - $countKeys = count(array_keys($info)); - - if ($countKeys > 1) { - throw new \Exception('Fatal Error! Multiple sort keys found, please resolve the URL manually.'); - } - - $columnName = $this->findColumnType(array_keys($info)[0]); - - $collection->orderBy( - $columnName[1], - array_values($info)[0] - ); - } - - /** - * Search collection. - * - * @param \Illuminate\Support\Collection $collection - * @param array $info - * @return void - */ - private function searchCollection($collection, $info) - { - $countKeys = count(array_keys($info)); - - if ($countKeys > 1) { - throw new \Exception('Multiple search keys found, please resolve the URL manually.'); - } - - if ($countKeys == 1) { - $collection->where(function ($collection) use ($info) { - foreach ($this->completeColumnDetails as $column) { - if ($column['searchable'] == true) { - $this->resolve($collection, $column['index'], 'like', '%' . $info['all'] . '%', 'orWhere'); - } - } - }); - } - } - - /** - * Some exceptions check in column details. - * - * @param \Illuminate\Support\Collection $collection - * @param string $columnName - * @return bool - */ - private function exceptionCheckInColumns($collection, $columnName) - { - foreach ($this->completeColumnDetails as $column) { - if ($column['index'] === $columnName && ! $column['filterable']) { - return true; - } - } - - return false; - } - - /** - * Filter collection. - * - * @param \Illuminate\Support\Collection $collection - * @param array $info - * @param string $columnType - * @param string $columnName - * @return void - */ - private function filterCollection($collection, $info, $columnType, $columnName) - { - if (array_keys($info)[0] === 'like' || array_keys($info)[0] === 'nlike') { - foreach ($info as $condition => $filter_value) { - $this->resolve($collection, $columnName, $condition, '%' . $filter_value . '%'); - } - } else { - foreach ($info as $condition => $filter_value) { - - $condition = ($condition === 'undefined') ? '=' : $condition; - - if ($columnType === 'datetime') { - $this->resolve($collection, $columnName, $condition, $filter_value, 'whereDate'); - } else if ($columnType === 'boolean') { - $this->resolve($collection, $columnName, $condition, $filter_value, 'where', 'resolveBooleanQuery'); - } else { - $this->resolve($collection, $columnName, $condition, $filter_value); - } - } - } - } - - /** - * Resolve query. - * - * @param \Illuminate\Support\Collection $collection - * @param string $columnName - * @param string $condition - * @param string $filter_value - * @param string $clause - * @param string $method - * @return void - */ - private function resolve($collection, $columnName, $condition, $filter_value, $clause = 'where', $method = 'resolveQuery') - { - if ($this->enableFilterMap && isset($this->filterMap[$columnName])) { - $this->$method($collection, $this->filterMap[$columnName], $condition, $filter_value, $clause); - } else if ($this->enableFilterMap && ! isset($this->filterMap[$columnName])) { - $this->$method($collection, $columnName, $condition, $filter_value, $clause); - } else { - $this->$method($collection, $columnName, $condition, $filter_value, $clause); - } - } - - /** - * Resolve boolean query. - * - * @param \Illuminate\Support\Collection $collection - * @param string $columnName - * @param string $condition - * @param string $filter_value - * @return void - */ - private function resolveBooleanQuery($collection, $columnName, $condition, $filter_value) - { - if ($this->operators[$condition] == '=') { - if ($filter_value == 1) { - $this->resolveFilterQuery($collection, $columnName, $condition, $filter_value, false); - } else { - $this->resolveFilterQuery($collection, $columnName, $condition, $filter_value, true); - } - } else if ($this->operators[$condition] == '<>') { - if ($filter_value == 1) { - $this->resolveFilterQuery($collection, $columnName, $condition, $filter_value, true); - } else { - $this->resolveFilterQuery($collection, $columnName, $condition, $filter_value, false); - } - } else { - $this->resolveFilterQuery($collection, $columnName, $condition, $filter_value); - } - } - - /** - * Resolve filter query. - * - * @param \Illuminate\Support\Collection $collection - * @param string $columnName - * @param string $condition - * @param string $filter_value - * @param null|boolean $nullCheck - * @return void - */ - private function resolveFilterQuery($collection, $columnName, $condition, $filter_value, $nullCheck = null) - { - $clause = is_null($nullCheck) ? null : ( $nullCheck ? 'orWhereNull' : 'orWhereNotNull' ); - - $collection->where(function ($query) use ($columnName, $condition, $filter_value, $clause) { - $this->resolveQuery($query, $columnName, $condition, $filter_value); - - if (! is_null($clause)) { - $query->$clause(($this->filterMap[$columnName])); - } - }); - } - - /** - * Resolve query. - * - * @param object $query - * @param string $columnName - * @param string $condition - * @param string $filter_value - * @param null|boolean $nullCheck - * @return void - */ - private function resolveQuery($query, $columnName, $condition, $filter_value, $clause = 'where') - { - $query->$clause( - $columnName, - $this->operators[$condition], - $filter_value - ); - } - /** * Get necessary extra details. * * @return array */ - private function getNecessaryExtraFilters() + protected function getNecessaryExtraFilters() { $necessaryExtraFilters = []; @@ -815,30 +435,4 @@ abstract class DataGrid return $necessaryExtraFilters; } - - /** - * Fetch current route acl. As no access to acl key, this will fetch acl by route name. - * - * @param $action - * @return array - */ - private function fetchCurrentRouteACL($action) - { - return collect(config('acl'))->filter(function ($acl) use ($action) { - return $acl['route'] === $action['route']; - })->first(); - } - - /** - * Fetch route name from full url, not the current one. - * - * @param $action - * @return array - */ - private function getRouteNameFromUrl($action, $method) - { - return app('router')->getRoutes() - ->match(app('request')->create(str_replace(url('/'), '', $action), $method)) - ->getName(); - } } diff --git a/packages/Webkul/Ui/src/DataGrid/Traits/ProvideBouncer.php b/packages/Webkul/Ui/src/DataGrid/Traits/ProvideBouncer.php new file mode 100644 index 000000000..65442b6c1 --- /dev/null +++ b/packages/Webkul/Ui/src/DataGrid/Traits/ProvideBouncer.php @@ -0,0 +1,39 @@ +fetchCurrentRouteACL($action); + + $eventName = isset($action[$nameKey]) ? $this->generateEventName($action[$nameKey]) : null; + + if (bouncer()->hasPermission($currentRouteACL['key'] ?? null) || $specialPermission) { + $operation($action, $eventName); + } + } + + /** + * Generate event name. + * + * @param string $titleOrLabel + * @return string + */ + private function generateEventName($titleOrLabel) + { + $eventName = explode(' ', strtolower($titleOrLabel)); + return implode('.', $eventName); + } +} \ No newline at end of file diff --git a/packages/Webkul/Ui/src/DataGrid/Traits/ProvideCollection.php b/packages/Webkul/Ui/src/DataGrid/Traits/ProvideCollection.php new file mode 100644 index 000000000..3965acf7d --- /dev/null +++ b/packages/Webkul/Ui/src/DataGrid/Traits/ProvideCollection.php @@ -0,0 +1,213 @@ +getQueryStrings(); + + if (count($queryStrings)) { + $filteredOrSortedCollection = $this->sortOrFilterCollection( + $this->collection = $this->queryBuilder, + $queryStrings + ); + + return $this->generateResults($filteredOrSortedCollection); + } + + return $this->collection = $this->generateResults($this->queryBuilder); + } + + /** + * Sort or filter collection. + * + * @param \Illuminate\Support\Collection $collection + * @param array $parseInfo + * @return \Illuminate\Support\Collection + */ + public function sortOrFilterCollection($collection, $parseInfo) + { + foreach ($parseInfo as $key => $info) { + $columnType = $this->findColumnType($key)[0] ?? null; + $columnName = $this->findColumnType($key)[1] ?? null; + + if ($key === 'sort') { + $this->sortCollection($collection, $info); + } else if ($key === 'search') { + $this->searchCollection($collection, $info); + } else { + if ($this->exceptionCheckInColumns($collection, $columnName)) { + return $collection; + } + + $this->filterCollection($collection, $info, $columnType, $columnName); + } + } + + return $collection; + } + + /** + * To find the alias of the column and by taking the column name. + * + * @param array $columnAlias + * @return array + */ + public function findColumnType($columnAlias) + { + foreach ($this->completeColumnDetails as $column) { + if ($column['index'] == $columnAlias) { + return [$column['type'], $column['index']]; + } + } + } + + /** + * Generate full results. + * + * @param object $queryBuilderOrCollection + * @return \Illuminate\Support\Collection + */ + private function generateResults($queryBuilderOrCollection) + { + if ($this->paginate) { + if ($this->itemsPerPage > 0) { + return $this->paginatedResults($queryBuilderOrCollection); + } + } else { + return $this->defaultResults($queryBuilderOrCollection); + } + } + + /** + * Generate paginated results. + * + * @param object $queryBuilderOrCollection + * @return \Illuminate\Support\Collection + */ + private function paginatedResults($queryBuilderOrCollection) + { + return $queryBuilderOrCollection->orderBy( + $this->index, + $this->sortOrder + )->paginate($this->itemsPerPage)->appends(request()->except('page')); + } + + /** + * Generate default results. + * + * @param object $queryBuilderOrCollection + * @return \Illuminate\Support\Collection + */ + private function defaultResults($queryBuilderOrCollection) + { + return $queryBuilderOrCollection->orderBy($this->index, $this->sortOrder)->get(); + } + + /** + * Sort collection. + * + * @param \Illuminate\Support\Collection $collection + * @param array $info + * @return void + */ + private function sortCollection($collection, $info) + { + $countKeys = count(array_keys($info)); + + if ($countKeys > 1) { + throw new \Exception('Fatal Error! Multiple sort keys found, please resolve the URL manually.'); + } + + $columnName = $this->findColumnType(array_keys($info)[0]); + + $collection->orderBy( + $columnName[1], + array_values($info)[0] + ); + } + + /** + * Search collection. + * + * @param \Illuminate\Support\Collection $collection + * @param array $info + * @return void + */ + private function searchCollection($collection, $info) + { + $countKeys = count(array_keys($info)); + + if ($countKeys > 1) { + throw new \Exception('Multiple search keys found, please resolve the URL manually.'); + } + + if ($countKeys == 1) { + $collection->where(function ($collection) use ($info) { + foreach ($this->completeColumnDetails as $column) { + if ($column['searchable'] == true) { + $this->resolve($collection, $column['index'], 'like', '%' . $info['all'] . '%', 'orWhere'); + } + } + }); + } + } + + /** + * Filter collection. + * + * @param \Illuminate\Support\Collection $collection + * @param array $info + * @param string $columnType + * @param string $columnName + * @return void + */ + private function filterCollection($collection, $info, $columnType, $columnName) + { + if (array_keys($info)[0] === 'like' || array_keys($info)[0] === 'nlike') { + foreach ($info as $condition => $filter_value) { + $this->resolve($collection, $columnName, $condition, '%' . $filter_value . '%'); + } + } else { + foreach ($info as $condition => $filter_value) { + + $condition = ($condition === 'undefined') ? '=' : $condition; + + if ($columnType === 'datetime') { + $this->resolve($collection, $columnName, $condition, $filter_value, 'whereDate'); + } else if ($columnType === 'boolean') { + $this->resolve($collection, $columnName, $condition, $filter_value, 'where', 'resolveBooleanQuery'); + } else { + $this->resolve($collection, $columnName, $condition, $filter_value); + } + } + } + } + + /** + * Some exceptions check in column details. + * + * @param \Illuminate\Support\Collection $collection + * @param string $columnName + * @return bool + */ + private function exceptionCheckInColumns($collection, $columnName) + { + foreach ($this->completeColumnDetails as $column) { + if ($column['index'] === $columnName && ! $column['filterable']) { + return true; + } + } + + return false; + } +} \ No newline at end of file diff --git a/packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryResolver.php b/packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryResolver.php new file mode 100644 index 000000000..2b3666d72 --- /dev/null +++ b/packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryResolver.php @@ -0,0 +1,98 @@ +enableFilterMap && isset($this->filterMap[$columnName])) { + $this->$method($collection, $this->filterMap[$columnName], $condition, $filter_value, $clause); + } else if ($this->enableFilterMap && ! isset($this->filterMap[$columnName])) { + $this->$method($collection, $columnName, $condition, $filter_value, $clause); + } else { + $this->$method($collection, $columnName, $condition, $filter_value, $clause); + } + } + + /** + * Resolve query. + * + * @param object $query + * @param string $columnName + * @param string $condition + * @param string $filter_value + * @param null|boolean $nullCheck + * @return void + */ + private function resolveQuery($query, $columnName, $condition, $filter_value, $clause = 'where') + { + $query->$clause( + $columnName, + $this->operators[$condition], + $filter_value + ); + } + + /** + * Resolve boolean query. + * + * @param \Illuminate\Support\Collection $collection + * @param string $columnName + * @param string $condition + * @param string $filter_value + * @return void + */ + private function resolveBooleanQuery($collection, $columnName, $condition, $filter_value) + { + if ($this->operators[$condition] == '=') { + if ($filter_value == 1) { + $this->resolveFilterQuery($collection, $columnName, $condition, $filter_value, false); + } else { + $this->resolveFilterQuery($collection, $columnName, $condition, $filter_value, true); + } + } else if ($this->operators[$condition] == '<>') { + if ($filter_value == 1) { + $this->resolveFilterQuery($collection, $columnName, $condition, $filter_value, true); + } else { + $this->resolveFilterQuery($collection, $columnName, $condition, $filter_value, false); + } + } else { + $this->resolveFilterQuery($collection, $columnName, $condition, $filter_value); + } + } + + /** + * Resolve filter query. + * + * @param \Illuminate\Support\Collection $collection + * @param string $columnName + * @param string $condition + * @param string $filter_value + * @param null|boolean $nullCheck + * @return void + */ + private function resolveFilterQuery($collection, $columnName, $condition, $filter_value, $nullCheck = null) + { + $clause = is_null($nullCheck) ? null : ( $nullCheck ? 'orWhereNull' : 'orWhereNotNull' ); + + $collection->where(function ($query) use ($columnName, $condition, $filter_value, $clause) { + $this->resolveQuery($query, $columnName, $condition, $filter_value); + + if (! is_null($clause)) { + $query->$clause(($this->filterMap[$columnName])); + } + }); + } +} \ No newline at end of file diff --git a/packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryStringParser.php b/packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryStringParser.php new file mode 100644 index 000000000..2a41cd108 --- /dev/null +++ b/packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryStringParser.php @@ -0,0 +1,83 @@ +route() ? request()->route()->getName() : ''; + + $queryString = $this->grabQueryStrings($route == 'admin.datagrid.export' ? url()->previous() : url()->full()); + + $parsedQueryStrings = $this->parseQueryStrings($queryString); + + $this->itemsPerPage = isset($parsedQueryStrings['perPage']) ? $parsedQueryStrings['perPage']['eq'] : $this->itemsPerPage; + + unset($parsedQueryStrings['perPage']); + + return $this->updateQueryStrings($parsedQueryStrings); + } + + /** + * Grab query strings from url. + * + * @param string $fullUrl + * @return string + */ + private function grabQueryStrings($fullUrl) + { + return explode('?', $fullUrl)[1] ?? null; + } + + /** + * Parse query strings. + * + * @param string $queryString + * @return array + */ + private function parseQueryStrings($queryString) + { + $parsedQueryStrings = []; + + if ($queryString) { + parse_str(urldecode($queryString), $parsedQueryStrings); + + unset($parsedQueryStrings['page']); + } + + return $parsedQueryStrings; + } + + /** + * Update query strings. + * + * @param array $parsedQueryStrings + * @return array + */ + private function updateQueryStrings($parsedQueryStrings) + { + if (isset($parsedQueryStrings['grand_total'])) { + foreach ($parsedQueryStrings['grand_total'] as $key => $value) { + $parsedQueryStrings['grand_total'][$key] = str_replace(',', '.', $parsedQueryStrings['grand_total'][$key]); + } + } + + foreach ($parsedQueryStrings as $key => $value) { + if (in_array($key, ['locale'])) { + if (! is_array($value)) { + unset($parsedQueryStrings[$key]); + } + } else if (! is_array($value)) { + unset($parsedQueryStrings[$key]); + } + } + + return $parsedQueryStrings; + } +} \ No newline at end of file diff --git a/packages/Webkul/Ui/src/DataGrid/Traits/ProvideRouteResolver.php b/packages/Webkul/Ui/src/DataGrid/Traits/ProvideRouteResolver.php new file mode 100644 index 000000000..3cde36259 --- /dev/null +++ b/packages/Webkul/Ui/src/DataGrid/Traits/ProvideRouteResolver.php @@ -0,0 +1,32 @@ +filter(function ($acl) use ($action) { + return $acl['route'] === $action['route']; + })->first(); + } + + /** + * Fetch route name from full url, not the current one. + * + * @param $action + * @return array + */ + private function getRouteNameFromUrl($action, $method) + { + return app('router')->getRoutes() + ->match(app('request')->create(str_replace(url('/'), '', $action), $method)) + ->getName(); + } +} \ No newline at end of file From a28ca5769277b2263d0ec020c2620c9583e70eeb Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Thu, 15 Apr 2021 14:44:13 +0530 Subject: [PATCH 09/45] One Comment Updated --- packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryResolver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryResolver.php b/packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryResolver.php index 2b3666d72..2e08d909a 100644 --- a/packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryResolver.php +++ b/packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryResolver.php @@ -5,7 +5,7 @@ namespace Webkul\Ui\DataGrid\Traits; trait ProvideQueryResolver { /** - * Resolve query. + * Main resolve method. * * @param \Illuminate\Support\Collection $collection * @param string $columnName From 1b7925984c66b9bb834728dd2de52d1ed24d6f5a Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Thu, 15 Apr 2021 14:59:09 +0530 Subject: [PATCH 10/45] Removed . As folder is not empty. --- packages/Webkul/Ui/.gitignore | 4 +--- packages/Webkul/Ui/src/Providers/.gitkeep | 0 2 files changed, 1 insertion(+), 3 deletions(-) delete mode 100755 packages/Webkul/Ui/src/Providers/.gitkeep diff --git a/packages/Webkul/Ui/.gitignore b/packages/Webkul/Ui/.gitignore index 6376db975..30bc16279 100755 --- a/packages/Webkul/Ui/.gitignore +++ b/packages/Webkul/Ui/.gitignore @@ -1,3 +1 @@ -/node_modules -/package-lock.json -npm-debug.log \ No newline at end of file +/node_modules \ No newline at end of file diff --git a/packages/Webkul/Ui/src/Providers/.gitkeep b/packages/Webkul/Ui/src/Providers/.gitkeep deleted file mode 100755 index e69de29bb..000000000 From 6f00123afea7d19e39f692c512801bf9bf844e17 Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Thu, 15 Apr 2021 17:29:48 +0530 Subject: [PATCH 11/45] Some More Refactors --- .../src/DataGrid/Traits/ProvideCollection.php | 17 +++--- .../DataGrid/Traits/ProvideQueryResolver.php | 59 +++++++++++-------- 2 files changed, 42 insertions(+), 34 deletions(-) diff --git a/packages/Webkul/Ui/src/DataGrid/Traits/ProvideCollection.php b/packages/Webkul/Ui/src/DataGrid/Traits/ProvideCollection.php index 3965acf7d..d1c2d4ced 100644 --- a/packages/Webkul/Ui/src/DataGrid/Traits/ProvideCollection.php +++ b/packages/Webkul/Ui/src/DataGrid/Traits/ProvideCollection.php @@ -45,7 +45,7 @@ trait ProvideCollection } else if ($key === 'search') { $this->searchCollection($collection, $info); } else { - if ($this->exceptionCheckInColumns($collection, $columnName)) { + if ($this->exceptionCheckInColumns($columnName)) { return $collection; } @@ -174,20 +174,20 @@ trait ProvideCollection private function filterCollection($collection, $info, $columnType, $columnName) { if (array_keys($info)[0] === 'like' || array_keys($info)[0] === 'nlike') { - foreach ($info as $condition => $filter_value) { - $this->resolve($collection, $columnName, $condition, '%' . $filter_value . '%'); + foreach ($info as $condition => $filterValue) { + $this->resolve($collection, $columnName, $condition, '%' . $filterValue . '%'); } } else { - foreach ($info as $condition => $filter_value) { + foreach ($info as $condition => $filterValue) { $condition = ($condition === 'undefined') ? '=' : $condition; if ($columnType === 'datetime') { - $this->resolve($collection, $columnName, $condition, $filter_value, 'whereDate'); + $this->resolve($collection, $columnName, $condition, $filterValue, 'whereDate'); } else if ($columnType === 'boolean') { - $this->resolve($collection, $columnName, $condition, $filter_value, 'where', 'resolveBooleanQuery'); + $this->resolve($collection, $columnName, $condition, $filterValue, 'where', 'resolveBooleanQuery'); } else { - $this->resolve($collection, $columnName, $condition, $filter_value); + $this->resolve($collection, $columnName, $condition, $filterValue); } } } @@ -196,11 +196,10 @@ trait ProvideCollection /** * Some exceptions check in column details. * - * @param \Illuminate\Support\Collection $collection * @param string $columnName * @return bool */ - private function exceptionCheckInColumns($collection, $columnName) + private function exceptionCheckInColumns($columnName) { foreach ($this->completeColumnDetails as $column) { if ($column['index'] === $columnName && ! $column['filterable']) { diff --git a/packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryResolver.php b/packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryResolver.php index 2e08d909a..ce1814377 100644 --- a/packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryResolver.php +++ b/packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryResolver.php @@ -10,19 +10,19 @@ trait ProvideQueryResolver * @param \Illuminate\Support\Collection $collection * @param string $columnName * @param string $condition - * @param string $filter_value + * @param string $filterValue * @param string $clause * @param string $method * @return void */ - private function resolve($collection, $columnName, $condition, $filter_value, $clause = 'where', $method = 'resolveQuery') + private function resolve($collection, $columnName, $condition, $filterValue, $clause = 'where', $method = 'resolveQuery') { if ($this->enableFilterMap && isset($this->filterMap[$columnName])) { - $this->$method($collection, $this->filterMap[$columnName], $condition, $filter_value, $clause); + $this->$method($collection, $this->filterMap[$columnName], $condition, $filterValue, $clause); } else if ($this->enableFilterMap && ! isset($this->filterMap[$columnName])) { - $this->$method($collection, $columnName, $condition, $filter_value, $clause); + $this->$method($collection, $columnName, $condition, $filterValue, $clause); } else { - $this->$method($collection, $columnName, $condition, $filter_value, $clause); + $this->$method($collection, $columnName, $condition, $filterValue, $clause); } } @@ -32,16 +32,16 @@ trait ProvideQueryResolver * @param object $query * @param string $columnName * @param string $condition - * @param string $filter_value + * @param string $filterValue * @param null|boolean $nullCheck * @return void */ - private function resolveQuery($query, $columnName, $condition, $filter_value, $clause = 'where') + private function resolveQuery($query, $columnName, $condition, $filterValue, $clause = 'where') { $query->$clause( $columnName, $this->operators[$condition], - $filter_value + $filterValue ); } @@ -51,44 +51,53 @@ trait ProvideQueryResolver * @param \Illuminate\Support\Collection $collection * @param string $columnName * @param string $condition - * @param string $filter_value + * @param string $filterValue * @return void */ - private function resolveBooleanQuery($collection, $columnName, $condition, $filter_value) + private function resolveBooleanQuery($collection, $columnName, $condition, $filterValue) { if ($this->operators[$condition] == '=') { - if ($filter_value == 1) { - $this->resolveFilterQuery($collection, $columnName, $condition, $filter_value, false); - } else { - $this->resolveFilterQuery($collection, $columnName, $condition, $filter_value, true); - } + $this->checkFilterValueCondition($collection, $columnName, $condition, $filterValue); } else if ($this->operators[$condition] == '<>') { - if ($filter_value == 1) { - $this->resolveFilterQuery($collection, $columnName, $condition, $filter_value, true); - } else { - $this->resolveFilterQuery($collection, $columnName, $condition, $filter_value, false); - } + $this->checkFilterValueCondition($collection, $columnName, $condition, $filterValue, true); } else { - $this->resolveFilterQuery($collection, $columnName, $condition, $filter_value); + $this->resolveFilterQuery($collection, $columnName, $condition, $filterValue); } } + /** + * Check filter value condition. + * + * @param \Illuminate\Support\Collection $collection + * @param string $columnName + * @param string $condition + * @param string $filterValue + * @param bool $nullCheck + * @return void + */ + private function checkFilterValueCondition($collection, $columnName, $condition, $filterValue, $nullCheck = false) + { + $filterValue == 1 + ? $this->resolveFilterQuery($collection, $columnName, $condition, $filterValue, $nullCheck) + : $this->resolveFilterQuery($collection, $columnName, $condition, $filterValue, ! $nullCheck); + } + /** * Resolve filter query. * * @param \Illuminate\Support\Collection $collection * @param string $columnName * @param string $condition - * @param string $filter_value + * @param string $filterValue * @param null|boolean $nullCheck * @return void */ - private function resolveFilterQuery($collection, $columnName, $condition, $filter_value, $nullCheck = null) + private function resolveFilterQuery($collection, $columnName, $condition, $filterValue, $nullCheck = null) { $clause = is_null($nullCheck) ? null : ( $nullCheck ? 'orWhereNull' : 'orWhereNotNull' ); - $collection->where(function ($query) use ($columnName, $condition, $filter_value, $clause) { - $this->resolveQuery($query, $columnName, $condition, $filter_value); + $collection->where(function ($query) use ($columnName, $condition, $filterValue, $clause) { + $this->resolveQuery($query, $columnName, $condition, $filterValue); if (! is_null($clause)) { $query->$clause(($this->filterMap[$columnName])); From a0fced67a104ebef2f0f1ec541a100b0b34d8be5 Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Thu, 15 Apr 2021 17:36:17 +0530 Subject: [PATCH 12/45] Arranged Method Name --- .../DataGrid/Traits/ProvideQueryResolver.php | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryResolver.php b/packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryResolver.php index ce1814377..fdf6f23bd 100644 --- a/packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryResolver.php +++ b/packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryResolver.php @@ -65,23 +65,6 @@ trait ProvideQueryResolver } } - /** - * Check filter value condition. - * - * @param \Illuminate\Support\Collection $collection - * @param string $columnName - * @param string $condition - * @param string $filterValue - * @param bool $nullCheck - * @return void - */ - private function checkFilterValueCondition($collection, $columnName, $condition, $filterValue, $nullCheck = false) - { - $filterValue == 1 - ? $this->resolveFilterQuery($collection, $columnName, $condition, $filterValue, $nullCheck) - : $this->resolveFilterQuery($collection, $columnName, $condition, $filterValue, ! $nullCheck); - } - /** * Resolve filter query. * @@ -104,4 +87,21 @@ trait ProvideQueryResolver } }); } + + /** + * Check filter value condition. + * + * @param \Illuminate\Support\Collection $collection + * @param string $columnName + * @param string $condition + * @param string $filterValue + * @param bool $nullCheck + * @return void + */ + private function checkFilterValueCondition($collection, $columnName, $condition, $filterValue, $nullCheck = false) + { + $filterValue == 1 + ? $this->resolveFilterQuery($collection, $columnName, $condition, $filterValue, $nullCheck) + : $this->resolveFilterQuery($collection, $columnName, $condition, $filterValue, ! $nullCheck); + } } \ No newline at end of file From 312d6a150dea9ead98c032f9175322bcdefd10bf Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Fri, 16 Apr 2021 13:59:32 +0530 Subject: [PATCH 13/45] Fixed #4800 --- .../Webkul/Ui/src/DataGrid/Traits/ProvideQueryResolver.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryResolver.php b/packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryResolver.php index fdf6f23bd..7f2f6333f 100644 --- a/packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryResolver.php +++ b/packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryResolver.php @@ -77,13 +77,13 @@ trait ProvideQueryResolver */ private function resolveFilterQuery($collection, $columnName, $condition, $filterValue, $nullCheck = null) { - $clause = is_null($nullCheck) ? null : ( $nullCheck ? 'orWhereNull' : 'orWhereNotNull' ); + $clause = is_null($nullCheck) ? null : ( $nullCheck ? 'orWhereNull' : 'whereNotNull' ); $collection->where(function ($query) use ($columnName, $condition, $filterValue, $clause) { $this->resolveQuery($query, $columnName, $condition, $filterValue); if (! is_null($clause)) { - $query->$clause(($this->filterMap[$columnName])); + $query->$clause($columnName); } }); } From 198fa5fdb2c89709e040a0fc1fd55df3d668e24b Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Tue, 20 Apr 2021 18:49:18 +0530 Subject: [PATCH 14/45] Cleaned Blade File From The Component --- .../Resources/views/datagrid/table.blade.php | 668 ++++++++++-------- 1 file changed, 356 insertions(+), 312 deletions(-) diff --git a/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php b/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php index 305a4fe7e..fa074621b 100644 --- a/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php +++ b/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php @@ -1,286 +1,301 @@ @php - /* all locales */ - $locales = core()->getAllLocales(); +/* all locales */ +$locales = core()->getAllLocales(); - /* request and fallback handling */ - $locale = request()->get('locale') ?: app()->getLocale(); - $channel = request()->get('channel') ?: (core()->getCurrentChannelCode() ?: core()->getDefaultChannelCode()); - $customer_group = request()->get('customer_group'); +/* request and fallback handling */ +$locale = request()->get('locale') ?: app()->getLocale(); +$channel = request()->get('channel') ?: (core()->getCurrentChannelCode() ?: core()->getDefaultChannelCode()); +$customer_group = request()->get('customer_group'); - /* handling cases for new locale if not present in current channel */ - if ($channel !== 'all') { - $channelLocales = app('Webkul\Core\Repositories\ChannelRepository')->findOneByField('code', $channel)->locales; +/* handling cases for new locale if not present in current channel */ +if ($channel !== 'all') { + $channelLocales = app('Webkul\Core\Repositories\ChannelRepository')->findOneByField('code', $channel)->locales; - if ($channelLocales->contains('code', $locale)) { - $locales = $channelLocales; - } else { - $channel = 'all'; - } + if ($channelLocales->contains('code', $locale)) { + $locales = $channelLocales; + } else { + $channel = 'all'; } +} @endphp
- + - @if (isset($results['paginated']) && $results['paginated']) + {{-- @if (isset($results['paginated']) && $results['paginated']) @include('ui::datagrid.pagination', ['results' => $results['records']]) - @endif + @endif --}} @push('scripts') + +
+ + +
+ + perPage + @{{ filter . label }} + + + @{{ filter . prettyValue }} + + + + @{{ decodeURIComponent(filter . val) }} + + + +
+ + + @include('ui::datagrid.partials.mass-action-header') + + @include('ui::datagrid.partials.default-header') + + @include('ui::datagrid.body', ['records' => $results['records'], 'actions' => $results['actions'], 'index' => $results['index'], 'columns' => $results['columns'],'enableMassActions' => $results['enableMassActions'], 'enableActions' => $results['enableActions'], 'norecords' => $results['norecords']]) +
+ + @endpush From d3bf9674618ca00b7b317c58a0b8de7eb09d7b67 Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Wed, 21 Apr 2021 13:45:58 +0530 Subject: [PATCH 16/45] All Filter Tags Blade Dependency Removed --- packages/Webkul/Ui/src/DataGrid/DataGrid.php | 31 +- .../views/datagrid/pagination.blade.php | 5 - .../Resources/views/datagrid/table.blade.php | 463 +++++++++--------- 3 files changed, 247 insertions(+), 252 deletions(-) delete mode 100644 packages/Webkul/Ui/src/Resources/views/datagrid/pagination.blade.php diff --git a/packages/Webkul/Ui/src/DataGrid/DataGrid.php b/packages/Webkul/Ui/src/DataGrid/DataGrid.php index 51a253f1b..9e3bf039b 100644 --- a/packages/Webkul/Ui/src/DataGrid/DataGrid.php +++ b/packages/Webkul/Ui/src/DataGrid/DataGrid.php @@ -415,15 +415,42 @@ abstract class DataGrid /** * Get necessary extra details. * + * To Do (@devansh-webkul): Refactor when work completed. + * * @return array */ protected function getNecessaryExtraFilters() { - $necessaryExtraFilters = []; + /* all locales */ + $locales = core()->getAllLocales(); + + /* request and fallback handling */ + $locale = request()->get('locale') ?: app()->getLocale(); + $channel = request()->get('channel') ?: (core()->getCurrentChannelCode() ?: core()->getDefaultChannelCode()); + $customer_group = request()->get('customer_group'); + + /* handling cases for new locale if not present in current channel */ + if ($channel !== 'all') { + $channelLocales = app('Webkul\Core\Repositories\ChannelRepository')->findOneByField('code', $channel)->locales; + + if ($channelLocales->contains('code', $locale)) { + $locales = $channelLocales; + } else { + $channel = 'all'; + } + } + + $necessaryExtraFilters = [ + 'current' => [ + 'locale' => $locale, + 'channel' => $channel, + 'customer_group' => $customer_group + ] + ]; $checks = [ 'channels' => core()->getAllChannels(), - 'locales' => core()->getAllLocales(), + 'locales' => $locales, 'customer_groups' => core()->getAllCustomerGroups() ]; diff --git a/packages/Webkul/Ui/src/Resources/views/datagrid/pagination.blade.php b/packages/Webkul/Ui/src/Resources/views/datagrid/pagination.blade.php deleted file mode 100644 index 6be6e181a..000000000 --- a/packages/Webkul/Ui/src/Resources/views/datagrid/pagination.blade.php +++ /dev/null @@ -1,5 +0,0 @@ -@if ($results instanceof \Illuminate\Pagination\LengthAwarePaginator) - -@endif \ No newline at end of file diff --git a/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php b/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php index 496ec2607..5f57dffaf 100644 --- a/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php +++ b/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php @@ -1,265 +1,242 @@ -@php -/* all locales */ -$locales = core()->getAllLocales(); - -/* request and fallback handling */ -$locale = request()->get('locale') ?: app()->getLocale(); -$channel = request()->get('channel') ?: (core()->getCurrentChannelCode() ?: core()->getDefaultChannelCode()); -$customer_group = request()->get('customer_group'); - -/* handling cases for new locale if not present in current channel */ -if ($channel !== 'all') { - $channelLocales = app('Webkul\Core\Repositories\ChannelRepository')->findOneByField('code', $channel)->locales; - - if ($channelLocales->contains('code', $locale)) { - $locales = $channelLocales; - } else { - $channel = 'all'; - } -} -@endphp -
- {{-- @if (isset($results['paginated']) && $results['paginated']) - @include('ui::datagrid.pagination', ['results' => $results['records']]) - @endif --}} - @push('scripts') @@ -268,10 +245,6 @@ if ($channel !== 'all') { template: '#datagrid-filters', props: [ - 'currentLocale', - 'currentChannel', - 'currentCustomerGroup', - 'index', 'records', 'columns', @@ -280,13 +253,13 @@ if ($channel !== 'all') { 'massActions', 'enableMassActions', 'paginated', + 'paginationHtml', 'itemsPerPage', 'norecords', 'extraFilters', ], data: function() { - console.log(this.columns); return { url: new URL(window.location.href), filterIndex: this.index, From d902c46fdfd62a9820b2c73793ffc9f06c7b6ecc Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Wed, 21 Apr 2021 14:37:27 +0530 Subject: [PATCH 17/45] Blade Depenency Removed From Default Header Also --- .../partials/default-header.blade.php | 33 -------- .../partials/mass-action-header.blade.php | 36 -------- .../Resources/views/datagrid/table.blade.php | 82 +++++++++++++++---- 3 files changed, 67 insertions(+), 84 deletions(-) delete mode 100644 packages/Webkul/Ui/src/Resources/views/datagrid/partials/default-header.blade.php delete mode 100644 packages/Webkul/Ui/src/Resources/views/datagrid/partials/mass-action-header.blade.php diff --git a/packages/Webkul/Ui/src/Resources/views/datagrid/partials/default-header.blade.php b/packages/Webkul/Ui/src/Resources/views/datagrid/partials/default-header.blade.php deleted file mode 100644 index f1ff8553a..000000000 --- a/packages/Webkul/Ui/src/Resources/views/datagrid/partials/default-header.blade.php +++ /dev/null @@ -1,33 +0,0 @@ - - - @if ($results['records'] instanceof \Illuminate\Pagination\LengthAwarePaginator && count($results['records']) && $results['enableMassActions']) - - - - - - - - @endif - - @foreach($results['columns'] as $key => $column) - - {{ $column['label'] }} - - @endforeach - - @if ($results['enableActions']) - - {{ __('ui::app.datagrid.actions') }} - - @endif - - \ No newline at end of file diff --git a/packages/Webkul/Ui/src/Resources/views/datagrid/partials/mass-action-header.blade.php b/packages/Webkul/Ui/src/Resources/views/datagrid/partials/mass-action-header.blade.php deleted file mode 100644 index e36830f81..000000000 --- a/packages/Webkul/Ui/src/Resources/views/datagrid/partials/mass-action-header.blade.php +++ /dev/null @@ -1,36 +0,0 @@ - - @if (isset($results['massactions'])) - - -
- - - - - -
- @csrf() - - - -
- -
- -
- -
- - -
-
- - - @endif - \ No newline at end of file diff --git a/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php b/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php index 5f57dffaf..36c188a82 100644 --- a/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php +++ b/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php @@ -226,9 +226,61 @@
- @include('ui::datagrid.partials.mass-action-header') + + + + + + + + + + + + + + + @include('ui::datagrid.body', ['records' => $results['records'], 'actions' => $results['actions'], 'index' => $results['index'], 'columns' => $results['columns'],'enableMassActions' => $results['enableMassActions'], 'enableActions' => $results['enableActions'], 'norecords' => $results['norecords']])
+
- @include('ui::datagrid.partials.default-header') + + + + +
+ @csrf() + + + +
+ +
+ +
+ +
+ + +
+
+
+ + + + + + + + {{ __('ui::app.datagrid.actions') }} +
@@ -319,19 +371,19 @@ } /* testing log */ - // console.log( - // 'Index--------------> ' + this.index + '\n\n', - // 'Records------------> ' + this.records + '\n\n', - // 'columns------------> ' + this.columns + '\n\n', - // 'actions------------> ' + this.actions + '\n\n', - // 'enableActions------> ' + this.enableActions + '\n\n', - // 'massActions--------> ' + this.massActions + '\n\n', - // 'enableMassActions--> ' + this.enableMassActions + '\n\n', - // 'paginated----------> ' + this.paginated + '\n\n', - // 'itemsPerPage-------> ' + this.itemsPerPage + '\n\n', - // 'norecords----------> ' + this.norecords + '\n\n', - // 'extraFilters-------> ' + this.extraFilters + '\n\n', - // ); + console.log( + 'Index--------------> ', this.index, '\n\n', + 'Records------------> ', this.records, '\n\n', + 'columns------------> ', this.columns, '\n\n', + 'actions------------> ', this.actions, '\n\n', + 'enableActions------> ', this.enableActions, '\n\n', + 'massActions--------> ', this.massActions, '\n\n', + 'enableMassActions--> ', this.enableMassActions, '\n\n', + 'paginated----------> ', this.paginated, '\n\n', + 'itemsPerPage-------> ', this.itemsPerPage, '\n\n', + 'norecords----------> ', this.norecords, '\n\n', + 'extraFilters-------> ', this.extraFilters, '\n\n', + ); }, methods: { From 035efd4e873ea38535a91df2ee4a7e2f3d48a17b Mon Sep 17 00:00:00 2001 From: devansh bawari Date: Wed, 21 Apr 2021 17:25:39 +0530 Subject: [PATCH 18/45] Fully Blade Dependency Removed Now Translation Pending --- .../Resources/views/datagrid/body.blade.php | 93 ------------------- .../Resources/views/datagrid/table.blade.php | 58 ++++++++++-- 2 files changed, 52 insertions(+), 99 deletions(-) delete mode 100644 packages/Webkul/Ui/src/Resources/views/datagrid/body.blade.php diff --git a/packages/Webkul/Ui/src/Resources/views/datagrid/body.blade.php b/packages/Webkul/Ui/src/Resources/views/datagrid/body.blade.php deleted file mode 100644 index 962bf7811..000000000 --- a/packages/Webkul/Ui/src/Resources/views/datagrid/body.blade.php +++ /dev/null @@ -1,93 +0,0 @@ - - @if ($records instanceof \Illuminate\Pagination\LengthAwarePaginator && count($records)) - @foreach ($records as $key => $record) - - @if ($enableMassActions) - - - - - - - - @endif - - @foreach ($columns as $column) - @php - $columnIndex = explode('.', $column['index']); - - $columnIndex = end($columnIndex); - @endphp - - @if (isset($column['wrapper'])) - @if (isset($column['closure']) && $column['closure'] == true) - {!! $column['wrapper']($record) !!} - @else - {{ $column['wrapper']($record) }} - @endif - @else - @if ($column['type'] == 'price') - @if (isset($column['currencyCode'])) - {{ core()->formatPrice($record->{$columnIndex}, $column['currencyCode']) }} - @else - {{ core()->formatBasePrice($record->{$columnIndex}) }} - @endif - @else - {{ $record->{$columnIndex} }} - @endif - @endif - @endforeach - - @if ($enableActions) - -
- @foreach ($actions as $action) - @php - $toDisplay = (isset($action['condition']) && gettype($action['condition']) == 'object') ? $action['condition']($record) : true; - @endphp - - @if ($toDisplay) - - - - @endif - @endforeach -
- - @endif - - @endforeach - @else - - -

{{ $norecords }}

- - - @endif - diff --git a/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php b/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php index 36c188a82..0d0a435f4 100644 --- a/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php +++ b/packages/Webkul/Ui/src/Resources/views/datagrid/table.blade.php @@ -1,5 +1,6 @@
- {{-- suitable for string columns --}}
  • - {{-- suitable for numeric columns --}}
  • @@ -178,7 +175,6 @@
  • - {{-- suitable for date/time columns --}}
  • - +
  • @@ -131,36 +124,38 @@
  • + :placeholder="translations.valueHere" v-model="stringValue"/>
  • - +
  • @@ -168,9 +163,9 @@
  • @@ -178,13 +173,13 @@
  • @@ -195,9 +190,7 @@
    - + @@ -208,14 +201,14 @@ perPage - @{{ filter . label }} + @{{ filter.label }} - @{{ filter . prettyValue }} + @{{ filter.prettyValue }} - @{{ decodeURIComponent(filter . val) }} + @{{ decodeURIComponent(filter.val) }} @@ -232,24 +225,23 @@
    - @csrf() - +
    -
    @@ -272,22 +264,10 @@ v-on:click="typeof column.sortable !== 'undefined' && column.sortable ? sortCollection(column.index) : {}"> - - {{ __('ui::app.datagrid.actions') }} - + - @php - $records = $results['records']; - $actions = $results['actions']; - $index = $results['index']; - $columns = $results['columns']; - $enableMassActions = $results['enableMassActions']; - $enableActions = $results['enableActions']; - $norecords = $results['norecords']; - @endphp -