use base 'BSE::UI::AdminDispatch';
use Articles;
use OtherParents;
+use List::Util ();
-our $VERSION = "1.000";
+our $VERSION = "1.001";
=head1 NAME
=item *
+the keyword C<shuffle> which randomizes the order.
+
+=item *
+
a comma separated list of article field names, with optional reverse
flags. eg. C<author,-title> to sort by author ascending, title
descending.
$req->user_can(bse_edit_reorder_children => $parentid)
or return $self->access_error($req, $msg);
- my ($kids, $order) = $self->_limit_and_sort
+ my ($kids, $order) = $self->_limit_and_order
(
$req,
[
my %stepkids = map { $_->{id}, $_ } @stepkids;
my @kids =
- my ($kids, $order) = $self->_limit_and_sort
+ my ($kids, $order) = $self->_limit_and_order
(
$req,
[
my %stepparents = map { $_->{id}, $_ } @stepparents;
- my ($parents, $order) = $self->_limit_and_sort
+ my ($parents, $order) = $self->_limit_and_order
(
$req,
[
return $req->get_refresh($r);
}
-sub _limit_and_sort {
- my ($self, $req, $kids) = @_;
-
- my $cgi = $req->cgi;
- my $type = $cgi->param("type");
- if ($type) {
- $kids = [ grep $_->[0]{generator} =~ /::\Q$type\E$/, @$kids ];
- }
+sub _sort {
+ my ($self, $sort, $cgi, $kids) = @_;
- my @order = sort { $b <=> $a } map $_->[1]{$_->[2]}, @$kids;
- my $sort = join(",", $cgi->param('sort')) || 'current';
- $sort =~ s/-,/-/g;
my $reverse = $cgi->param('reverse');
my $code;
$code = sub { -$temp->() };
$order .= $order ? ", reversed" : "reverse";
}
- if ($code) {
- $kids = [ sort $code @$kids ];
- for my $i (0..$#$kids) {
- my $kid = $kids->[$i];
- $kid->[1]{$kid->[2]} = $order[$i];
- $kid->[1]->save();
- }
+
+ $kids = [ sort $code @$kids ];
+
+ return ( $kids, $order );
+}
+
+sub _shuffle {
+ my ($self, $kids) = @_;
+
+ $kids = [ List::Util::shuffle(@$kids) ];
+
+ return ( $kids, "shuffle" );
+}
+
+sub _limit_and_order {
+ my ($self, $req, $kids) = @_;
+
+ my $cgi = $req->cgi;
+ my $type = $cgi->param("type");
+ if ($type) {
+ $kids = [ grep $_->[0]{generator} =~ /::\Q$type\E$/, @$kids ];
}
+
+ my @order = sort { $b <=> $a } map $_->[1]{$_->[2]}, @$kids;
+ my $sort = join(",", $cgi->param('sort')) || 'current';
+ $sort =~ s/-,/-/g;
+
+ my $order;
+ if ($sort eq 'shuffle') {
+ ($kids, $order) = $self->_shuffle($kids);
+ }
+ else {
+ ($kids, $order) = $self->_sort($sort, $cgi, $kids);
+ }
+
+ for my $i (0..$#$kids) {
+ my $kid = $kids->[$i];
+ $kid->[1]{$kid->[2]} = $order[$i];
+ $kid->[1]->save();
+ }
+
return [ map $_->[0], @$kids ], $order;
}
</tr>
<:if UserCan edit_reorder_children:>
<tr>
- <td colspan="5">Sort by: <a href="/cgi-bin/admin/reorder.pl?parentid=<:article id:>&sort=title&refreshto=/cgi-bin/admin/add.pl?id=<:article id:>" data-sort="title">title</a> | <a href="/cgi-bin/admin/reorder.pl?parentid=<:article id:>&sort=date&refreshto=/cgi-bin/admin/add.pl?id=<:article id:>" data-sort="date">date</a> | <a href="/cgi-bin/admin/reorder.pl?parentid=<:article id:>&reverse=1&refreshto=/cgi-bin/admin/add.pl?id=<:article id:>" data-reverse="1">reverse</a></td>
+ <td colspan="5">Sort by:
+<a href="/cgi-bin/admin/reorder.pl?parentid=<:article id:>&sort=title&refreshto=/cgi-bin/admin/add.pl?id=<:article id:>" data-sort="title">title</a> |
+<a href="/cgi-bin/admin/reorder.pl?parentid=<:article id:>&sort=date&refreshto=/cgi-bin/admin/add.pl?id=<:article id:>" data-sort="date">date</a> |
+<a href="/cgi-bin/admin/reorder.pl?parentid=<:article id:>&reverse=1&refreshto=/cgi-bin/admin/add.pl?id=<:article id:>" data-reverse="1">reverse</a> |
+<a href="/cgi-bin/admin/reorder.pl?parentid=<:article id:>&sort=shuffle&refreshto=/cgi-bin/admin/add.pl?id=<:article id:>" data-shuffle="1">shuffle</a></td>
</tr>
<:or UserCan:><:eif UserCan:>
<:iterator begin children:>
</tr>
<:if UserCan edit_reorder_children:article:>
<tr>
- <td colspan="5" bgcolor="#FFFFFF">Sort by: <a href="/cgi-bin/admin/reorder.pl?parentid=<:article id:>&sort=title&refreshto=/cgi-bin/admin/add.pl?id=<:article id:>">title</a> | <a href="/cgi-bin/admin/reorder.pl?parentid=<:article id:>&sort=date&refreshto=/cgi-bin/admin/add.pl?id=<:article id:>">date</a> | <a href="/cgi-bin/admin/reorder.pl?parentid=<:article id:>&reverse=1&refreshto=/cgi-bin/admin/add.pl?id=<:article id:>">reverse</a></td>
+ <td colspan="5" bgcolor="#FFFFFF">Sort by:
+<a href="/cgi-bin/admin/reorder.pl?parentid=<:article id:>&sort=title&refreshto=/cgi-bin/admin/add.pl?id=<:article id:>">title</a> |
+<a href="/cgi-bin/admin/reorder.pl?parentid=<:article id:>&sort=date&refreshto=/cgi-bin/admin/add.pl?id=<:article id:>">date</a> |
+<a href="/cgi-bin/admin/reorder.pl?parentid=<:article id:>&reverse=1&refreshto=/cgi-bin/admin/add.pl?id=<:article id:>">reverse</a> |
+<a href="/cgi-bin/admin/reorder.pl?parentid=<:article id:>&sort=shuffle&refreshto=/cgi-bin/admin/add.pl?id=<:article id:>">shuffle</a></td>
</tr>
<:or UserCan:><:eif UserCan:>
<:iterator begin children:>