Add sort dropdown to profile pages

This commit is contained in:
2018-08-20 22:09:22 +02:00
parent 4392ab9d7b
commit 6b04218f67
6 changed files with 111 additions and 81 deletions
+66
View File
@@ -150,6 +150,8 @@ class Table extends BaseModel
}
}
if ($name == 'handle') return '@' . $this->cachedOwner()->name . '/' . $this->name;
if ($name == 'draftSessionKey') return "proposal.{$this->id}";
return parent::__get($name);
@@ -192,4 +194,68 @@ class Table extends BaseModel
->with('owner:id,name,title')
->withCount(['favourites', 'forks', 'revisions', 'proposals', 'comments']);
}
public static function getSortOptions()
{
return [
'most-visited' => 'Most Visited',
'last-updated' => 'Last Updated',
'most-updated' => 'Most Changed',
// 'most-discussed' => 'Most Discussed',
// 'most-liked' => 'Most Liked',
'newest' => 'Newest',
'oldest' => 'Oldest',
'most-rows' => 'Longest',
'least-rows' => 'Shortest',
];
}
public static function resolveSortType($sort)
{
$defaultSort = 'last-updated';
if (!in_array($sort, array_keys(self::getSortOptions()))) {
$sort = $defaultSort;
}
return $sort;
}
public function scopeTableSort(Builder $query, $sort)
{
switch ($sort) {
case 'most-visited':
$query = $query->orderBy('visits', 'desc');
break;
case 'last-updated':
$query = $query->orderBy('updated_at', 'desc');
break;
case 'most-updated':
$query = $query->orderBy('revisions_count', 'desc');
break;
case 'most-discussed':
$query = $query->orderBy('comments_count', 'desc');
break;
case 'most-liked':
$query = $query->orderBy('favourites_count', 'desc');
break;
case 'most-rows':
$query = $query
->join('revisions', 'revisions.id', '=', 'tables.revision_id')
->orderBy('revisions.row_count', 'desc');
break;
case 'least-rows':
$query = $query
->join('revisions', 'revisions.id', '=', 'tables.revision_id')
->orderBy('revisions.row_count', 'asc');
break;
case 'newest':
$query = $query->orderBy('created_at', 'desc');
break;
case 'oldest':
$query = $query->orderBy('created_at', 'asc');
break;
}
return $query;
}
}