+sub display_table_row {
+ my ($data, $tr) = @_;
+ $tr->fclass($_)->replace_content($data->{$_}) for qw/title subtitle quantity/;
+ $tr->fclass('freepost')->detach unless $data->{freepost};
+ $tr->fclass('price')->replace_content(stringify_money $data->{subtotal});
+ $tr->fclass('title')->attr('data-product', $data->{product});
+}
+
+sub display_order {
+ my ($data, $div) = @_;
+ my @products = @{decode_json $data->{products}};
+ $div->find('table')->iter3(\@products, \&display_table_row);
+ $div->fclass('name')->replace_content($data->{first_name} . ' ' . $data->{last_name});
+ $div->fclass('stripe_token')->replace_content($data->{stripe_token}) if $data->{stripe_token};
+}
+
+sub display_app {
+ my ($env) = @_;
+ $db{$$} //= DBIx::Simple->connect($ENV{OOF_DSN} // 'dbi:Pg:');
+ my $req = Plack::Request->new($env);
+ my $n = int ($req->param('n') // 10);
+ my @orders = $db{$$}->query("SELECT * FROM orders ORDER BY date DESC LIMIT $n")->hashes;
+ my $tree = $display->clone;
+ $tree->fclass('order')->iter3(\@orders, \&display_order);
+ [200, ['Content-type' => 'text/html; charset=utf-8'], [$tree->as_HTML]];
+}
+