The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Reaction::UI::Widget::Collection::Grid;

use Reaction::UI::WidgetClass;

use namespace::clean -except => [ qw(meta) ];
extends 'Reaction::UI::Widget::Collection';

implements fragment header_cells {
  arg 'labels' => $_{viewport}->field_labels;
  render header_cell => over $_{viewport}->computed_field_order;
  if ($_{viewport}->member_action_count) {
    render 'header_action_cell';
  }
};

implements fragment header_cell {
  arg label => localized $_{labels}->{$_};
};

implements fragment header_action_cell {
  arg col_count => $_{viewport}->member_action_count;
};

__PACKAGE__->meta->make_immutable;

1;

__END__;

=head1 NAME

Reaction::UI::Widget::Collection::Grid - A collection with header and footer

=head1 DESCRIPTION

This widget is a subclass of L<Reaction::UI::Widget::Collection>. Additionally
to its superclass, it provides abstract means of a header and a footer.

=head1 FRAGMENTS

=head2 header_cells

Will set the C<labels> argument to the viewport's C<field_labels> attribute
value.

Afterwards, the C<header_cell> fragment will be rendered once for every entry
in the viewport's C<computed_field_order>.

Additionally, the C<header_action_cell> will be rendered when the current
viewport's C<member_action_count> is larger than 0.

=head2 header_cell

Populates the C<label> argument with a localised value of the C<labels>
hash reference argument. The used key is extracted from the C<_> topic
argument.

=head2 header_action_cell

Populates the C<col_count> argument with the viewports C<member_action_count>
attribute value.

=head1 LAYOUT SETS

=head2 base

  share/skin/base/layout/collection/grid.tt

The base grid layout set does not provide an markup, just abstract layouting.

The following layouts are provided:

=over 4

=item widget

Renders, in sequence, the C<header>, C<body> and C<footer> fragments.

=item header

Renders the C<header_row> fragment.

=item header_row

Renders the C<header_cells> fragment.

=item header_cell

Renders the C<header_cell_contents> fragment.

=item header_cell_contents

Renders the value of the C<label> argument.

=item header_action_cell

Renders the string C<Actions>.

=item body

Renders the C<members> fragment implemented in L<Reaction::UI::Widget::Collection>.

=back

=head2 default

  share/skin/default/layout/collection/grid.tt

This layout set extends the C<NEXT> in the skin inheritance hierarchy.

It is meant to extend upon the layout set with the same name in the C<base> skin and
provides the same abstract structure but with a table based markup.

The following layouts are provided:

=over 4

=item widget

Renders the next skin's C<widget> fragment surrounded by a C<table> element with the
class attribute C<grid>.

=item header

Renders the next skin's C<header> fragment surrounded by a C<thead> element.

=item header_row

Wrap's the next skin's C<header_row> fragment in a C<tr> element.

=item header_cell

Wrap's the next skin's C<header_cell> fragment in a C<th> element.

=item header_action_cell

Wrap's the next skin's C<header_action_cell> fragment in a C<th> element with a C<colspan>
attribute set to the number of actions found in the C<col_count> attribute

=item body

Wrap's the next skin's C<body> fragment in a C<tbody> element.

=back

=head1 SEE ALSO

=over 4

=item * L<Reaction::UI::Widget::Collection>

=item * L<Reaction::UI::Widget::Collection::Grid::Member>

=back

=head1 AUTHORS

See L<Reaction::Class> for authors.

=head1 LICENSE

See L<Reaction::Class> for the license.

=cut