The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
use warnings;
use strict;
 
package Jifty::Web::Form::Field::Collection;

use base qw/Jifty::Web::Form::Field/;

=head1 NAME

Jifty::Web::Form::Field::Collection - render a whole collection of available values

=head1 DESCRIPTION

Renders multiple text inputs with the same name, available_values used as defaults.

=head1 METHODS

=head2 render_widget

Renders the whole collection of available values.

=cut

sub render_widget {
    my $self  = shift;

    for my $opt ($self->available_values) {
        $self->render_option($opt);
    }
}

=head2 render_label

Render a label for our own.  We need to output the label as a span
instead since the labels are associated with the individual options.

=cut

sub render_label {
    my $self = shift;
    Jifty->web->out(
        qq{<span class="label @{[$self->classes]}">}
        . Jifty->web->escape(_($self->label))
        . qq{</span>\n}
    );

    return '';
}

=head2 render_option option

Renders a normal input field.

=cut

sub render_option {
    my $self = shift;
    my $opt = shift;
    my $display = ref($opt) ? $opt->{'display'} : $opt;
    my $value   = ref($opt) ? $opt->{'value'}   : $opt;
    $value = "0" unless defined $value;

    my $id = $self->element_id . "-" . $value;
    $id =~ s/\s+/_/;

    my $wclass = $self->_widget_class;

    my $field = qq! <input type="text" !;
    $field .= qq! name="@{[ Jifty->web->escape( $self->input_name ) ]}"!;
    $field .= qq! title="@{[ Jifty->web->escape( $self->title ) ]}"! if ($self->title);
    $field .= qq! id="@{[ Jifty->web->escape( $id ) ]}"!;
    $field .= qq! value="@{[ Jifty->web->escape( $value ) ]}""!;
    $field .= $wclass;
    $field .= qq{ />};

    $field .= qq{<label for="@{[ Jifty->web->escape( $id ) ]}"};
    $field .= $wclass;
    $field .= qq{ >@{[ Jifty->web->escape( $display ) ]}</label>\n };

    $field = qq{<span class="multitext">$field</span>};

    Jifty->web->out($field);
    '';
}

1;