Commit 3844d9dd authored by preed%sigkill.com's avatar preed%sigkill.com

Bug 160410: defparams.pl support for single/multi pulldown menus; p=preed,r=joel,r2=bbaetz

parent 17e3e995
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
# Dan Mosedale <dmose@mozilla.org> # Dan Mosedale <dmose@mozilla.org>
# Joe Robins <jmrobins@tgix.com> # Joe Robins <jmrobins@tgix.com>
# Jake <jake@acutex.net> # Jake <jake@acutex.net>
# J. Paul Reed <preed@sigkill.com>
# #
# This file defines all the parameters that we have a GUI to edit within # This file defines all the parameters that we have a GUI to edit within
...@@ -43,12 +44,34 @@ sub defparams_pl_sillyness { ...@@ -43,12 +44,34 @@ sub defparams_pl_sillyness {
$zz = %::param_checker; $zz = %::param_checker;
$zz = %::param_desc; $zz = %::param_desc;
$zz = %::param_type; $zz = %::param_type;
$zz = %::MFORM;
} }
sub WriteParams { sub WriteParams {
foreach my $i (@::param_list) { foreach my $i (@::param_list) {
if (!defined $::param{$i}) { if (!defined $::param{$i}) {
if ($::param_type{$i} eq "m") {
## For list params (single or multi), param_default is an array
## with the second element as the default; we have to loop
## through it to get them all for multi lists and we have to
## select the second one by itself for single list (next branch
## of the if)
my $multiParamStr = "[ ";
foreach my $defaultParam (@{$::param_default{$i}->[1]}) {
$multiParamStr .= "'$defaultParam', ";
}
$multiParamStr .= " ]";
$::param{$i} = $multiParamStr;
}
elsif ($::param_type{$i} eq "s") {
$::param{$i} = $::param_default{$i}->[1];
}
else {
$::param{$i} = $::param_default{$i}; $::param{$i} = $::param_default{$i};
}
if (!defined $::param{$i}) { if (!defined $::param{$i}) {
die "No default parameter ever specified for $i"; die "No default parameter ever specified for $i";
} }
...@@ -68,6 +91,10 @@ sub WriteParams { ...@@ -68,6 +91,10 @@ sub WriteParams {
ChmodDataFile('data/params', 0666); ChmodDataFile('data/params', 0666);
} }
## $checker is a CODE ref that points to a function that verifies the
## parameter for validity; it is called by doeditparams.cgi with the value
## of the param as the first arg and the param name as the 2nd arg (which
## many checker functions ignore, but a couple of them need it.
sub DefParam { sub DefParam {
my ($id, $desc, $type, $default, $checker) = (@_); my ($id, $desc, $type, $default, $checker) = (@_);
...@@ -80,6 +107,57 @@ sub DefParam { ...@@ -80,6 +107,57 @@ sub DefParam {
} }
} }
## Converts text parameters for single- and multi-select type params to their
## array indices; takes the name of the parameter and the value you want the
## index of; returns undef on failure.
sub get_select_param_index {
my ($paramName, $val) = (@_);
return undef if ($::param_type{$paramName} !~ /^m|s$/);
my $paramList = $::param_default{$paramName}->[0];
for (my $ndx = 0; $ndx < scalar(@{$paramList}); $ndx++) {
## The first element of the $param_default array in selects is the
## list of possible params; search through this array for a match.
return $ndx if ($val eq $paramList->[$ndx]);
}
return undef;
}
sub check_multi {
my ($value, $param) = (@_);
if ($::param_type{$param} eq "s") {
if (check_numeric($value) ne "") {
return "List param types must be digits";
}
elsif ($value < 0 || $value > $#{$::param_default{$param}->[0]}) {
return "Invalid choice for single-select list param '$param'";
}
else {
return "";
}
}
elsif ($::param_type{$param} eq "m") {
foreach my $chkParam (@{$::MFORM{$param}}) {
if (check_numeric($chkParam) ne "") {
return "List param types must be digits";
}
elsif ($chkParam < 0 || $chkParam >
$#{$::param_default{$param}->[0]}) {
return "Invalid choice for multi-select list param '$param'";
}
}
return "";
}
else {
return "Invalid param type for check_multi(); contact your BZ admin";
}
}
sub check_numeric { sub check_numeric {
my ($value) = (@_); my ($value) = (@_);
...@@ -119,6 +197,33 @@ sub check_shadowdb { ...@@ -119,6 +197,33 @@ sub check_shadowdb {
# t -- A short text entry field (suitable for a single line) # t -- A short text entry field (suitable for a single line)
# l -- A long text field (suitable for many lines) # l -- A long text field (suitable for many lines)
# b -- A boolean value (either 1 or 0) # b -- A boolean value (either 1 or 0)
# m -- A list of values, with many selectable (shows up as a select box)
# To specify the list of values, make the 'default value' for DefParam()
# a reference to two anonymous arrays, the first being the list of options
# and the second being a list of defaults (which must appear in the
# first anonymous array), i.e.:
# DefParam("multiselect", "A list of options, choose many",
# "m", [ ['a','b','c','d'], ['a', 'd'] ], \&check_multi);
#
# Here, 'a' and 'd' are the default options, and the user may pick any
# combination of a, b, c, and d as valid options.
#
# &check_multi should always be used as the param verification function
# for list (single and multiple) parameter types.
#
# s -- A list of values, with one selectable (shows up as a select box)
# To specify the list of values, make the default value a reference to
# an anonymous array with two items inside of it, the first being an
# array of the possible values and the second being the scalar that is
# the default default value, i.e.:
# DefParam("singleselect", "A list of options, choose one", "s",
# [ ['a','b','c'], 'b'], \&check_multi);
#
# Here, 'b' is the default option, and 'a' and 'c' are other possible
# options, but only one at a time!
#
# &check_multi should always be used as the param verification function
# for list (single and multiple) parameter types.
DefParam("maintainer", DefParam("maintainer",
"The email address of the person who maintains this installation of Bugzilla.", "The email address of the person who maintains this installation of Bugzilla.",
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
# Rights Reserved. # Rights Reserved.
# #
# Contributor(s): Terry Weissman <terry@mozilla.org> # Contributor(s): Terry Weissman <terry@mozilla.org>
# J. Paul Reed <preed@sigkill.com>
use diagnostics; use diagnostics;
use strict; use strict;
...@@ -51,14 +52,30 @@ PutHeader("Saving new parameters"); ...@@ -51,14 +52,30 @@ PutHeader("Saving new parameters");
foreach my $i (@::param_list) { foreach my $i (@::param_list) {
# print "Processing $i...<BR>\n"; # print "Processing $i...<BR>\n";
if (exists $::FORM{"reset-$i"}) { if (exists $::FORM{"reset-$i"}) {
if ($::param_type{$i} eq "s") {
my $index = get_select_param_index($i, $::param_default{$i}->[1]);
die "Param not found for '$i'" if ($index eq undef);
$::FORM{$i} = $index;
}
elsif ($::param_type{$i} eq "m") {
# For 'multi' selects, default is the 2nd anon array of the default
@{$::MFORM{$i}} = ();
foreach my $defaultPrm (@{$::param_default{$i}->[1]}) {
my $index = get_select_param_index($i, $defaultPrm);
die "Param not found for '$i'" if ($index eq undef);
push(@{$::MFORM{$i}}, $index);
}
}
else {
$::FORM{$i} = $::param_default{$i}; $::FORM{$i} = $::param_default{$i};
} }
}
$::FORM{$i} =~ s/\r\n?/\n/g; # Get rid of windows/mac-style line endings. $::FORM{$i} =~ s/\r\n?/\n/g; # Get rid of windows/mac-style line endings.
$::FORM{$i} =~ s/^\n$//; # assume single linefeed is an empty string $::FORM{$i} =~ s/^\n$//; # assume single linefeed is an empty string
if ($::FORM{$i} ne Param($i)) { if ($::FORM{$i} ne Param($i)) {
if (defined $::param_checker{$i}) { if (defined $::param_checker{$i}) {
my $ref = $::param_checker{$i}; my $ref = $::param_checker{$i};
my $ok = &$ref($::FORM{$i}); my $ok = &$ref($::FORM{$i}, $i);
if ($ok ne "") { if ($ok ne "") {
print "New value for $i is invalid: $ok<p>\n"; print "New value for $i is invalid: $ok<p>\n";
print "Please hit <b>Back</b> and try again.\n"; print "Please hit <b>Back</b> and try again.\n";
...@@ -69,8 +86,23 @@ foreach my $i (@::param_list) { ...@@ -69,8 +86,23 @@ foreach my $i (@::param_list) {
print "Changed $i.<br>\n"; print "Changed $i.<br>\n";
# print "Old: '" . url_quote(Param($i)) . "'<BR>\n"; # print "Old: '" . url_quote(Param($i)) . "'<BR>\n";
# print "New: '" . url_quote($::FORM{$i}) . "'<BR>\n"; # print "New: '" . url_quote($::FORM{$i}) . "'<BR>\n";
if ($::param_type{$i} eq "s") {
$::param{$i} = $::param_default{$i}->[0]->[$::FORM{$i}];
}
elsif ($::param_type{$i} eq "m") {
my $multiParamStr = "[ ";
foreach my $chosenParam (@{$::MFORM{$i}}) {
$multiParamStr .=
"'$::param_default{$i}->[0]->[$chosenParam]', ";
}
$multiParamStr .= " ]";
$::param{$i} = $multiParamStr;
}
else {
$::param{$i} = $::FORM{$i}; $::param{$i} = $::FORM{$i};
} }
}
} }
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
# Rights Reserved. # Rights Reserved.
# #
# Contributor(s): Terry Weissman <terry@mozilla.org> # Contributor(s): Terry Weissman <terry@mozilla.org>
# J. Paul Reed <preed@sigkill.com>
use diagnostics; use diagnostics;
...@@ -30,7 +31,8 @@ require "defparams.pl"; ...@@ -30,7 +31,8 @@ require "defparams.pl";
# Shut up misguided -w warnings about "used only once": # Shut up misguided -w warnings about "used only once":
use vars @::param_desc, use vars @::param_desc,
@::param_list; @::param_list,
@::param_default;
ConnectToDatabase(); ConnectToDatabase();
confirm_login(); confirm_login();
...@@ -87,6 +89,48 @@ foreach my $i (@::param_list) { ...@@ -87,6 +89,48 @@ foreach my $i (@::param_list) {
print "<input type=radio name=$i value=0 $off>Off\n"; print "<input type=radio name=$i value=0 $off>Off\n";
last SWITCH; last SWITCH;
}; };
/^m$/ && do {
my $optList = $::param_default{$i}->[0]; #'cause we use it so much
## showing 5 options seems like a nice round number; this should
## probably be configurable; if you care, file a bug ;-)
my $boxSize = scalar(@{$optList}) < 5 ? scalar(@{$optList}) : 5;
print "<select multiple size=\"$boxSize\" name=\"$i\">\n";
for (my $optNum = 0; $optNum < scalar(@{$optList}); $optNum++) {
my $selected = "";
foreach my $selectedVal (@{$value}) {
if ($selectedVal eq $optList->[$optNum]) {
$selected = "selected";
last;
}
}
print "<option $selected value=\"$optNum\">" .
"$optList->[$optNum]</option>\n";
}
print "</select>\n";
last SWITCH;
};
/^s$/ && do {
print "<select name=\"$i\">\n";
#'cause we use it so much below
my $optList = $::param_default{$i}->[0];
for (my $optNum = 0; $optNum < scalar(@{$optList}); $optNum++) {
my $selected = "";
if ($value eq $optList->[$optNum]) {
$selected = "selected";
}
print "<option $selected value=\"$optNum\">" .
"$optList->[$optNum]</option>\n";
}
print "</select>\n";
last SWITCH;
};
# DEFAULT # DEFAULT
print "<font color=red><blink>Unknown param type $::param_type{$i}!!!</blink></font>\n"; print "<font color=red><blink>Unknown param type $::param_type{$i}!!!</blink></font>\n";
} }
......
...@@ -1413,36 +1413,40 @@ sub RemoveVotes { ...@@ -1413,36 +1413,40 @@ sub RemoveVotes {
} }
} }
sub Param ($) { sub Param ($) {
my ($value) = (@_); my ($value) = (@_);
if (defined $::param{$value}) { if (! defined $::param{$value}) {
return $::param{$value};
}
# Um, maybe we haven't sourced in the params at all yet. # Um, maybe we haven't sourced in the params at all yet.
if (stat("data/params")) { if (stat("data/params")) {
# Write down and restore the version # here. That way, we get around # Write down and restore the version # here. That way, we get
# anyone who maliciously tries to tweak the version number by editing # around anyone who maliciously tries to tweak the version number
# the params file. Not to mention that in 2.0, there was a bug that # by editing the params file. Not to mention that in 2.0, there
# wrote the version number out to the params file... # was a bug that wrote the version number out to the params file...
my $v = $::param{'version'}; my $v = $::param{'version'};
require "data/params"; require "data/params";
$::param{'version'} = $v; $::param{'version'} = $v;
} }
if (defined $::param{$value}) {
return $::param{$value};
} }
if (! defined $::param{$value}) {
# Well, that didn't help. Maybe it's a new param, and the user # Well, that didn't help. Maybe it's a new param, and the user
# hasn't defined anything for it. Try and load a default value # hasn't defined anything for it. Try and load a default value
# for it. # for it.
require "defparams.pl"; require "defparams.pl";
WriteParams(); WriteParams();
if (defined $::param{$value}) { }
# If it's still not defined, we're pimped.
die "Can't find param named $value" if (! defined $::param{$value});
if ($::param_type{$value} eq "m") {
my $valueList = eval($::param{$value});
return $valueList if (!($@) && ref($valueList) eq "ARRAY");
die "Multi-list param '$value' eval() failure ('$@'); data/params is horked";
}
else {
return $::param{$value}; return $::param{$value};
} }
# We're pimped.
die "Can't find param named $value";
} }
# Take two comma or space separated strings and return what # Take two comma or space separated strings and return what
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment