Skip to content
This repository was archived by the owner on Dec 11, 2018. It is now read-only.

Commit b41e27c

Browse files
committed
Make review queue sortable
1 parent 0fabf02 commit b41e27c

File tree

4 files changed

+35
-14
lines changed

4 files changed

+35
-14
lines changed

data/templates/proposals/queue.html

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
{% extends "proposals/base.html" %}
22
{% set route = 'proposals_queue' %}
3+
{% set ctx = _context %}
4+
5+
{% macro sortHeader( column, ctx ) %}
6+
{% set sorted = ctx.s == column %}
7+
{% set label = "proposals-list-#{column}" %}
8+
{% if sorted %}
9+
{% set o = ctx.o == 'desc' ? 'desc' : 'asc' %}
10+
{% set nextO = o == 'asc' ? 'desc' : 'asc' %}
11+
{% else %}
12+
{% set nextO = 'asc' %}
13+
{% endif %}
14+
<th><a class="sortable {{ sorted ? "sorted-#{o}" : 'unsorted' }}" href="{{ urlFor( ctx.route ) }}?{{ qsMerge( { 's':column, 'o':nextO } ) }}">{{ label|message }}</a></th>
15+
{% endmacro %}
316

417
{% block subtitle %}{{ 'nav-proposals-queue'|message }}{% endblock %}
518
{% block content %}
@@ -11,17 +24,17 @@
1124

1225
<table class="table table-striped table-hover table-condensed table-responsive">
1326
<tr>
14-
<th>{{ 'proposals-list-title'|message }}</th>
15-
<th>{{ 'proposals-list-theme'|message }}</th>
16-
<th>{{ 'proposals-list-amount'|message }}</th>
17-
<th>{{ 'proposals-list-reviews'|message }}</th>
27+
{{ _self.sortHeader( 'title', ctx ) }}
28+
{{ _self.sortHeader( 'theme', ctx ) }}
29+
{{ _self.sortHeader( 'amount', ctx ) }}
30+
{{ _self.sortHeader( 'reviews', ctx ) }}
1831
</tr>
1932
{% for row in records %}
2033
<tr>
2134
<td><a href="{{ urlFor( 'proposals_view', { 'id': row.id } ) }}">{{ row.title }}</a></td>
2235
<td>{{ row.theme }}</td>
2336
<td class="text-right">{{ row.amount|number_format }}</td>
24-
<td class="text-right">{{ row.review_count|number_format }}</td>
37+
<td class="text-right">{{ row.reviews|number_format }}</td>
2538
</tr>
2639
{% else %}
2740
<tr><td colspan="12">{{ 'no-results'|message }}</td></tr>

data/templates/proposals/search.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@
5454
{{ _self.sortHeader( 'proposals-list-title', 'title', ctx ) }}
5555
{{ _self.sortHeader( 'proposals-list-theme', 'theme', ctx ) }}
5656
{{ _self.sortHeader( 'proposals-list-amount', 'amount', ctx ) }}
57-
{{ _self.sortHeader( 'proposals-list-reviews', 'review_count', ctx ) }}
58-
{{ _self.sortHeader( 'proposals-list-myreviews', 'my_review_count', ctx ) }}
57+
{{ _self.sortHeader( 'proposals-list-reviews', 'reviews', ctx ) }}
58+
{{ _self.sortHeader( 'proposals-list-myreviews', 'myreviews', ctx ) }}
5959
</tr>
6060
{% for row in records %}
6161
<tr>

src/Controllers/Proposals/Queue.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,24 @@ protected function handleGet() {
3838
array( 'min_range' => 1, 'max_range' => 250, 'default' => 20 )
3939
);
4040
$this->form->expectInt( 'p', array( 'min_range' => 0, 'default' => 0 ) );
41+
$this->form->expectString( 's', array( 'default' => 'id' ) );
42+
$this->form->expectInArray( 'o', array( 'asc', 'desc' ),
43+
array( 'default' => 'asc' )
44+
);
4145
$this->form->validate( $_GET );
4246

4347
$this->view->set( 'items', $this->form->get( 'items' ) );
4448
$this->view->set( 'p', $this->form->get( 'p' ) );
49+
$this->view->set( 's', $this->form->get( 's' ) );
50+
$this->view->set( 'o', $this->form->get( 'o' ) );
4551
$this->view->set( 'found', null );
4652

4753
$params = array(
4854
'proposals' => 'myqueue',
4955
'items' => $this->form->get( 'items' ),
5056
'page' => $this->form->get( 'p' ),
57+
'sort' => $this->form->get( 's' ),
58+
'order' => $this->form->get( 'o' ),
5159
);
5260

5361
$ret = $this->dao->search( $params );

src/Dao/Proposals.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ public function search( array $params ) {
122122

123123
$validSorts = array(
124124
'id', 'title', 'amount', 'theme', 'status',
125-
'review_count', 'my_review_count',
125+
'reviews', 'myreviews',
126126
);
127127
$sortby = in_array( $params['sort'], $validSorts ) ?
128128
$params['sort'] : $defaults['sort'];
@@ -154,29 +154,29 @@ public function search( array $params ) {
154154
'p.amount as amount',
155155
'p.theme as theme',
156156
'p.status as status',
157-
'COALESCE(rc.review_count, 0) as review_count',
158-
'COALESCE(mc.my_review_count, 0) as my_review_count',
157+
'COALESCE(rc.reviews, 0) as reviews',
158+
'COALESCE(mc.myreviews, 0) as myreviews',
159159
);
160160

161161
switch( $params['proposals'] ) {
162162
case 'unreviewed':
163-
$where[] = 'review_count IS NULL';
163+
$where[] = 'reviews IS NULL';
164164
break;
165165
case 'myqueue':
166-
$where[] = 'my_review_count IS NULL';
166+
$where[] = 'myreviews IS NULL';
167167
break;
168168
default:
169169
break;
170170
}
171171

172172
$reviewCountSql = self::concat(
173-
'SELECT proposal, count(*) as review_count',
173+
'SELECT proposal, count(*) as reviews',
174174
'FROM reviews',
175175
'GROUP BY proposal'
176176
);
177177

178178
$myReviewCountSql = self::concat(
179-
'SELECT proposal, count(*) as my_review_count',
179+
'SELECT proposal, count(*) as myreviews',
180180
'FROM reviews',
181181
'WHERE reviewer = :int_userid',
182182
'GROUP BY proposal'

0 commit comments

Comments
 (0)