aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/FixMyStreet
diff options
context:
space:
mode:
Diffstat (limited to 'perllib/FixMyStreet')
-rw-r--r--perllib/FixMyStreet/App/Controller/Admin.pm6
-rw-r--r--perllib/FixMyStreet/Cobrand/Zurich.pm38
2 files changed, 43 insertions, 1 deletions
diff --git a/perllib/FixMyStreet/App/Controller/Admin.pm b/perllib/FixMyStreet/App/Controller/Admin.pm
index 7479bdba5..de69880c1 100644
--- a/perllib/FixMyStreet/App/Controller/Admin.pm
+++ b/perllib/FixMyStreet/App/Controller/Admin.pm
@@ -1325,7 +1325,11 @@ sub fetch_all_bodies : Private {
my ($self, $c ) = @_;
my @bodies = $c->model('DB::Body')->all;
- @bodies = sort { strcoll($a->name, $b->name) } @bodies;
+ if ( $c->cobrand->moniker eq 'zurich' ) {
+ @bodies = $c->cobrand->admin_fetch_all_bodies( @bodies );
+ } else {
+ @bodies = sort { strcoll($a->name, $b->name) } @bodies;
+ }
$c->stash->{bodies} = \@bodies;
return 1;
diff --git a/perllib/FixMyStreet/Cobrand/Zurich.pm b/perllib/FixMyStreet/Cobrand/Zurich.pm
index 1c4718da7..b2d68014a 100644
--- a/perllib/FixMyStreet/Cobrand/Zurich.pm
+++ b/perllib/FixMyStreet/Cobrand/Zurich.pm
@@ -334,4 +334,42 @@ sub _admin_send_email {
} );
}
+sub admin_fetch_all_bodies {
+ my ( $self, @bodies ) = @_;
+
+ my %sorted;
+ foreach (@bodies) {
+ my $p = $_->parent ? $_->parent->id : 0;
+ push @{$sorted{$p}}, $_;
+ }
+
+ sub tree_sort {
+ my ( $level, $array, $out ) = @_;
+
+ my @sorted;
+ if ( $level == 0 ) {
+ @sorted = sort {
+ # Want Zurich itself at the top.
+ return -1 if $sorted{$a->id};
+ return 1 if $sorted{$b->id};
+ # Otherwise, by name
+ strcoll($a->name, $b->name)
+ } @$array;
+ } else {
+ @sorted = sort { strcoll($a->name, $b->name) } @$array;
+ }
+ foreach ( @sorted ) {
+ $_->api_key( $level ); # Misuse
+ push @$out, $_;
+ if ($sorted{$_->id}) {
+ tree_sort( $level+1, $sorted{$_->id}, $out );
+ }
+ }
+ }
+
+ my @out;
+ tree_sort( 0, $sorted{0}, \@out );
+ return @out;
+}
+
1;