package PVE::HTMLForm; use strict; use HTML::Entities; use PVE::I18N; use PVE::HTMLTable; sub new { my ($type, $formdata, $name) = @_; my $self = {}; $self->{formdata} = $formdata; $self->{elements} = 0;# internal element counter $self->{submit} = 0; $self->{name} = $name ? $name : "frm"; bless($self, $type); $self->{action} = $self->{formdata}->{"form_$self->{name}_submit"}; $self->postaction; return $self; } sub postaction { my ($self) = @_; my ($key, %d); # Rebuild Date for IP, Bool and Time fields foreach $key (sort keys (%{$self->{formdata}})) { if ($key =~ m/ip_[0-9]+_(.*)/) { if (!(exists ($d{$1}))) { $d{$1}=1; defined ($self->{formdata}->{"ip_0_$1"}) || ($self->{formdata}->{"ip_0_$1"} = '0'); defined ($self->{formdata}->{"ip_1_$1"}) || ($self->{formdata}->{"ip_1_$1"} = '0'); defined ($self->{formdata}->{"ip_2_$1"}) || ($self->{formdata}->{"ip_2_$1"} = '0'); defined ($self->{formdata}->{"ip_3_$1"}) || ($self->{formdata}->{"ip_3_$1"} = '0'); $self->{formdata}->{"$1"} = $self->{formdata}->{"ip_0_$1"} . "." . $self->{formdata}->{"ip_1_$1"} . "." . $self->{formdata}->{"ip_2_$1"} . "." . $self->{formdata}->{"ip_3_$1"}; } } if ($key =~ m/time_[0-9]+_(.*)/) { if (!(exists ($d{$1}))) { $d{$1}=1; defined ($self->{formdata}->{"time_0_$1"}) || ($self->{formdata}->{"time_0_$1"} = '00'); defined ($self->{formdata}->{"time_1_$1"}) || ($self->{formdata}->{"time_1_$1"} = '00'); $self->{formdata}->{"$1"} = $self->{formdata}->{"time_0_$1"} . ":" . $self->{formdata}->{"time_1_$1"}; } } if ($key =~ m/cb_n_(.*)/) { if (!(exists ($d{$1}))) { my $name = $1; $d{$name} = 1; my $val = ""; my $tmp; foreach my $k (keys (%{$self->{formdata}})) { if ($k =~ m/cb__(\w+)_$name/) { $tmp->{$1} = 1; } } foreach my $k (keys (%$tmp)) { $val .= " " if $val; $val .= $k; } $self->{formdata}->{"$1"} = $val; } } if ($key =~ m/bool_n_(.*)/) { if (!(exists ($d{$1}))) { $d{$1}=1; my $val = "0"; if ($self->{formdata}->{"bool_$1"}) { $val = "1"; } $self->{formdata}->{"$1"} = $val; } } } } sub action { my ($self) = @_; return $self->{action}; } sub create_element { my ($self, $name, $type, $value, $opt, $width) = @_; my $out = ''; my $class = 'normal'; my $encvalue = encode_entities ($value); $width = 200 if !$width; my $innerwidth = $width - 5; # width - margin - border - padding my $widthstr = "style='width:${innerwidth}px;'"; # normal text if ($type eq "text") { $out .= ""; } elsif ($type eq "textarea") { my $rows = $opt || 4; my $rh = int ($rows*int(1.2*12+1)); $out .= ""; } elsif ($type eq "viewonly") { $out .= ""; } # read only text elsif ($type eq "rotext") { $out .= ""; } # server time elsif ($type eq "rotime") { my $uid = PVE::HTMLControls::get_uid('mytimer'); $out .= "
$encvalue
"; $out .= PVE::HTMLControls::create_time_viewer ($uid); } # time of day elsif ($type eq "time") { my @tmp = split(/:/, $value); for my $i (0..1) { $out .= ""; $out .= " : " if !$i; } } # password elsif ($type eq "password") { $out .= ""; } # number elsif ($type eq "number") { $out .= ""; } # float elsif ($type eq "float") { $out .= ""; } # boolean value (0, 1) elsif ($type eq "bool" || $type eq "robool" || $type eq 'dynamicbool' || $type eq "nbool") { my $checked = $value ? 'checked' : ''; my $id = "bool_$name"; $out .= ""; if ($type eq "robool") { $out .= ""; } $out .= ""; } # dropdown elsif ($type eq "dropdown" || $type eq "dynamicdropdown") { my $table = PVE::HTMLTable->new ([]); my $titles; my $values; my $defvalue; if (ref($opt) eq 'ARRAY') { $values = $opt; } else { $values = $opt->{values}; $defvalue = $opt->{default}; foreach my $head (@{$opt->{titles}}) { push @$titles, 1, undef, $head; } } $table->add_headline ($titles) if $titles; if (defined($value)) { my $found; my $first; foreach my $elem (@$values) { my ($ev, $et, @da); if (ref ($elem) eq 'ARRAY') { ($ev, $et, @da) = @$elem; } else { $ev = $et = $elem; } $first = $ev if !$first; $found = 1 if $ev eq $value; } if (!$found) { $value = defined ($defvalue) ? $defvalue : $first; } } foreach my $elem (@$values) { my ($ev, $et, @da); if (ref ($elem) eq 'ARRAY') { ($ev, $et, @da) = @$elem; } else { $ev = $et = $elem; } push @da, $et if !scalar (@da); if (!defined($value)) { $value = defined ($defvalue) ? $defvalue : $ev; } my $checked = ($ev eq $value) ? 'checked="checked"' : ''; my $inp = ""; my @line; foreach my $dv (@da) { if ($inp) { push @line, "$inp$dv"; $inp = undef; } else { push @line, $dv; } } $table->add_row ('', @line); } my $width1 = $width - 25; $out .= "
"; $out .= "
$value
"; $out .= "
"; $out .= $table->out_table(); $out .= "
"; $out .= "
"; $out .= ""; } # checkbox elsif ($type eq "checkbox") { my ($rows, $elref) = @$opt; my $sel; my @element = @$elref; map { $sel->{$_} = 1; } split ('\s', $value); $out .= ""; for my $i (0 .. $#element/$rows) { $out .= ""; for (my $j = 0; $j < $rows; $j++) { my $ind = $i*$rows + $j; last if $ind > $#element; my ($ev, $et) = ($element[$ind][0], $element[$ind][1]); my $val = $sel->{$ev} ? 'checked=true' : ''; $out .= ""; } $out .= ""; } $out .= "
"; $out .= ""; } # ip address elsif ($type eq "ip") { my @tmp = split(/\./, $value); $out .= ""; for my $i (0..3) { my $id = "ip_${i}_$name"; my $nextid = $i < 3 ? "ip_" . ($i+1) . "_$name" : ''; my $float = "style='float:left;"; $out .= <<__EOD; "; } } $out .= "
__EOD if ($i != 3) { $out .= ".
"; } # file upload elsif ($type eq "file") { # most wrowsers (firefox) ignore setting 'width', dont know how to fix $out .= ""; } # hidden input elsif ($type eq "hidden") { if (defined ($value)) { $out .= ""; } } # Day of week elsif ($type eq "dow") { my $cl = { mon => '', tue => '', wed => '', thu => '', fri => '', sat => '', sun => '' }; foreach my $day (split (/\s+/, $value)) { $cl->{$day} = 'checked'; } my @dn = split (/\s+/, __("Mon Tue Wed Thu Fri Sat Sun")); my $w='15%'; $out .= "
"; $out .= ""; $out .= ""; $out .= "
$dn[0]$dn[1]$dn[2]"; $out .= "$dn[3]$dn[4]$dn[5]$dn[6]
{mon} name='$name' value=mon>"; $out .= "{tue} name='$name' value=tue>"; $out .= "{wed} name='$name' value=wed>"; $out .= "{thu} name='$name' value=thu>"; $out .= "{fri} name='$name' value=fri>"; $out .= "{sat} name='$name' value=sat>"; $out .= "{sun} name='$name' value=sun>"; $out .= "
"; } else { die "unknown elemet type '$type'"; } $out .= "\n"; return $out; } sub create_cmdbutton { my ($self, $type, $text) = @_; my $href = "javascript:pve_form_save(\"$self->{name}\", \"$type\");"; my $out = " "; $text = $type if !$text; if ($type eq "save") { $text = __('save'); } elsif ($type eq "search") { $text = __('search'); } elsif ($type eq "create") { $text = __('create'); } elsif ($type eq "upload") { $text = __('upload'); } $out .= "$text"; return $out; } sub create_header { my ($self, $action) = @_; $action = '' if !$action; return "
"; } sub create_footer { my $self = shift; my $out = $self->create_element("form_$self->{name}_submit", 'hidden', 'post'); $out .= "
"; return $out; } 1;