Support changing of overlay globally
authorJamie Cameron <jcameron@webmin.com>
Wed, 17 Dec 2008 23:44:05 +0000 (23:44 +0000)
committerJamie Cameron <jcameron@webmin.com>
Wed, 17 Dec 2008 23:44:05 +0000 (23:44 +0000)
ui-lib.pl
webmin/change_overlay.cgi [new file with mode: 0755]
webmin/change_theme.cgi
webmin/edit_themes.cgi
webmin/lang/en

index 1879507..8fe7f12 100644 (file)
--- a/ui-lib.pl
+++ b/ui-lib.pl
@@ -1669,15 +1669,15 @@ foreach $f (@{$_[2]}) {
 return $_[3] ? "$_[3]='$rv'" : $rv;
 }
 
-# js_redirect(url)
+# js_redirect(url, [window-object])
 # Returns HTML to trigger a redirect to some URL
 sub js_redirect
 {
-my ($url) = @_;
+my ($url, $window) = @_;
 if (defined(&theme_js_redirect)) {
        return &theme_js_redirect(@_);
        }
-return "<script>window.location = '".&quote_escape($url)."';</script>\n";
+return "<script>${window}.location = '".&quote_escape($url)."';</script>\n";
 }
 
 1;
diff --git a/webmin/change_overlay.cgi b/webmin/change_overlay.cgi
new file mode 100755 (executable)
index 0000000..a342d19
--- /dev/null
@@ -0,0 +1,45 @@
+#!/usr/local/bin/perl
+# Change the current webmin theme overlay
+
+require './webmin-lib.pl';
+&ReadParse();
+&error_setup($text{'themes_err4'});
+
+# Get the overlay and make sure it is compatible
+($gtheme) = split(/\s+/, $gconfig{'theme'});
+if ($in{'overlay'}) {
+       %oinfo = &get_theme_info($in{'overlay'});
+       if ($oinfo{'overlay'} &&
+           &indexof($gtheme, split(/\s+/, $oinfo{'overlay'})) < 0) {
+               &error($text{'themes_eoverlay'});
+               }
+       }
+
+&lock_file("$config_directory/config");
+if ($in{'overlay'}) {
+       $gconfig{'theme'} = join(" ", $gtheme, $in{'overlay'});
+       }
+else {
+       $gconfig{'theme'} = $gtheme;
+       }
+&write_file("$config_directory/config", \%gconfig);
+&unlock_file("$config_directory/config");
+
+&lock_file($ENV{'MINISERV_CONFIG'});
+&get_miniserv_config(\%miniserv);
+if ($in{'overlay'}) {
+       $miniserv{'preroot'} = join(" ", $gtheme, $in{'overlay'});
+       }
+else {
+       $miniserv{'preroot'} = $gtheme;
+       }
+&put_miniserv_config(\%miniserv);
+&unlock_file($ENV{'MINISERV_CONFIG'});
+&reload_miniserv();
+
+&webmin_log('theme', undef, undef, \%in);
+&ui_print_header(undef, $text{'themes_title'}, "");
+print "$text{'themes_ok2'}<p>\n";
+print &js_redirect("/", "top");
+&ui_print_footer("", $text{'index_return'});
+
index 8deb5e1..dc6c770 100755 (executable)
@@ -6,14 +6,20 @@ require './webmin-lib.pl';
 &ReadParse();
 
 &lock_file("$config_directory/config");
-$gconfig{'theme'} = $in{'theme'};
+($gtheme, @others) = split(/\s+/, $gconfig{'theme'});
+if ($in{'theme'}) {
+       $gconfig{'theme'} = join(" ", $in{'theme'}, @others);
+       }
+else {
+       delete($gconfig{'theme'});
+       }
 &write_file("$config_directory/config", \%gconfig);
 &unlock_file("$config_directory/config");
 
 &lock_file($ENV{'MINISERV_CONFIG'});
 &get_miniserv_config(\%miniserv);
 if ($in{'theme'}) {
-       $miniserv{'preroot'} = $in{'theme'};
+       $miniserv{'preroot'} = join(" ", $in{'theme'}, @others);
        }
 else {
        delete($miniserv{'preroot'});
@@ -24,9 +30,7 @@ else {
 
 &webmin_log('theme', undef, undef, \%in);
 &ui_print_header(undef, $text{'themes_title'}, "");
-print "<script>\n";
-print "top.location = \"/\";\n";
-print "</script>\n";
-print "<p>$text{'themes_ok'}<p>\n";
+print "$text{'themes_ok'}<p>\n";
+print &js_redirect("/", "top");
 &ui_print_footer("", $text{'index_return'});
 
index 8cec30f..ce32d8b 100755 (executable)
@@ -6,74 +6,103 @@ require './webmin-lib.pl';
 &ReadParse();
 &ui_print_header(undef, $text{'themes_title'}, "");
 
-# Display change form
-@themes = &list_themes();
+@all = &list_themes();
+@themes = grep { !$_->{'overlay'} } @all;
+@overlays = grep { $_->{'overlay'} } @all;
+$prog = "edit_themes.cgi?mode=";
+($gtheme, $goverlay) = split(/\s+/, $gconfig{'theme'});
+
+# Start tabs
 if (@themes) {
-       print "$text{'themes_desc'}<br>\n";
-       print "<form action=change_theme.cgi>\n";
-       print "<b>$text{'themes_sel'}</b> <select name=theme>\n";
-       foreach $t ( { 'desc' => $text{'themes_default'} },
-                    &list_themes() ) {
-               printf "<option value='%s' %s>%s\n",
-                       $t->{'dir'},
-                       $gconfig{'theme'} eq $t->{'dir'} ? 'selected' : '',
-                       $t->{'desc'};
-               }
-       print "</select>\n";
-       print "<input type=submit value='$text{'themes_change'}'></form>\n";
+       @tabs = ( [ "change", $text{'themes_tabchange'}, $prog."change" ] );
+       }
+if (@overlays) {
+       push(@tabs, [ "overlay", $text{'themes_taboverlay'}, $prog."overlay" ]);
+       }
+if (!&shared_root_directory()) {
+       push(@tabs, [ "install", $text{'themes_tabinstall'}, $prog."install" ]);
+       }
+if (!&shared_root_directory() && @all) {
+       push(@tabs, [ "delete", $text{'themes_tabdelete'}, $prog."delete" ]);
+       }
+if (@themes || @overlays) {
+       push(@tabs, [ "export", $text{'themes_tabexport'}, $prog."export" ] );
+       }
+print &ui_tabs_start(\@tabs, "mode", $in{'mode'} || $tabs[0]->[0], 1);
+
+# Display theme change form
+if (@themes) {
+       print &ui_tabs_start_tab("mode", "change");
+       print "$text{'themes_desc'}<p>\n";
+       print &ui_form_start("change_theme.cgi");
+       print "<b>$text{'themes_sel'}</b>\n";
+       print &ui_select("theme", $gtheme,
+               [ [ '', $text{'themes_default'} ],
+                 map { [ $_->{'dir'}, $_->{'desc'} ] } @themes ]),"<p>\n";
+       print &ui_form_end([ [ undef, $text{'themes_change'} ] ]);
+       print &ui_tabs_end_tab("mode", "change");
+       }
+
+# Display overlay change form
+if (@overlays && $gtheme) {
+       print &ui_tabs_start_tab("mode", "overlay");
+       print "$text{'themes_overdesc'}<p>\n";
+       print &ui_form_start("change_overlay.cgi");
+       print "<b>$text{'themes_overlay'}</b>\n";
+       print &ui_select("overlay", $goverlay,
+               [ [ '', $text{'themes_none'} ],
+                 map { [ $_->{'dir'}, $_->{'desc'} ] } @overlays ]),"<br>\n";
+       print &ui_form_end([ [ undef, $text{'themes_change'} ] ]);
+       print &ui_tabs_end_tab("mode", "overlay");
        }
 
 if (!&shared_root_directory()) {
        # Display install form
-       print &ui_hr();
-       print "$text{'themes_installdesc'}<br>\n";
-       print "<form action=install_theme.cgi method=post enctype=multipart/form-data>\n";
-       print "<input type=radio name=source value=0 checked> $text{'mods_local'}\n";
-       print "<input name=file size=40>\n";
-       print &file_chooser_button("file", 0, 1),"<br>\n";
-       print "<input type=radio name=source value=1> $text{'mods_uploaded'}\n";
-       print "<input name=upload type=file size=30><br>\n";
-       print "<input type=radio name=source value=2> $text{'mods_ftp'}\n";
-       print "<input name=url size=40><br>\n";
-       print "<input type=submit value=\"$text{'themes_installok'}\"></form>\n";
+       print &ui_tabs_start_tab("mode", "install");
+       print "$text{'themes_installdesc'}<p>\n";
+       print &ui_form_start("install_theme.cgi", "form-data");
+       print &ui_radio_table("source", 0,
+               [ [ 0, $text{'mods_local'}, &ui_filebox("file", undef ,40) ],
+                 [ 1, $text{'mods_uploaded'}, &ui_upload("upload") ],
+                 [ 2, $text{'mods_ftp'}, &ui_textbox("url", undef, 40) ] ]);
+       print &ui_form_end([ [ undef, $text{'themes_installok'} ] ]);
+       print &ui_tabs_end_tab("mode", "install");
+       }
 
+if (!&shared_root_directory() && @all) {
        # Display deletion form
-       @themes = grep { $gconfig{'theme'} ne $_->{'dir'} } @themes;
-       if (@themes) {
-               print &ui_hr();
-               print "$text{'themes_delete'}<br>\n";
-               print "<form action=delete_mod.cgi>\n";
-               print "<b>$text{'themes_delok'}</b>\n";
-               print "<select name=mod>\n";
-               foreach $t (@themes) {
-                       printf "<option value=%s>%s\n",
-                               $t->{'dir'}, $t->{'desc'};
-                       }
-               print "</select>\n";
-               print "<input type=submit value='$text{'delete'}'></form>\n";
-               }
+       print &ui_tabs_start_tab("mode", "delete");
+       print "$text{'themes_delete'}<p>\n";
+       print &ui_form_start("delete_mod.cgi");
+       print "<b>$text{'themes_delok'}</b>\n";
+       print &ui_select("mod", undef,
+               [ map { [ $_->{'dir'}, $_->{'desc'} ] } @all ]),"<br>\n";
+       print &ui_form_end([ [ undef, $text{'delete'} ] ]);
+       print &ui_tabs_end_tab("mode", "delete");
        }
 
 # Display export form
-print &ui_hr();
+print &ui_tabs_start_tab("mode", "export");
 print "$text{'themes_desc4'}<p>\n";
 
 print &ui_form_start("export_mod.cgi/theme.wbt.gz");
-print "<table>\n";
+print &ui_table_start(undef, undef, 2);
 
-print "<tr> <td valign=top><b>$text{'themes_exportmods'}</b></td>\n";
-print "<td>",&ui_select("mod", undef,
-       [ map { [ $_->{'dir'}, $_->{'desc'} ] } @themes ], 5, 1),
-       "</td> </tr>\n";
+print &ui_table_row($text{'themes_exportmods'},
+       &ui_select("mod", undef,
+               [ map { [ $_->{'dir'}, $_->{'desc'} ] } @themes ], 5, 1));
 
-print "<tr> <td valign=top><b>$text{'mods_exportto'}</b></td>\n";
-print "<td>",&ui_radio("to", 0,
-       [ [ 0, $text{'mods_exportshow'}."<br>" ],
-         [ 1, &text('mods_exportfile',
-                    &ui_textbox("file", undef, 40)) ] ]),"</td> </tr>\n";
+print &ui_table_row($text{'mods_exportto'},
+       &ui_radio("to", 0,
+               [ [ 0, $text{'mods_exportshow'}."<br>" ],
+                 [ 1, &text('mods_exportfile',
+                            &ui_textbox("file", undef, 40)) ] ]));
 
-print "</table>\n";
+print &ui_table_end();
 print &ui_form_end([ [ "ok", $text{'themes_exportok'} ] ]);
+print &ui_tabs_end_tab("mode", "export");
+
+print &ui_tabs_end(1);
 
 &ui_print_footer("", $text{'index_return'});
 
index d8e58c3..b2c5e09 100644 (file)
@@ -602,12 +602,20 @@ log_clearcache=Cleared all URLs from cache
 log_lock=Changed file locking
 
 themes_title=Webmin Themes
-themes_desc=Themes control the appearance of the Webmin user interface, including icons, colours, backgrounds and possibly the layout of pages. The selection box below can be used to choose one of the themes installed on your system.
+themes_desc=Themes control the appearance of the Webmin user interface, including icons, colours, backgrounds and the layout of pages. The selection box below can be used to choose one of the themes installed on your system.
 themes_sel=Current theme :
 themes_default=Old Webmin theme
+themes_none=None - let theme decide
 themes_change=Change
+themes_overdesc=Overlays modify the appearance of a theme, by changing the colors, backgrounds and icons. They do not change the layout.
+themes_overlay=Current overlay :
 themes_installdesc=Use the form below to install a new Webmin theme on your system. Themes are typically distributed in <tt>.wbt</tt> files, but can also be installed from RPM files if supported by your operating system.
 themes_installok=Install Theme
+themes_tabchange=Change theme
+themes_taboverlay=Change overlay
+themes_tabinstall=Install theme
+themes_tabdelete=Delete themes
+themes_tabexport=Export themes
 
 themes_err1=Failed to install theme from $1
 themes_efile=File does not exist
@@ -628,9 +636,12 @@ themes_egzip2=Failed to gunzip file : $1
 themes_erpm=Not a Webmin theme RPM
 themes_eirpm=RPM install failed : $1
 themes_ok=Theme changed successfully .. redirecting to the Webmin index page.
+themes_ok2=Theme overlay changed successfully .. redirecting to the Webmin index page.
 themes_delete=This form can be used to delete one of the themes installed on your system that is not currently in use.
 themes_delok=Theme to delete :
 themes_return=themes list
+themes_err4=Failed to change overlay theme
+themes_eoverlay=Selected overlay is not compatible with the current global theme
 
 themes_desc4=Installed themes can be exported as a wbt.gz file using the form below. A theme file can then be installed onto another system running Webmin.
 themes_exportmods=Themes to export