Files
webmin/gray-theme/gray-theme-lib.pl
Ilia Ross cbe1f7f17e Add single page layout to Framed Theme
This PR adds a "Page layout" setting to the Framed Theme, with a new single page layout that shows the menu on every page instead of in a frame.

It's meant for people who can't or don't want to use frames, so the Legacy Theme is no longer the only option without frames.

The menu code moved out of `left.cgi` into a shared menu-lib.pl, so both layouts build the same menu, frames look the same as before, and `left.cgi` shrinks from about 400 lines to about 60.

The menu's module search box now follows the global "webminsearch" permission, which the old frame code never actually checked.

One exception to be aware of. A server opened through Webmin Servers Index always uses frames, because that index only rewrites the links and redirects of framed pages.
2026-10-01 05:44:49 +02:00

182 lines
4.5 KiB
Perl
Executable File

# Functions used by theme CGIs
eval "use WebminCore;";
if ($@) {
do '../web-lib.pl';
do '../ui-lib.pl';
}
&init_config();
&load_theme_library();
%text = &load_language($current_theme);
$right_frame_sections_file = "$config_directory/$current_theme/sections";
$default_domains_to_show = 10;
# get_left_frame_width()
# Returns the width of the left frame in pixels, the same as the width of
# the menu in the single page layout
sub get_left_frame_width
{
return &theme_menu_width();
}
# list_virtualmin_theme_overlays()
# Returns a list of overlay themes suitable for this theme
sub list_virtualmin_theme_overlays
{
&foreign_require("webmin", "webmin-lib.pl");
local @rv;
foreach my $tinfo (&webmin::list_themes()) {
if ($tinfo->{'overlay'} &&
(!$tinfo->{'overlays'} ||
&indexof($current_theme,
split(/\s+/, $tinfo->{'overlays'})) >= 0)) {
push(@rv, $tinfo);
}
}
return @rv;
}
sub get_virtualmin_docs
{
local ($level) = @_;
return $level == 0 ? "http://www.virtualmin.com/documentation" :
$level == 1 ? "http://www.virtualmin.com/documentation/users/reseller" :
$level == 2 ? "http://www.virtualmin.com/documentation/users/server-owner" :
"http://www.virtualmin.com/documentation";
}
sub get_vm2_docs
{
local ($level) = @_;
return "http://www.virtualmin.com/documentation/cloudmin";
}
# get_right_frame_sections()
# Returns a hash containg details of visible right-frame sections
sub get_right_frame_sections
{
local %sects;
&read_file($right_frame_sections_file, \%sects);
if ($sects{'global'}) {
# Force use of global settings
return \%sects;
}
else {
# Can try personal settings, but fall back to global
local %usersects;
if (&read_file($right_frame_sections_file.".".$remote_user,
\%usersects)) {
return \%usersects;
}
else {
return \%sects;
}
}
}
# save_right_frame_sections(&sects)
sub save_right_frame_sections
{
local ($sects) = @_;
&make_dir("$config_directory/$current_theme", 0700);
if ($sects->{'global'}) {
# Update global settings, for all users
&write_file($right_frame_sections_file, $sects);
}
else {
# Save own, and turn off global flag (if this is the master admin)
if (&foreign_check("virtual-server")) {
&foreign_require("virtual-server", "virtual-server-lib.pl");
if (&virtual_server::master_admin()) {
local %globalsect;
&read_file($right_frame_sections_file, \%globalsect);
$globalsect{'global'} = 0;
&write_file($right_frame_sections_file, \%globalsect);
}
}
&write_file($right_frame_sections_file.".".$remote_user, $sects);
}
}
# list_right_frame_sections()
# Returns a list of possible sections for the current user, as hash refs
sub list_right_frame_sections
{
local ($hasvirt, $level, $hasvm2) = &get_virtualmin_user_level();
local @rv;
if ($level == 0) {
# Master admin
if ($hasvirt) {
push(@rv, 'updates', 'status', 'newfeatures',
'quotas', 'bw', 'ips', 'sysinfo');
}
if ($hasvm2) {
push(@rv, 'vm2servers');
}
}
elsif ($level == 2) {
# Domain owner
push(@rv, 'virtualmin');
}
elsif ($level == 1) {
# Reseller
push(@rv, 'reseller', 'quotas', 'bw');
}
elsif ($level == 4) {
# Cloudmin system owner
push(@rv, 'owner', 'vm2servers');
}
else {
# Usermin
push(@rv, 'system');
}
@rv = map { { 'name' => $_,
'title' => $virtual_server::text{'right_'.$_.'header'} } } @rv;
# Add plugin-defined sections
if (($level == 0 || $level == 1 || $level == 2) && $hasvirt &&
defined(&virtual_server::list_plugin_sections)) {
push(@rv, &virtual_server::list_plugin_sections($level));
}
if (($level == 0 || $level == 4) && $hasvm2 &&
defined(&server_manager::list_plugin_sections)) {
push(@rv, &server_manager::list_plugin_sections($level));
}
return @rv;
}
# get_virtualmin_user_level()
# Returns three numbers - the first being a flag if virtualmin is installed,
# the second a user type (3=usermin, 2=domain, 1=reseller, 0=master, 4=system
# owner), the third a flag for Cloudmin
sub get_virtualmin_user_level
{
local ($hasvirt, $hasvm2, $level);
$hasvm2 = &foreign_available("server-manager");
$hasvirt = &foreign_available("virtual-server");
if ($hasvm2) {
&foreign_require("server-manager", "server-manager-lib.pl");
}
if ($hasvirt) {
&foreign_require("virtual-server", "virtual-server-lib.pl");
}
if ($hasvm2) {
$level = $server_manager::access{'owner'} ? 4 : 0;
}
elsif ($hasvirt) {
$level = &virtual_server::master_admin() ? 0 :
&virtual_server::reseller_admin() ? 1 : 2;
}
elsif (&get_product_name() eq "usermin") {
$level = 3;
}
else {
$level = 0;
}
return ($hasvirt, $level, $hasvm2);
}
1;