The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Jifty::Plugin::RequestInspector::View;
use strict;
use warnings;
use Jifty::View::Declare -base;

template '/__jifty/admin/requests' => page {
    title => "Request Inspector"
}
content {
    render_region(
        name => 'aggregate',
        path => '/__jifty/admin/requests/aggregate',
    );

    h2 { "Request Inspector" };

    render_region(
        name => 'request_inspector',
        path => '/__jifty/admin/requests/requests',
    );

    div {
        hyperlink(
            label => "Clear requests",
            onclick => [
                {
                    refresh => 'request_inspector',
                    args => {
                        clear_requests => 1,
                    },
                },
                {
                    refresh => "aggregate",
                }
            ],
        ),
    };
};

template '/__jifty/admin/requests/requests' => sub {
    my $request_inspector = Jifty->find_plugin('Jifty::Plugin::RequestInspector');
    $request_inspector->clear_requests if get('clear_requests');

    ol {
        attr { id is 'request_inspector' };

        for my $request ($request_inspector->requests) {
            _render_request($request);
        }
    };

    render_region(
        name => 'more_button',
        path => '/__jifty/admin/requests/more_button',
    );
};

template '/__jifty/admin/requests/more_button' => sub {
    my $request_inspector = Jifty->find_plugin('Jifty::Plugin::RequestInspector');
    my $last_id = $request_inspector->last_id;

    hyperlink(
        label => "Load subsequent requests",
        onclick => [{
            element => '#request_inspector',
            append  => '/__jifty/admin/requests/more_requests',
            effect  => 'slideDown',
            arguments => {
                last_id => $last_id,
            },
        },
        {
            refresh_self => 1,
        },
        {
            refresh => "aggregate",
        }],
    );
};

template '/__jifty/admin/requests/more_requests' => sub {
    my $request_inspector = Jifty->find_plugin('Jifty::Plugin::RequestInspector');
    my $last_id = get('last_id');

    my @requests = $request_inspector->requests( after => $last_id );

    for my $request (@requests) {
        _render_request($request);
    }
};

template '/__jifty/admin/requests/aggregate' => sub {
    my $request_inspector = Jifty->find_plugin('Jifty::Plugin::RequestInspector');
    my @aggregates = grep {$_->can('inspect_render_aggregate')} $request_inspector->inspector_plugins;
    return unless @aggregates;

    h2 { "Aggregate information" };
    dl {
        for my $plugin (@aggregates) {
            my $plugin_name = ref $plugin;
            (my $short_name = $plugin_name) =~ s/^Jifty::Plugin:://;
            dt {
                hyperlink(
                    label => $short_name,
                    onclick => {
                        region => Jifty->web->qualified_region($plugin_name),
                        replace_with => '/__jifty/admin/requests/aggregate_plugin',
                        toggle => 1,
                        effect => 'slideDown',
                        arguments => {
                            plugin_name => $plugin_name,
                        },
                    },
                );
            };
            dd {
                render_region($plugin_name);
            };
        }
    }
};

template '/__jifty/admin/requests/aggregate_plugin' => sub {
    my $plugin_name = get('plugin_name');

    my $request_inspector = Jifty->find_plugin('Jifty::Plugin::RequestInspector');
    my @plugin_data = $request_inspector->get_all_plugin_data($plugin_name);

    my $plugin = Jifty->find_plugin($plugin_name)
        or abort(404);

    $plugin->inspect_render_aggregate(@plugin_data);
};

template '/__jifty/admin/requests/plugins' => sub {
    my $id = get('id');
    my $request_inspector = Jifty->find_plugin('Jifty::Plugin::RequestInspector');

    dl {
        for my $plugin ($request_inspector->inspector_plugins) {
            my $plugin_name = ref $plugin;
            my $plugin_data = $request_inspector->get_plugin_data($id, $plugin_name);
            next if !defined($plugin_data);

            dt {
                (my $short_name = $plugin_name) =~ s/^Jifty::Plugin:://;
                if ($plugin->can('inspect_render_analysis')) {
                    hyperlink(
                        label => $short_name,
                        onclick => {
                            region => Jifty->web->qualified_region($plugin_name),
                            replace_with => '/__jifty/admin/requests/plugin',
                            toggle  => 1,
                            effect  => 'slideDown',
                            arguments => {
                                id => $id,
                                plugin_name => $plugin_name,
                            },
                        },
                    );
                }
                else {
                    outs $short_name;
                }
            };
            dd {
                if ($plugin->can('inspect_render_summary')) {
                    outs $plugin->inspect_render_summary($plugin_data, $id);
                }
                render_region($plugin_name);
            };
        }
    };
};

template '/__jifty/admin/requests/plugin' => sub {
    my $id = get('id');
    my $plugin_name = get('plugin_name');

    my $request_inspector = Jifty->find_plugin('Jifty::Plugin::RequestInspector');
    my $plugin_data = $request_inspector->get_plugin_data($id, $plugin_name);

    my $plugin = Jifty->find_plugin($plugin_name)
        or abort(404);

    $plugin->inspect_render_analysis($plugin_data, $id);
};

sub _render_request {
    my $request = shift;

    li {
        my $id = $request->{id};

        hyperlink(
            label => $request->{url},
            onclick => {
                region       => Jifty->web->qualified_region("request_$id"),
                replace_with => '/__jifty/admin/requests/plugins',
                toggle    => 1,
                effect    => 'slideDown',
                arguments => {
                    id => $id,
                },
            },
        );

        outs sprintf ' (%.2gs)',  $request->{end} - $request->{start};
        if ($request->{cookie}) {
            outs " [" . $request->{cookie} . "]";
        }

        render_region("request_$id");
    };
}

1;

__END__

=head1 NAME

Jifty::Plugin::RequestInspector::View - View for RequestInspector

=cut