return $rv;
}
-# ui_multi_select(name, &values, &options, size, [add-if-missing], [disabled?])
+# ui_multi_select(name, &values, &options, size, [add-if-missing], [disabled?],
+# [options-title, values-title], [width])
# Returns HTML for selecting many of many from a list. By default, this is
# implemented using two <select> lists and Javascript buttons to move elements
-# between them.
+# between them. The resulting input value is \n separated.
+# XXX IE testing
+# XXX mobile theme
sub ui_multi_select
{
return &theme_ui_multi_select(@_) if (defined(&theme_ui_multi_select));
-local ($name, $values, $opts, $size, $missing, $dis) = @_;
+local ($name, $values, $opts, $size, $missing, $dis,
+ $opts_title, $vals_title, $width) = @_;
local $rv;
local %already = map { $_->[0], $_ } @$values;
local $leftover = [ grep { !$already{$_->[0]} } @$opts ];
local %optsalready = map { $_->[0], $_ } @$opts;
push(@$opts, grep { !$optsalready{$_->[0]} } @$values);
}
+if (!defined($width)) {
+ $width = "200";
+ }
+local $wstyle = $width ? "style='width:$width'" : "";
-# XXX javascript?
-$rv .= "<table cellpadding=0 cellspacing=0><tr>";
+if (!$main::ui_multi_select_donejs++) {
+ $rv .= &ui_multi_select_javascript();
+ }
+$rv .= "<table cellpadding=0 cellspacing=0 class='ui_multi_select'>";
+if (defined($opts_title)) {
+ $rv .= "<tr class='ui_multi_select_heads'> ".
+ "<td><b>$opts_title</b></td> ".
+ "<td></td> <td><b>$vals_title</b></td> </tr>";
+ }
+$rv .= "<tr class='ui_multi_select_row'>";
$rv .= "<td>".&ui_select($name."_opts", [ ], $leftover,
- $size, 1, 0, $dis)."</td>\n";
+ $size, 0, 0, $dis, $wstyle)."</td>\n";
$rv .= "<td>".&ui_button("->", undef, $dis,
- "onClick='multi_select_add(\"$name\")'")."<br>".
+ "onClick='multi_select_move(\"$name\", form, 1)'")."<br>".
&ui_button("<-", undef, $dis,
- "onClick='multi_select_remove(\"$name\")'")."</td>\n";
-$rv .= "<td>".&ui_select($name, [ ], $values,
- $size, 1, 0, $dis)."</td>\n";
+ "onClick='multi_select_move(\"$name\", form, 0)'")."</td>\n";
+$rv .= "<td>".&ui_select($name."_vals", [ ], $values,
+ $size, 0, 0, $dis, $wstyle)."</td>\n";
$rv .= "</tr></table>\n";
+$rv .= &ui_hidden($name, join("\n", map { $_->[0] } @$values));
return $rv;
}
+# ui_multi_select_javascript()
+# Returns <script> section for left/right select boxes
+sub ui_multi_select_javascript
+{
+return &theme_ui_multiselect_javascript()
+ if (defined(&theme_ui_multiselect_javascript));
+return <<EOF;
+<script>
+// Move an element from the options list to the values list, or vice-versa
+function multi_select_move(name, f, dir)
+{
+var opts = f.elements[name+"_opts"];
+var vals = f.elements[name+"_vals"];
+var opts_idx = opts.selectedIndex;
+var vals_idx = vals.selectedIndex;
+if (dir == 1 && opts_idx >= 0) {
+ // Moving from options to selected list
+ var o = opts.options[opts_idx];
+ vals.options[vals.options.length] = o;
+ opts.remove(opts_idx);
+ }
+else if (dir == 0 && vals_idx >= 0) {
+ // Moving the other way
+ var o = vals.options[vals_idx];
+ opts.options[opts.options.length] = o;
+ vals.remove(vals_idx);
+ }
+// Fill in hidden field
+var hid = f.elements[name];
+if (hid) {
+ var hv = new Array();
+ for(var i=0; i<vals.options.length; i++) {
+ hv.push(vals.options[i].value);
+ }
+ hid.value = hv.join("\\n");
+ }
+}
+</script>
+EOF
+}
+
# ui_radio(name, value, &options, [disabled?])
# Returns HTML for a series of radio buttons
sub ui_radio
: "<tt>$group{'group'}</tt>");
# Group ID
-# XXX massively simplify!!
-print "<td valign=middle>",&hlink("<b>$text{'gedit_gid'}</b>","ggid"),"</td>\n";
-if ($n eq "") {
- print "<td>\n";
- $defgid = &allocate_gid(\%gused);
-
- if ( $access{'calcgid'} && $access{'autogid'} && $access{'usergid'} ) {
- # Show options for calculated, auto-incremented and user entered GID
- printf "<input type=radio name=gid_def value=1 %s> %s\n",
- $config{'gid_mode'} eq '1' ? "checked" : "",
- $text{'gedit_gid_def'};
- printf "<input type=radio name=gid_def value=2 %s> %s\n",
- $config{'gid_mode'} eq '2' ? "checked" : "",
- $text{'gedit_gid_calc'};
- printf "<input type=radio name=gid_def value=0 %s> %s\n",
- $config{'gid_mode'} eq '0' ? "checked" : "",
- "<input name=gid size=10 value='$defgid'>";
- }
-
- if ( $access{'calcgid'} && $access{'autogid'} && !$access{'usergid'} ) {
- # Show options for calculated and auto-incremented GID
- printf "<input type=radio name=gid_def value=1 %s> %s\n",
- $config{'gid_mode'} eq '1' ? "checked" : "",
- $text{'gedit_gid_def'};
- printf "<input type=radio name=gid_def value=2 %s> %s\n",
- $config{'gid_mode'} eq '2' ? "checked" : "",
- $text{'gedit_gid_calc'};
- }
-
- if ( $access{'calcgid'} && !$access{'autogid'} && $access{'usergid'} ) {
- # Show options for calculated and user entered GID
- printf "<input type=radio name=gid_def value=2 %s> %s\n",
- $config{'gid_mode'} eq '2' ? "checked" : "",
- $text{'gedit_gid_calc'};
- printf "<input type=radio name=gid_def value=0 %s> %s\n",
- $config{'gid_mode'} eq '0' ? "checked" : "",
- "<input name=gid size=10 value='$defgid'>";
- }
-
- if ( !$access{'calcgid'} && $access{'autogid'} && $access{'usergid'} ) {
- # Show options for auto-incremented and user entered GID
- printf "<input type=radio name=gid_def value=1 %s> %s\n",
- $config{'gid_mode'} eq '1' ? "checked" : "",
- $text{'gedit_gid_def'};
- printf "<input type=radio name=gid_def value=0 %s> %s\n",
- $config{'gid_mode'} eq '0' ? "checked" : "",
- "<input name=gid size=10 value='$defgid'>";
- }
-
- if ( $access{'calcgid'} && !$access{'autogid'} && !$access{'usergid'} ) {
- # Hidden field for calculated GID
- print "<input type=hidden name=gid_def value=2>";
- print "$text{'gedit_gid_calc'} from Berkeley style cksum\n";
- }
-
- if ( !$access{'calcgid'} && $access{'autogid'} && !$access{'usergid'} ) {
- # Hidden field for auto-incremented GID
- print "<input type=hidden name=gid_def value=1>";
- print "$text{'gedit_gid_calc'}\n";
- }
-
- if ( !$access{'calcgid'} && !$access{'autogid'} && $access{'usergid'} ) {
- # Show field for user entered GID
- print "<input type=hidden name=gid_def value=0>";
- print "GID: <input name=gid size=10 value='$defgid'>\n";
- }
-
- if ( !$access{'calcgid'} && !$access{'autogid'} && !$access{'usergid'} ) {
- if ( $config{'gid_mode'} eq '0' ) {
- print "<input type=hidden name=gid_def value=0>";
- print "GID: <input name=gid size=10 value='$defgid'>\n";
- } else {
- print "<input type=hidden name=gid_def value=$config{'gid_mode'}>";
- print "$text{'gedit_gid_def'}\n" if ( $config{'gid_mode'} eq '1' );
- print "$text{'gedit_gid_calc'}\n" if ( $config{'gid_mode'} eq '2' );
- }
- }
- print "</td></tr>\n";
+if ($n ne "") {
+ # Existing group, just show field to edit
+ $gidfield = &ui_textbox("gid", $group{'gid'}, 10);
}
else {
- print "<td valign=top><input name=gid size=10 ",
- "value=\"$group{'gid'}\"></td>\n";
+ # Work out which GID modes are available
+ @gidmodes = ( );
+ $defgid = &allocate_gid(\%gused);
+ if ($access{'autogid'}) {
+ push(@gidmodes, [ 1, $text{'gedit_gid_def'} ]);
+ }
+ if ($access{'calcgid'}) {
+ push(@gidmodes, [ 2, $text{'gedit_gid_calc'} ]);
+ }
+ if ($access{'usergid'}) {
+ push(@gidmodes, [ 0, &ui_textbox("gid", $defgid, 10) ]);
+ }
+ if (@gidmodes == 1) {
+ $gidfield = &ui_hidden("gid_def", $gidmodes[0]->[0]).
+ $gidmodes[0]->[1];
+ }
+ else {
+ $gidfield = &ui_radio("gid_def", $config{'gid_mode'},
+ \@gidmodes);
+ }
}
-print "</tr>\n";
+print &ui_table_row(&hlink($text{'gedit_gid'}, "ggid"), $gidfield);
# Group password (rarely used, but..)
print &ui_table_row(&hlink($text{'pass'}, "gpasswd"),
&ui_textbox("pass", undef, 15) ] ]));
# Member chooser
-# XXX doesn't work yet!
print &ui_table_row(&hlink($text{'gedit_members'}, "gmembers"),
&ui_multi_select("members",
[ map { [ $_, $_ ] } split(/,/ , $group{'members'}) ],
[ map { [ $_->{'user'}, $_->{'user'} ] } @ulist ],
- 10, 1));
+ 10, 1, 0,
+ $text{'gedit_allu'}, $text{'gedit_selu'}, 150));
+
+print &ui_table_end();
# Section for on-change and on-create events
if ($n ne "") {
if ($access{'chgid'} == 1 || $access{'mothers'} == 1) {
- print &ui_table_start($text{'onsave'}, "width=100%", 2);
+ print &ui_table_start($text{'onsave'}, "width=100%", 2,
+ [ "width=30%" ]);
# Change file GIDs on save
if ($access{'chgid'} == 1) {