summaryrefslogtreecommitdiff
path: root/lib/VNWeb/Reviews/List.pm
blob: fcd0ed0317801585229929994ac19cac7b9d1035 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package VNWeb::Reviews::List;

use VNWeb::Prelude;


sub tablebox_ {
    my($opt, $lst, $count) = @_;

    my sub url { '?'.query_encode %$opt, @_ }

    paginate_ \&url, $opt->{p}, [$count, 50], 't';
    div_ class => 'mainbox browse reviewlist', sub {
        table_ class => 'stripe', sub {
            thead_ sub { tr_ sub {
                td_ class => 'tc1', sub { txt_ 'Date'; sortable_ 'id', $opt, \&url };
                td_ class => 'tc2', 'By';
                td_ class => 'tc3', 'Review';
                td_ class => 'tc4', 'Vote';
                td_ class => 'tc5', sub { txt_ 'Score';  sortable_ 'rating', $opt, \&url if auth->isMod };
                td_ class => 'tc6', 'C#';
                td_ class => 'tc7', sub { txt_ 'Last comment'; sortable_ 'lastpost', $opt, \&url };
            } };
            tr_ sub {
                td_ class => 'tc1', fmtdate $_->{date}, 'compact';
                td_ class => 'tc2', sub { user_ $_ };
                td_ class => 'tc3', sub { a_ href => "/$_->{id}", $_->{title} };
                td_ class => 'tc4', fmtvote $_->{vote};
                td_ class => 'tc5', sprintf '👍 %d 👎 %d', $_->{c_up}, $_->{c_down};
                td_ class => 'tc6', $_->{c_count};
                td_ class => 'tc7', $_->{c_lastnum} ? sub {
                    user_ $_, 'lu_';
                    txt_ ' @ ';
                    a_ href => "/$_->{id}.$_->{c_lastnum}#last", fmtdate $_->{ldate}, 'full';
                } :  '';
            } for @$lst;
        };
    };
    paginate_ \&url, $opt->{p}, [$count, 50], 'b';
}


TUWF::get qr{/w}, sub {
    return tuwf->resNotFound if !auth->permReview; #XXX:While in beta

    # TODO: User filter, so we can link from the user's page
    # TODO: Display full/short indicator

    my $opt = tuwf->validate(get =>
        p => { page => 1 },
        s => { onerror => 'id', enum => [qw[id lastpost rating]] },
        o => { onerror => 'd',  enum => [qw[a d]] },
    )->data;
    $opt->{s} = 'id' if $opt->{s} eq 'rating' && !auth->isMod;

    my $count = tuwf->dbVali('SELECT COUNT(*) FROM reviews');
    my $lst = tuwf->dbPagei({results => 50, page => $opt->{p}}, '
        SELECT w.id, w.vid, w.c_up, w.c_down, w.c_count, w.c_lastnum, v.title, uv.vote
             , ', sql_user(), ',', sql_totime('w.date'), 'as date
             , ', sql_user('wpu','lu_'), ',', sql_totime('wp.date'), 'as ldate
          FROM reviews w
          JOIN vn v ON v.id = w.vid
          LEFT JOIN users u ON u.id = w.uid
          LEFT JOIN reviews_posts wp ON w.id = wp.id AND w.c_lastnum = wp.num
          LEFT JOIN users wpu ON wpu.id = wp.uid
          LEFT JOIN ulist_vns uv ON uv.uid = w.uid AND uv.vid = w.vid
         ORDER BY', {id => 'w.id', lastpost => 'wp.date', rating => 'w.c_up-w.c_down'}->{$opt->{s}}, {a=>'ASC',d=>'DESC'}->{$opt->{o}}, 'NULLS LAST'
    );

    framework_ title => 'Browse reviews', sub {
        div_ class => 'mainbox', sub {
            h1_ 'Browse reviews';
            debug_ $lst;
        };
        tablebox_ $opt, $lst, $count;
    };
};

1;