Left-right selector for group members
authorJamie Cameron <jcameron@webmin.com>
Fri, 15 Aug 2008 23:06:01 +0000 (23:06 +0000)
committerJamie Cameron <jcameron@webmin.com>
Fri, 15 Aug 2008 23:06:01 +0000 (23:06 +0000)
ui-lib.pl
useradmin/edit_group.cgi
useradmin/lang/en
useradmin/save_group.cgi

index 017657c..7531036 100644 (file)
--- a/ui-lib.pl
+++ b/ui-lib.pl
@@ -545,14 +545,18 @@ $rv .= "</select>\n";
 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 ];
@@ -560,21 +564,75 @@ if ($missing) {
        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
index 4ea54c0..4c2d180 100755 (executable)
@@ -33,90 +33,33 @@ print &ui_table_row(&hlink($text{'gedit_group'}, "ggroup"),
                 : "<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"),
@@ -128,17 +71,20 @@ 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) {
index b254cae..f8b3efa 100644 (file)
@@ -185,6 +185,8 @@ gedit_cothers=Create group in other modules?
 gedit_mothers=Modify group in other modules?
 gedit_gid_calc=Calculated
 gedit_gid_def=Automatic
+gedit_allu=All users
+gedit_selu=Users in group
 
 gsave_err=Failed to save group
 gsave_eedit=You cannot edit this group
index 42e24bd..4fa9360 100755 (executable)
@@ -94,7 +94,7 @@ elsif ( $in{'gid_def'} eq '2' ) {
                }
        }
 
-@mems = &split_quoted_string($in{members});
+@mems = split(/\r?\n/, $in{'members'});
 $group{'members'} = join(',', @mems);
 $group{'gid'} = $in{'gid'};