Skip to content

Commit

Permalink
Merge pull request #6315 from devansh-webkul/checkbox-type-added
Browse files Browse the repository at this point in the history
Checkbox Support Added To Datagrid #6241
  • Loading branch information
jitendra-webkul committed Apr 20, 2022
2 parents 2c7cf3a + ff7788a commit 2c42054
Show file tree
Hide file tree
Showing 24 changed files with 492 additions and 208 deletions.
2 changes: 1 addition & 1 deletion packages/Webkul/Admin/src/DataGrids/OrderDataGrid.php
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ public function addColumns()
$this->addColumn([
'index' => 'status',
'label' => trans('admin::app.datagrid.status'),
'type' => 'string',
'type' => 'checkbox',
'options' => [
'processing' => trans('shop::app.customer.account.order.index.processing'),
'completed' => trans('shop::app.customer.account.order.index.completed'),
Expand Down
2 changes: 1 addition & 1 deletion packages/Webkul/Shop/src/DataGrids/OrderDataGrid.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public function addColumns()
$this->addColumn([
'index' => 'status',
'label' => trans('shop::app.customer.account.order.index.status'),
'type' => 'string',
'type' => 'checkbox',
'options' => [
'processing' => trans('shop::app.customer.account.order.index.processing'),
'completed' => trans('shop::app.customer.account.order.index.completed'),
Expand Down
2 changes: 1 addition & 1 deletion packages/Webkul/Ui/publishable/assets/js/ui.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/Webkul/Ui/publishable/assets/mix-manifest.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{
"/js/ui.js": "/js/ui.js?id=a2b05e91c1d8facc7948",
"/js/ui.js": "/js/ui.js?id=e1c749d03739730487d6",
"/css/ui.css": "/css/ui.css?id=243871695aaf4bd7cf12"
}
21 changes: 21 additions & 0 deletions packages/Webkul/Ui/src/DataGrid/DataGrid.php
Original file line number Diff line number Diff line change
Expand Up @@ -440,4 +440,25 @@ protected function getNecessaryExtraFilters()

return $necessaryExtraFilters;
}

/**
* Get column details by name. You can minimize the details by
* setting the key also.
*
* @param string $columnName
* @param string $key
* @return array
*/
protected function getColumnByName($columnName, $key = null)
{
$column = collect($this->columns)
->filter(fn($column) => $column['index'] === $columnName)
->first();

if ($key && isset($column[$key])) {
return $column[$key];
}

return $column;
}
}
4 changes: 2 additions & 2 deletions packages/Webkul/Ui/src/DataGrid/Traits/ProvideBouncer.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ trait ProvideBouncer
/**
* Check permissions.
*
* @param array $action
* @param bool $specialPermission
* @param array $action
* @param bool $specialPermission
* @param \Closure $operation
* @return void
*/
Expand Down
50 changes: 23 additions & 27 deletions packages/Webkul/Ui/src/DataGrid/Traits/ProvideCollection.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public function getCollection()
* Sort or filter collection.
*
* @param \Illuminate\Support\Collection $collection
* @param array $parseInfo
* @param array $parseInfo
* @return \Illuminate\Support\Collection
*/
public function sortOrFilterCollection($collection, $parseInfo)
Expand All @@ -42,17 +42,15 @@ public function sortOrFilterCollection($collection, $parseInfo)
$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($columnName)) {
return $collection;
}

$this->filterCollection($collection, $info, $columnType, $columnName);
if ($this->exceptionCheckInColumns($columnName)) {
return $collection;
}

match($key) {
'sort' => $this->sortCollection($collection, $info),
'search' => $this->searchCollection($collection, $info),
default => $this->filterCollection($collection, $info, $columnType, $columnName)
};
}

return $collection;
Expand Down Expand Up @@ -135,7 +133,7 @@ private function defaultResults($queryBuilderOrCollection)
* Sort collection.
*
* @param \Illuminate\Support\Collection $collection
* @param array $info
* @param array $info
* @return void
*/
private function sortCollection($collection, $info)
Expand All @@ -162,7 +160,7 @@ private function sortCollection($collection, $info)
* Search collection.
*
* @param \Illuminate\Support\Collection $collection
* @param array $info
* @param array $info
* @return void
*/
private function searchCollection($collection, $info)
Expand All @@ -188,9 +186,9 @@ private function searchCollection($collection, $info)
* Filter collection.
*
* @param \Illuminate\Support\Collection $collection
* @param array $info
* @param string $columnType
* @param string $columnName
* @param array $info
* @param string $columnType
* @param string $columnName
* @return void
*/
private function filterCollection($collection, $info, $columnType, $columnName)
Expand All @@ -204,15 +202,13 @@ private function filterCollection($collection, $info, $columnType, $columnName)

$condition = ($condition === 'undefined') ? '=' : $condition;

if ($columnType === 'datetime') {
$this->resolve($collection, $columnName, $condition, $filterValue, 'whereDate');
} else if ($columnType === 'boolean') {
$this->resolve($collection, $columnName, $condition, $filterValue, 'where', 'resolveBooleanQuery');
} else if ($columnType === 'price') {
$this->resolve($collection, $columnName, $condition, $filterValue, 'having');
} else {
$this->resolve($collection, $columnName, $condition, $filterValue);
}
match($columnType) {
'boolean' => $this->resolve($collection, $columnName, $condition, $filterValue, 'where', 'resolveBooleanQuery'),
'checkbox' => $this->resolve($collection, $columnName, $condition, $filterValue, 'whereIn', 'resolveCheckboxQuery'),
'price' => $this->resolve($collection, $columnName, $condition, $filterValue, 'having'),
'datetime' => $this->resolve($collection, $columnName, $condition, $filterValue, 'whereDate'),
default => $this->resolve($collection, $columnName, $condition, $filterValue)
};
}
}
}
Expand All @@ -225,7 +221,7 @@ private function filterCollection($collection, $info, $columnType, $columnName)
*/
private function transformColumns($record)
{
foreach($this->columns as $column) {
foreach ($this->columns as $column) {
$supportedClosureKey = ['wrapper', 'closure'];

$isClosure = ! empty(array_intersect($supportedClosureKey, array_keys($column)));
Expand Down Expand Up @@ -267,7 +263,7 @@ private function transformColumns($record)
*/
private function transformActions($record)
{
foreach($this->actions as $action) {
foreach ($this->actions as $action) {
$toDisplay = (isset($action['condition']) && gettype($action['condition']) == 'object') ? $action['condition']($record) : true;

$toDisplayKey = $this->generateKeyFromActionTitle($action['title'], '_to_display');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ public function getTranslations()
'value' => __('ui::app.datagrid.value'),
'valueHere' => __('ui::app.datagrid.value-here'),
'numericValueHere' => __('ui::app.datagrid.numeric-value-here'),
'select' => __('ui::form.select-attribute', ['attribute' => '']),
'apply' => __('ui::app.datagrid.apply'),
'submit' => __('ui::app.datagrid.submit'),
'actions' => __('ui::app.datagrid.actions'),
Expand Down
92 changes: 69 additions & 23 deletions packages/Webkul/Ui/src/DataGrid/Traits/ProvideQueryResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ trait ProvideQueryResolver
* Main resolve method.
*
* @param \Illuminate\Support\Collection $collection
* @param string $columnName
* @param string $condition
* @param string $filterValue
* @param string $clause
* @param string $method
* @param string $columnName
* @param string $condition
* @param string $filterValue
* @param string $clause
* @param string $method
* @return void
*/
private function resolve($collection, $columnName, $condition, $filterValue, $clause = 'where', $method = 'resolveQuery')
Expand All @@ -29,10 +29,10 @@ private function resolve($collection, $columnName, $condition, $filterValue, $cl
/**
* Resolve query.
*
* @param object $query
* @param string $columnName
* @param string $condition
* @param string $filterValue
* @param object $query
* @param string $columnName
* @param string $condition
* @param string $filterValue
* @param null|boolean $nullCheck
* @return void
*/
Expand All @@ -49,12 +49,13 @@ private function resolveQuery($query, $columnName, $condition, $filterValue, $cl
* Resolve boolean query.
*
* @param \Illuminate\Support\Collection $collection
* @param string $columnName
* @param string $condition
* @param string $filterValue
* @param string $columnName
* @param string $condition
* @param string $filterValue
* @param string $clause
* @return void
*/
private function resolveBooleanQuery($collection, $columnName, $condition, $filterValue)
private function resolveBooleanQuery($collection, $columnName, $condition, $filterValue, $clause)
{
if ($this->operators[$condition] == '=') {
$this->checkFilterValueCondition($collection, $columnName, $condition, $filterValue);
Expand All @@ -65,19 +66,40 @@ private function resolveBooleanQuery($collection, $columnName, $condition, $filt
}
}

/**
* Resolve checkbox query.
*
* @param \Illuminate\Support\Collection $collection
* @param string $columnName
* @param string $condition
* @param string $filterValue
* @param string $clause
* @return void
*/
private function resolveCheckboxQuery($collection, $columnName, $condition, $filterValue, $clause)
{
$filterValue = $this->mapFilterValue($columnName, $filterValue);

if ($this->operators[$condition] == '=') {
$collection->whereIn($columnName, $filterValue);
} else {
$collection->whereNotIn($columnName, $filterValue);
}
}

/**
* Resolve filter query.
*
* @param \Illuminate\Support\Collection $collection
* @param string $columnName
* @param string $condition
* @param string $filterValue
* @param null|boolean $nullCheck
* @param string $columnName
* @param string $condition
* @param string $filterValue
* @param null|boolean $nullCheck
* @return void
*/
private function resolveFilterQuery($collection, $columnName, $condition, $filterValue, $nullCheck = null)
{
$clause = is_null($nullCheck) ? null : ( $nullCheck ? 'orWhereNull' : 'whereNotNull' );
$clause = is_null($nullCheck) ? null : ($nullCheck ? 'orWhereNull' : 'whereNotNull');

$collection->where(function ($query) use ($columnName, $condition, $filterValue, $clause) {
$this->resolveQuery($query, $columnName, $condition, $filterValue);
Expand All @@ -92,10 +114,10 @@ private function resolveFilterQuery($collection, $columnName, $condition, $filte
* Check filter value condition.
*
* @param \Illuminate\Support\Collection $collection
* @param string $columnName
* @param string $condition
* @param string $filterValue
* @param bool $nullCheck
* @param string $columnName
* @param string $condition
* @param string $filterValue
* @param bool $nullCheck
* @return void
*/
private function checkFilterValueCondition($collection, $columnName, $condition, $filterValue, $nullCheck = false)
Expand All @@ -104,4 +126,28 @@ private function checkFilterValueCondition($collection, $columnName, $condition,
? $this->resolveFilterQuery($collection, $columnName, $condition, $filterValue, $nullCheck)
: $this->resolveFilterQuery($collection, $columnName, $condition, $filterValue, ! $nullCheck);
}
}

/**
* Map filter value. Currently supported checkbox type.
*
* In future may be this will become big with multiple if else cases.
*
* @param string $columnName
* @param string $filterValue
* @return array
*/
private function mapFilterValue($columnName, $filterValue)
{
$options = $this->getColumnByName($columnName, 'options');

return collect(explode(',', $filterValue))->map(function ($value) use ($options) {
$mappedKey = collect($options)->search($value);

if (! $mappedKey) {
throw new \Exception(__('ui::app.datagrid.error.mapped-keys-error'));
}

return $mappedKey;
})->toArray();
}
}
Loading

0 comments on commit 2c42054

Please sign in to comment.