Skip to content

Commit 07fedfe

Browse files
authored
Merge pull request #2380 from dima-bzz/orthogonal
Added orthogonal sort and filter for collection
2 parents c0d7b1f + 52d4c3e commit 07fedfe

File tree

5 files changed

+47
-10
lines changed

5 files changed

+47
-10
lines changed

src/CollectionDataTable.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public function columnSearch()
100100
{
101101
$columns = $this->request->get('columns', []);
102102
for ($i = 0, $c = count($columns); $i < $c; $i++) {
103-
$column = $this->getColumnName($i);
103+
$column = $this->getColumnName($i, 'filter');
104104

105105
if (! $this->request->isColumnSearchable($i) || $this->isBlacklisted($column)) {
106106
continue;
@@ -230,7 +230,7 @@ protected function globalSearch($keyword)
230230

231231
$data = $this->serialize($row);
232232
foreach ($this->request->searchableColumnIndex() as $index) {
233-
$column = $this->getColumnName($index);
233+
$column = $this->getColumnName($index, 'sort');
234234
$value = Arr::get($data, $column);
235235
if (! $value || is_array($value)) {
236236
if (! is_numeric($value)) {
@@ -285,7 +285,7 @@ protected function getSorter(array $criteria)
285285
{
286286
$sorter = function ($a, $b) use ($criteria) {
287287
foreach ($criteria as $orderable) {
288-
$column = $this->getColumnName($orderable['column']);
288+
$column = $this->getColumnName($orderable['column'], 'sort');
289289
$direction = $orderable['direction'];
290290
if ($direction === 'desc') {
291291
$first = $b;

src/DataTableAbstract.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -939,13 +939,14 @@ protected function setupKeyword($value)
939939
/**
940940
* Get column name to be use for filtering and sorting.
941941
*
942-
* @param int $index
943-
* @param bool $wantsAlias
942+
* @param int $index
943+
* @param string|null $type
944+
* @param bool $wantsAlias
944945
* @return string
945946
*/
946-
protected function getColumnName($index, $wantsAlias = false)
947+
protected function getColumnName($index, $type = null, $wantsAlias = false)
947948
{
948-
$column = $this->request->columnName($index);
949+
$column = $this->request->columnName($index, $type);
949950

950951
// DataTables is using make(false)
951952
if (is_numeric($column)) {

src/QueryDataTable.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -660,7 +660,7 @@ protected function defaultOrdering()
660660
{
661661
collect($this->request->orderableColumns())
662662
->map(function ($orderable) {
663-
$orderable['name'] = $this->getColumnName($orderable['column'], true);
663+
$orderable['name'] = $this->getColumnName($orderable['column'], null, true);
664664

665665
return $orderable;
666666
})

src/Utilities/Request.php

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,13 +205,30 @@ public function keyword()
205205
/**
206206
* Get column identity from input or database.
207207
*
208-
* @param int $i
208+
* @param int $i
209+
* @param string|null $type
209210
* @return string
210211
*/
211-
public function columnName($i)
212+
public function columnName($i, $type = null)
212213
{
213214
$column = $this->request->input("columns.$i");
214215

216+
if (isset($type) && isset($column['data']) && is_array($column['data'])) {
217+
if (isset($column['data'][$type]) && $column['data'][$type] != '') {
218+
return $column['data'][$type];
219+
}
220+
221+
if (isset($column['data']['display']) && $column['data']['display'] != '') {
222+
return $column['data']['display'];
223+
}
224+
225+
if (isset($column['data']['_']) && $column['data']['_'] != '') {
226+
return $column['data']['_'];
227+
}
228+
229+
return $column['name'];
230+
}
231+
215232
return isset($column['name']) && $column['name'] != '' ? $column['name'] : $column['data'];
216233
}
217234

tests/Unit/RequestTest.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,25 @@ public function test_searchable_column_index()
112112
$this->assertEquals('bar', $request->columnName(1));
113113
}
114114

115+
public function test_searchable_with_filter_column_index()
116+
{
117+
$_GET['columns'] = [];
118+
$_GET['columns'][] = ['name' => 'foo', 'data' => ['_' => 'foo', 'filter' => 'foo.filter'], 'searchable' => 'true', 'search' => ['value' => 'foo']];
119+
$_GET['columns'][] = ['name' => 'bar', 'data' => ['_' => 'bar', 'filter' => 'bar.filter'], 'searchable' => 'false', 'search' => ['value' => 'foo']];
120+
request()->merge($_GET);
121+
$request = $this->getRequest();
122+
$this->assertEquals([0], $request->searchableColumnIndex());
123+
124+
$this->assertTrue($request->isColumnSearchable(0, false));
125+
$this->assertFalse($request->isColumnSearchable(1, false));
126+
127+
$this->assertTrue($request->isColumnSearchable(0, true));
128+
$this->assertFalse($request->isColumnSearchable(1, false));
129+
130+
$this->assertEquals('foo.filter', $request->columnName(0, 'filter'));
131+
$this->assertEquals('bar.filter', $request->columnName(1, 'filter'));
132+
}
133+
115134
public function test_keyword()
116135
{
117136
$_GET['search'] = [];

0 commit comments

Comments
 (0)