The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package MyTestApp;

use Dancer ':syntax';
use Dancer::Plugin::Form;

get '/' => sub {
    template 'index';
};

any [qw/get post/] => '/register' => sub {
    my $form = form('registration');
    my %values = %{$form->values};
    # VALIDATE, filter, etc. the values
    $form->fill(\%values);
    template register => {form => $form };
};

any [qw/get post/] => '/login' => sub {
    # select the form to fill. Only one supported for now.
    my $form;
    if (params->{login}) {
        $form = form('login');
    }
    else {
        $form = form('registration');
    }
    $form->fill($form->values);
    template login => { form => $form } ;
};

any [qw/get post/] => '/bugged_single' => sub {
    template register => {};
};

any [qw/get post/] => '/bugged_multiple' => sub {
    template login => {};
};

any [qw/get post/] => '/multiple' => sub {
    my $login = form('logintest');
    debug to_dumper({params});
    if (params->{login}) {
        my %vals = %{$login->values};
        # VALIDATE %vals here
        $login->fill(\%vals);
    }
    else {
        # pick from session
        $login->fill;
    }
    my $registration = form('registrationtest');
    if (params->{register}) {
        my %vals = %{$registration->values};
        # VALIDATE %vals here
        $registration->fill(\%vals);
    }
    else {
        # pick from session
        $registration->fill;
    }
    template multiple => { form => [ $login, $registration ] };
};

any [qw/post get/] => '/checkout' => sub {
    my (@days, @years);
    for (1..31) {
        push @days, { value => $_, label => "Day $_" };
    }
    for (2012..2020) {
        push @years, { value => $_, label => "Year $_" };
    }
    my $form = form('giftinfo');
    if (params->{submit}) {
        my %values = %{$form->values};
        $form->fill(\%values);
    }
    else {
        $form->fill;
    }

    my $detform = form('giftdetails');
    if (params->{submit_details}) {
        my %values = %{$detform->values};
        $detform->fill(\%values);
    }
    else {
        $detform->fill;
    }

    template 'checkout-giftinfo' => {
                                     form => [ $form, $detform ],
                                     days => \@days,
                                     years => \@years
                                    };
};

get '/iter' => sub {
    template dropdown => {
                          my_wishlists_dropdown => iterator()
                         };
};

any [qw/get post/] => '/double-dropdown' => sub {
    my $form = form('account_edit');
    my %values = %{$form->values};
    # VALIDATE, filter, etc. the values
    $form->fill(\%values);

    template double => {
                        'roles' => [
                                    {
                                     'value' => '1'
                                    },
                                    {
                                     'value' => '2'
                                    },
                                    {
                                     'value' => '3'
                                    },
                                    {
                                     'value' => '4'
                                    } 
                                   ],
                        form => $form,
                       };
};

any [qw/get post/] => '/double-dropdown-noform' => sub {
    template double => {
                        'roles' => [
                                    {
                                     'value' => '1'
                                    },
                                    {
                                     'value' => '2'
                                    },
                                    {
                                     'value' => '3'
                                    },
                                    {
                                     'value' => '4'
                                    } 
                                   ],
                       };
};

get '/ampersand' => sub {
    my @countries = ({name => 'Trinidad&Tobago'});

    template 'ampersand', {countries => \@countries};
};

sub iterator {
    return [{ label => "a",
              value => "b" },
            { label => "c",
              value => "d" }]
}


1;