From e1c7114bd4ebd847a59b82b4849fd70d1fc548df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Sat, 11 Aug 2018 23:34:48 +0200 Subject: [PATCH] correctly sort by numeric columns --- app/Http/Controllers/TableController.php | 2 +- app/Http/Controllers/TableEditController.php | 4 +- app/Models/Row.php | 22 ++++++ app/Tables/BaseExporter.php | 2 +- resources/assets/js/components/RowsEditor.vue | 77 +++++++++++-------- .../views/table/propose/edit-rows.blade.php | 1 + 6 files changed, 73 insertions(+), 35 deletions(-) diff --git a/app/Http/Controllers/TableController.php b/app/Http/Controllers/TableController.php index f809763..c7f5644 100644 --- a/app/Http/Controllers/TableController.php +++ b/app/Http/Controllers/TableController.php @@ -46,7 +46,7 @@ class TableController extends Controller $columns = Column::columnsFromJson($revision->columns); $rq = $revision->rowsData($columns); - if (count($columns)) $rq = $rq->orderByRaw("data->>'".$columns[0]->id."'"); + if (count($columns)) $rq = $rq->sortByCol($columns[0]); $rows = $rq->paginate(25, []); return view('table.view', [ diff --git a/app/Http/Controllers/TableEditController.php b/app/Http/Controllers/TableEditController.php index 36b3325..6f56b9d 100644 --- a/app/Http/Controllers/TableEditController.php +++ b/app/Http/Controllers/TableEditController.php @@ -97,7 +97,9 @@ class TableEditController extends Controller { $revision = $changeset->revision; $columns = $changeset->fetchAndTransformColumns(); - $rows = $revision->rowsData($columns, true, false)->paginate(25, []); + $rows = $revision->rowsData($columns, true, false) + ->sortByCol($changeset->fetchRevisionColumns()[0]) + ->paginate(25, []); return view('table.propose.edit-rows', [ 'changeset' => $changeset, diff --git a/app/Models/Row.php b/app/Models/Row.php index ca00961..c88f090 100644 --- a/app/Models/Row.php +++ b/app/Models/Row.php @@ -2,6 +2,9 @@ namespace App\Models; +use App\Tables\Column; +use Illuminate\Database\Eloquent\Builder; + /** * Row in a data table * @@ -25,6 +28,25 @@ class Row extends BaseModel $this->data->_id = $value; } + public function scopeSortByCol(Builder $query, Column $column, $dir="asc") + { + $q = "data->>'".$column->id."'"; + if ($column->type == 'int' || $column->type == 'float') { + $q = "CAST($q AS INTEGER)"; + } + else if ($column->type == 'float') { + $q = "CAST($q AS FLOAT)"; + } + + if ($dir == 'asc') { + $q .= ' ASC'; + } else { + $q .= ' DESC'; + } + + return $query->orderByRaw($q); + } + /** * Allocate a single Global Row ID, application-unique. * diff --git a/app/Tables/BaseExporter.php b/app/Tables/BaseExporter.php index b830aaa..14723b7 100644 --- a/app/Tables/BaseExporter.php +++ b/app/Tables/BaseExporter.php @@ -132,7 +132,7 @@ abstract class BaseExporter $columns = $this->columns; // TODO raw query to allow selecting aggregates, column subsets, etc - if (count($columns)) $rq = $rq->orderByRaw("data->>'".$columns[0]->id."'"); + if (count($columns)) $rq = $rq->sortByCol($columns[0]); while ($start < $count) { $rows = $rq->offset($start)->limit($chunkSize)->get()->toArray(); diff --git a/resources/assets/js/components/RowsEditor.vue b/resources/assets/js/components/RowsEditor.vue index a0bab0c..ecf9542 100644 --- a/resources/assets/js/components/RowsEditor.vue +++ b/resources/assets/js/components/RowsEditor.vue @@ -68,7 +68,7 @@ Rows are identified by row._id, columns by col.id - +