[%#
#----------------------------------------------------------------------
# IMPORTANT:
#
# This template gets rendered via Cpanel/Template/Interactive.pm, which
# imposes significant limitations on Template Toolkit syntax. See that
# module’s documentation for more details.
#----------------------------------------------------------------------
'extrahtml', used when status is set to give HTML before the status
'header',
'icon',
'extrastyle',
'meta', hash or list of hashes
'scripts', list or single value
'stylesheets', list or single value
'theme', string for the set of application styles to be used, defaults to legacy
'unprotected', TODO -REMOVE should linked files be unprotected
'app_key", application key
'breadcrumbdata',
'breadcrumburl',
'skipbreadcrumb', hides only breadcrumbs
'skipsupport', hides only support tab
'skipheader' - hides only Header icon/text.
'include_legacy_stylesheets' - includes old stylesheets for YUI stuff
'base' - if defined, adds a <base href=""> tag to the header
'is_ng' - handles special cases for angular applications.
'hide_navigation' - supress the navigation
'hide_banner_ad' - supress the banner ad.
'url' - Relative links will prepend the session token and link within the product.
Absolute links with http:// or https:// prefixes will link to pages outside of
the product.
# Add some block injection options to get parity with capabilities from the Jupiter wrapper template
'meta_block' - a block of meta tags generated by the caller to merge into the head tag.
'link_block' - a block of link tags generated by the caller to merge into the head tag.
'js_first_block' - a block of javascript generated by the caller to merge into the head tag.
'js_block' - a block of javascript generated by the caller to merge into the body at the end of the document.
-%]
[%# This introduces a new line. We need a newline to start this template to avoid errors, cf. case 34446 %]
[%-
USE Whostmgr;
USE NVData;
USE VarCache;
USE UIAnalytics;
USE Verify;
DEFAULT app_key = 'home';
#Allows mainCommand features to display in left nav. To ensure that ACL init happens for all the pages that use _defheader so that Left navigation and ACL checks work.
IF !Whostmgr.acls_are_initialized;
SET acls_are_initialized = Whostmgr.init_acls();
END;
SET has_component_system = template_exists("/usr/local/cpanel/whostmgr/docroot/templates/master_templates/component.html.tt");
IF has_component_system;
USE Components;
END;
SET whm_variables = Whostmgr.template_vars;
SET plugins = Whostmgr.plugins_data;
SET show_reboot_banner = Whostmgr.check_flag('CPCONF=show_reboot_banner'),
needs_reboot_result = whm_variables.needs_reboot,
quota_broken = whm_variables.quota_broken,
has_root_privileges = Whostmgr.hasroot();
# If we’re logged in as administrator (root or root reseller) and
# haven’t accepted the current EULA or haven’t done initial setup,
# then WHM always requires those steps to be completed before use
# of the server. Note that, in the event of a EULA update, that means
# non-administrator resellers can use WHM while the admin cannot
# (until they accept the new EULA).
SET initial_setup_will_show = has_root_privileges && (!Whostmgr.get_initial_setup_status().has_completed_initial_setup || !Whostmgr.get_initial_setup_status().has_accepted_legal_agreements);
IF Whostmgr.has_license_flag('dev');
SET license_type = 'Developer';
ELSIF Whostmgr.has_license_flag('trial');
SET license_type = 'Trial';
ELSIF Whostmgr.is_test_build();
SET license_type = 'Test';
ELSE;
SET license_type = "Standard";
END;
SET app_list = Whostmgr.get_application_list();
# NOTE: Notifications came from topframe.tmpl
SET ckeditor_removal_notice_viewed = NVData.get('ckeditor_removal_notice', undef, 0, 'whm');
SET configserver_shutdown_notice_viewed = NVData.get('configserver_shutdown_notice', undef, 0, 'whm');
SET site_publisher_deprecation_notice_viewed = NVData.get('site_publisher_deprecation_notice', undef, 0, 'whm');
SET notifications = [
{
'type' => 'warning',
'api_check' => 0
'name' => 'update_blocked',
'text' => locale.maketext('The last attempt to update [asis,cPanel amp() WHM] was blocked.')
'title' => locale.maketext('Details'),
'isShown' => whm_variables.mysql_version_approaching_eol ? 1 : 0,
'url' => 'scripts/mysqlupgrade',
'id' => 'lnkUpdateMysql'
},
{
'type' => 'warning',
'api_check' => 0
'name' => 'mysql_eol_warning',
'text' => locale.maketext('[_1][comment,a software name] [_2][comment,a software version] will reach [asis,EOL] soon.', whm_variables.mysql_version_approaching_eol.display_name, whm_variables.mysql_version_approaching_eol.version)
'title' => locale.maketext('Upgrade Now'),
'isShown' => whm_variables.mysql_version_approaching_eol ? 1 : 0,
'url' => 'scripts/mysqlupgrade',
'id' => 'lnkUpdateMysql'
},
{
'type' => 'warning',
'api_check' => 0
'name' => 'reboot_quota',
'text' => locale.maketext('You must reboot your server to enable quotas.'),
'title' => locale.maketext('You must reboot your server to enable quotas.'),
'isShown' => (has_root_privileges && show_reboot_banner && needs_reboot_result.quota) ? 1 : 0,
'url' => 'scripts/graceful_reboot_landing?suggest=1',
'id' => 'lnkRebootRequiredQuota'
},
{
'type' => 'warning',
'api_check' => 0
'name' => 'quota_broken',
'text' => locale.maketext('Quotas are currently broken on your server.'),
'title' => locale.maketext('Quotas are currently broken on your server.'),
'isShown' => (has_root_privileges && quota_broken) ? 1 : 0,
'url' => 'scripts/dialog?dialog=quotas', # TODO: point directly to documentation when able to do so
'id' => 'lnkBrokenQuota'
},
{
'type' => 'warning',
'api_check' => 0
'name' => 'reboot_kernel',
'text' => locale.maketext('You must reboot your server to apply kernel updates.'),
'title' => locale.maketext('You must reboot your server to apply kernel updates.'),
'isShown' => (has_root_privileges && show_reboot_banner && needs_reboot_result.kernel) ? 1 : 0,
'url' => 'scripts/graceful_reboot_landing?suggest=1',
'id' => 'lnkRebootRequiredKernel'
},
{
'type' => 'warning',
'api_check' => 0
'name' => 'reboot_updates',
'text' => locale.maketext('You must reboot your server to apply software updates.'),
'title' => locale.maketext('You must reboot your server to apply software updates.'),
'isShown' => (has_root_privileges && show_reboot_banner && needs_reboot_result.kernel) ? 1 : 0,
'url' => 'scripts/graceful_reboot_landing?suggest=1',
'id' => 'lnkRebootRequiredSoftware'
},
{
'type' => 'warning',
'api_check' => !Whostmgr.dnsonly && has_root_privileges && !whm_variables.needs_reboot.quota,
'name' => 'quota_disabled',
'text' => locale.maketext('Filesystem quotas are currently disabled.'),
'title' => locale.maketext('Click to enable quotas.'),
'isShown' => 0,
'url' => 'scripts/dialog?dialog=quotas',
'id' => 'lnkUpdateBlocker'
},
{
'type' => 'warning',
'api_check' => 0,
'name' => 'version_update_blocked',
'text' => locale.maketext('The last attempt to update [asis,cPanel amp() WHM] was blocked.'),
'title' => locale.maketext('Details'),
'isShown' => whm_variables.update_blocked ? 1 : 0,
'url' => 'scripts7/review_upcp_blockers',
'id' => 'lnkUpdateBlocker'
},
{
'type' => 'warning',
'api_check' => !whm_variables.update_blocked,
'name' => 'version_update_available',
'text' => "",
'title' => locale.maketext('Update Now'),
'isShown' => 0,
'url' => 'scripts2/upcpform',
'id' => 'lnkUpdateNow'
},
{
'type' => 'warning',
'api_check' => 0,
'name' => 'ckeditor_removal_notice',
'text' => locale.maketext('We removed the [output,strong,HTML Editor] feature from cPanel’s File Manager interface. Click for more information.'),
'title' => locale.maketext('HTML Editor Removal Notice'),
'isShown' => has_root_privileges && !ckeditor_removal_notice_viewed,
'url' => 'https://go.cpanel.net/html_editor_deprecation',
'id' => 'lnkCkeditorRemovalNotice'
},
{
'type' => 'warning',
'api_check' => 0,
'name' => 'configserver_shutdown_notice',
'text' => locale.maketext('Notice: [asis,ConfigServer] will be closing down 31st August 2025 - Plugins like [asis,ConfigServer Security amp() Firewall (csf)], [asis,ConfigServer Exploit Scanner (cxs)], [asis,Outgoing Spam Monitor (osm)], and [asis,MailScanner Front-End (MSFE)] and others may be impacted. Click for more information.'),
'title' => locale.maketext('[asis,ConfigServer] Shutdown Notice'),
'isShown' => whm_variables.profile != 'WP2' && has_root_privileges && !configserver_shutdown_notice_viewed,
'url' => 'https://go.cpanel.net/configserver-shutdown',
'id' => 'lnkConfigserverShutdownNotice'
},
{
'type' => 'warning',
'api_check' => 0,
'name' => 'site_publisher_deprecation_notice',
'text' => locale.maketext('Site Publisher is no longer available since cPanel [output,amp] WHM version 134. Click for more information.'),
'title' => locale.maketext('Site Publisher has been deprecated'),
'isShown' => whm_variables.profile != 'WP2' && has_root_privileges && !site_publisher_deprecation_notice_viewed,
'url' => 'https://go.cpanel.net/exportspdata',
'id' => 'lnkSitePublisherDeprecationNotice'
}
];
SET breadcrumbdata = Whostmgr.get_breadcrumb_data_for_master() IF !breadcrumbdata.defined; #reads breadcrumburl for all templates used by page templates in main frame.
SET dnsonlytext = breadcrumbdata.dnsonly ? 'dnsonly' : '';
IF ( breadcrumbdata.url ); #if we got anything useful...
IF ( ! icon );
icon = breadcrumbdata.icon;
END;
IF ( ! header );
header = locale.makevar(breadcrumbdata.name); # Variable can translate (extracted from whostmgr/docroot/themes/x/breadcrumb)
END;
END;
USE Command;
# TODO: TENTATIVE REMOVE Unprotected.
IF ( !unprotected );
unprotected = 0;
END;
# REMOVE this after we no longer have YUI in WHM
SET include_legacy_stylesheets = 0 IF !include_legacy_stylesheets.defined;
SET inside_frame_or_tab_or_popup = 0 IF !inside_frame_or_tab_or_popup.defined;
SET skipheader = 0 IF !skipheader.defined;
SET hide_header = 0 IF !hide_header.defined;
SET hide_navigation = 0 IF !hide_navigation.defined;
SET hide_license_warnings = 0 IF !hide_license_warnings.defined;
SET locale_tag = locale.get_language_tag();
SET locale_version = calculate_magic_lex_mtime(locale_tag);
SET locale_query_string = '?locale=' _ locale_tag _ '&locale_revision=' _ locale_version;
SET app_key = '' IF !app_key.defined;
SET is_home_page = (Whostmgr.page_name() == '' || Whostmgr.page_name() == 'Home') && app_key != '';
SET server_environment = whm_variables.BASEOS _ " " _ whm_variables.profile _ " " _ whm_variables.envtype;
# From this template the top navigation element should only be hidden on
# the initial setup pages in any iframes (Exim Configuration Manager).
#
IF inside_frame_or_tab_or_popup || initial_setup_will_show;
SET hide_top_chrome = 1;
ELSE;
SET hide_top_chrome = 0;
END;
#When the breadcrumb data does not exist for an application (like a plugin) the value of `breadcrumdata` is `{}`
IF is_home_page || breadcrumbdata.list.size == 0;
SET skipbreadcrumb = 1;
END;
IF inside_frame_or_tab_or_popup;
SET hide_header = 1,
hide_navigation = 1,
hide_license_warnings = 1,
skipbreadcrumb = 1,
skipsupport = 1;
END;
# Skip loading the support JS if we don't have the template loaded
IF skipbreadcrumb;
SET skipsupport = 1;
END;
# Get the permissions for the nav account search feature
SET permissions = {
'all' => Whostmgr.checkacl('all'),
'listAccounts' => Whostmgr.checkacl('list-accts'),
'modifyAccount'=> Whostmgr.checkacl('edit-account'),
'impersonateAccountTweakSettingValue' => Whostmgr.get_account_impersonation_permission_value(),
'basicWHMFunctions' => Whostmgr.checkacl('basic-whm-functions'),
};
# Data for analytics purpose.
SET whm_analytics_include_template = '/var/cpanel/customizations/whm/includes/cp_analytics_whm.html.tt';
SET is_analytics_enabled_server_side = CPANEL.is_server_analytics_enabled();
# Page meta data for analytics purpose.
SET analytics_page_meta = {
product_feature => app_key,
product_feature_group => "",
framework_js => "",
framework_css => "",
# Add additional page meta to be sent to analytics.
};
SET cp_analytics_data = UIAnalytics.get_whm_analytics_data();
FOREACH key IN analytics_page_meta.keys.sort;
cp_analytics_data.$key = analytics_page_meta.$key;
END;
SET analyticsConfig = {
cpAnalyticsData => cp_analytics_data,
debugMode => CPANEL.is_debug_mode_enabled(),
loginUser => CPANEL.authuser,
isSandbox => Whostmgr.is_sandbox(),
canTrackUserAnalytics => can_track_user_analytics,
isUserAnalyticsRequiredByLeika => is_user_analytics_required_by_leika,
# Add additional page meta to be sent to analytics.
};
-%]
<!DOCTYPE html>
<html lang="[% locale_tag %]" dir="[% locale.get_html_dir_attr() %]">
<head>
<!-- HTML HEAD SECTION -->
<!-- bootstrap requires IE=edge -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- Title -->
<title>WHM [[% Whostmgr.shorthostname() %]] [% header %] - [% Whostmgr.WHM_VERSION %]</title>
[% IF base %]
<base href="[% (base.match(cp_security_token)) ? base : cp_security_token _ base %]">
[% END %]
<!-- Fav Icon -->
<link rel="shortcut icon" href="[% Whostmgr.find_file_url( 'favicon.ico', unprotected ) %]" type="image/x-icon" />
[% SET rtl_extension = locale.get_html_dir_attr() == 'rtl' ? '.rtl' : ''; %]
<link rel='stylesheet' type='text/css' href='[% MagicRevision("/jupiter_styles/fonts${rtl_extension}.min.css") %]' id='custom-fonts-stylesheet' />
<link rel='stylesheet' type='text/css' href='[% MagicRevision("/core/main_content/main_content_spacing${rtl_extension}.min.css") %]' />
<link rel='stylesheet' type='text/css' href='[% MagicRevision("/core/main_content/main_content${rtl_extension}.min.css") %]' />
<link rel='stylesheet' type='text/css' href='[% MagicRevision("/jupiter_styles/preload_styles${rtl_extension}.min.css") %]' />
<!-- Meta Data -->
<meta http-equiv="Content-Type" content="text/html; charset=[% locale.encoding() %]" />
<meta name="referrer" content="origin">
[%
IF meta_block;
meta_block;
END;
IF meta;
IF ref(meta) == 'ARRAY';
FOR meta_item = meta;
'<meta ';
FOR key = meta_item.keys;
key _ '="' _ meta_item.$key _ '" ';
END;
'/>';
END;
ELSE;
'<meta ';
FOR key = meta.keys;
key _ '="' _ meta.$key _ '" ';
END;
'/>';
END;
END;
-%]
[%#
NOTE: These are most common things any page JS
would need to exposing them so that it's available
for all js files
%]
<script nonce="[% CPANEL.nonce() %]">
window.COMMON = window.COMMON || {};
window.COMMON.hasRootPrivileges = [% IF Whostmgr.hasroot() %]true[% ELSE %]false[% END %];
window.COMMON.securityToken = [% JSON.stringify(cp_security_token) %];
window.COMMON.userName = "[% whm_variables.remote_user %]";
window.COMMON.isDnsOnly = [% IF Whostmgr.dnsonly %]true[% ELSE %]false[% END %];
[% IF !hide_navigation %]
window.COMMON.leftNavNVData = [% NVData.get("whmcommand:", "", 1, "whm").json() || 'null' -%];
[% END %]
</script>
[% # Script for Google Tag Manager. This one is not optional. %]
[% IF !inside_frame_or_tab_or_popup %]
<script>
[% # Calculate the license type
SET license_type = CPANEL.get_producttype();
IF Whostmgr.has_license_flag('dev');
license_type = license_type _ ' DEVELOPER';
ELSIF Whostmgr.has_license_flag('trial');
license_type = license_type _ ' TRIAL';
ELSIF Whostmgr.is_test_build();
license_type = license_type _ ' TEST';
END;
%]
</script>
[% END %]
[%
SET src_js = [];
#
# utilities_container.js is currently not localized
# because locale.cpanel_get_lex_path will enumerate every
# possible fallback locale object when it cannot find
# a localized file this is expensive and will stat
# every potential option. If we localize utilities_container.js
# we should uncomment the below
#
#lex_path = locale.cpanel_get_lex_path('/usr/local/cpanel/base/yui-gen/utilities_container/utilities_container.js', '/yui-gen/utilities_container/utilities_container.js');
#IF lex_path;
# src_js.push( CPANEL.get_js_url(lex_path) );
#END;
# Will bring back the exclusive logic back when we figure out how best we can load
# topframe javascript
DEFAULT CJT2_EXCLUSIVE = 0;
IF !CJT2_EXCLUSIVE && !is_ng;
src_js.push(CPANEL.get_js_url('/yui-gen/utilities_container/utilities_container.js'));
# Then CJT itself
IF CPANEL.is_debug_mode_enabled();
src_js.push( CPANEL.get_js_url('/cjt/cjt.js') _ locale_query_string );
ELSE;
src_js.push( CPANEL.get_js_url('/cjt/cjt-min.js') _ locale_query_string );
END;
END;
FOR src = src_js;
IF src;
IF ! LOADED;
SET LOADED = [];
END;
SET src = CPANEL.get_js_localized_url( src );
IF LOADED.grep('^' _ src _ '$').size == 0;
"<script type='text/javascript' src='$src'></script>";
LOADED.push(src);
END;
END;
END;
-%]
[% IF theme == "bootstrap"; %]
[% # load minimal whm styles for breadcrumbs and help %]
[% IF locale.get_html_dir_attr() == 'rtl'; %]
<link rel='stylesheet' type='text/css' href="[% Whostmgr.find_file_url('/styles/master-rtl.cmb.min.css') %]" />
[% ELSE %]
<link rel='stylesheet' type='text/css' href="[% Whostmgr.find_file_url('/styles/master-ltr.cmb.min.css') %]" />
[% END %]
[% IF include_legacy_stylesheets; %]
<link rel='stylesheet' type='text/css' href="[% Whostmgr.find_file_url('/styles/legacy_yui_styles.min.css') %]" />
[% END; %]
[% FOR page_css_url=Whostmgr.get_page_css_url();
# load page specific css
"<link rel='stylesheet' type='text/css' href='$page_css_url' />";
END; %]
[% ELSIF theme == "yui";%]
[% IF unprotected;
FOR src=Whostmgr.defheader_unprot_css_urls();
"<link rel='stylesheet' type='text/css' href='$src' />";
END;
ELSE;
FOR src=Whostmgr.basic_css_urls();
"<link rel='stylesheet' type='text/css' href='$src' />";
END;
END; %]
[% #Load scripts from the template scripts parameter
IF scripts;
FOR src=scripts.list();
PROCESS '_loadjs.tmpl';
END;
END;
%]
[% ELSE; %]
<link rel='stylesheet' type='text/css' href="[% Whostmgr.find_file_url('styles/unified_optimized.css') %]" />
[% #Load scripts from the template scripts parameter
IF scripts;
FOR src=scripts.list();
PROCESS '_loadjs.tmpl';
END;
END;
END;
-%]
[%
IF is_ng;
stylesheets.push("/css/ux-styles.min.css");
END;
%]
[%
stylesheets = stylesheets.list();
FOR src=stylesheets;
IF unprotected;
"<link rel='stylesheet' type='text/css' href='/unprotected/cpanel" _ src _ "' />";
ELSE;
"<link rel='stylesheet' type='text/css' href='" _ MagicRevision(src) _ "' />";
END;
END;
-%]
<style type="text/css">
[% IF theme == "yui" %]
[% Whostmgr.get_page_css() -%]
[% END %]
/* Extra Styles - 'extrastyle' */
[% IF extrastyle -%]
[% extrastyle -%]
[% END -%]
[% IF hide_navigation %]
html[dir="rtl"] #pageContainer,
#pageContainer {
margin-left: auto;
margin-right: auto;
}
[% END %]
[% IF inside_frame_or_tab_or_popup %]
body
{
overflow: auto;
height: auto;
}
#masterContainer,
#contentContainer,
#pageContainer{
height: auto;
}
#masterContainer,
#pageContainer{
margin: 0;
padding: 0;
height: 100%;
}
#contentContainer{
padding: 20px 20px 0 20px;
}
[% END %]
[% IF (whm_variables.osname == 'CENTOS' || whm_variables.osname == 'CLOUDLINUX') && whm_variables.osversion >= 8 && !inside_frame_or_tab_or_popup %]
#pageContainer #contentContainer #c8Warn.callout-warning {
color: black;
}
#c8DocsLink
{
color: #428BCA;
}
#c8Warn .callout {
padding-top: 10px;
padding-bottom: 10px;
}
#c8Warn h3 {
margin-top: 5px;
}
#c8Warn p {
margin-bottom: 0;
}
[% END %]
[% IF Whostmgr.is_mobile_or_tablet() %]
/* This is needed because of how Mobile Safari and Mobile Google Chrome treat
* VH units. Until we restructure WHM to not need VH units for the height, this
* is required for WHM to display properly on mobile devices using those browsers.
*/
html, body {
height: 100% !important;
}
/* We increase the height here to make sure we can clear the lower browser bar
* that shows up on the mobile browsers.
*/
/* mobile first */
#contentContainer {
min-height: calc(100vh - 135px) !important;
}
/* tablets next */
@media (min-width: 769px) {
#contentContainer {
min-height: calc(100vh - 185px) !important;
}
}
[% END %]
html
{
font-size: 16px;
}
</style>
[%- # Angular 7+ apps include the standalone CLDR file for the current locale. -%]
[%- IF is_ng || CJT2_EXCLUSIVE -%]
<script>
window.LEXICON = window.LEXICON || {};
[%
cldr_path = 'libraries/cldr/' _ locale.get_language_tag() _ '.js';
INSERT $cldr_path
%]
</script>
[%- END -%]
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=1">
[% IF CPANEL.is_qa_mode_enabled() %]
<script nonce="[% CPANEL.nonce() %]">
[% INSERT 'libraries/axe-core/axe.min.js' %]
window.AXE_CONFIG = {
"context": "#contentContainer",
"options": {
"runOnly": {
"type": "tag",
"values": ["wcag2a", "wcag2aa"]
},
"rules": {
"color-contrast": { "enabled": false },
"valid-lang": { "enabled": false }
},
"resultTypes": ["violations"]
}
};
[% INSERT 'libraries/cjt2/webAccessibilityChecker.js' %]
[% INSERT 'libraries/cjt2/e2e.js' %]
</script>
[% END %]
[% IF CPANEL.is_debug_mode_enabled() %]
<script src="[% MagicRevision('/core/web-components/dist/jupiter-web-components.cmb.js') %]"></script>
[% ELSE %]
<script src="[% MagicRevision('/core/web-components/dist/jupiter-web-components.cmb.min.js') %]"></script>
[% END %]
[% IF link_block -%]
[% link_block -%]
[% END -%]
[% IF js_first_block -%]
[% js_first_block -%]
[% END -%]
</head>
[%# NOTE: Do NOT UNDER ANY CIRCUMSTANCE REMOVE THE BODY ID %]
[%# NOTE: It is used by QA tests and NVData components to save state %]
[% SET whmnav = NVData.get("whmcommand:navigation") || 0 %]
[% SET page_class = (breadcrumburl.length) ? breadcrumburl.replace('/', '-').substr(1) : '' %]
[% IF theme == "yui" %]
<body class="whostmgr yui-skin-sam [%- whmnav == 1 ? 'nav-collapsed' : ''-%] page-[%- page_class -%]" id="[% breadcrumburl %]">
[% ELSIF skipbreadcrumb %]
<body class="whostmgr no-breadcrumbs [%- whmnav == 1 ? 'nav-collapsed' : ''-%] page-[%- page_class -%]" id="[% breadcrumburl %]">
[% ELSE %]
<body class="whostmgr [%- whmnav == 1 ? 'nav-collapsed' : ''-%] page-[%- page_class -%]" id="[% breadcrumburl %]">
[% END %]
[%# NOTE: This block is what allows Google Tag Manager and the NPS survey to work. Code is copied from topframe.tmpl %]
<div id="topFrameWrapper" class="topFrameWrapper" style="display:none;visibility:hidden">
<div class="informationWrapper">
<div class="infoContainer">
[% IF has_root_privileges %]
<a id="lnkWHMVersion"></a>
[% ELSE %]
<span id="lblWHMVersion"></span>
[% END %]
</div>
</div>
</div>
[%
SET whm_logos = ['WhmDarkLg', 'WhmWhiteLg'];
whm_logos = Whostmgr.get_whm_logos(whm_logos);
-%]
[% FOR name_path = whm_logos.pairs %]
<link rel="preload" as="image" href="[% name_path.value %]">
[% END -%]
<cp-root-variables
directory-prefix="[% cp_security_token %]"
permissions="[% permissions.json().html %]"
app-name="whm"
host-name=[% JSON.stringify(Whostmgr.hostname()) %]
category-list="[% Whostmgr.get_application_list().json().html %]"
favorites="[% Whostmgr.get_favorites().json().html %]"
server-environment="[% server_environment %]"
user="[% whm_variables.remote_user %]"
version="[% Whostmgr.WHM_VERSION %]"
[% IF plugins %]
plugins="[% plugins.json().html %]"
[% END %]
whm-notifications="[% notifications.json().html %]"
license-type="[% license_type %]"
app-search-results-limit="7"
initial-nav-url="[% Whostmgr.get_initial_nav_url().html %]"
whm-logos-json="[% JSON.stringify(whm_logos).html %]"
>
</cp-root-variables>
[% # NOTE: Analytics UI includes are disabled by default and are strictly opt-in only.
IF !inside_frame_or_tab_or_popup && is_user_analytics_required_by_leika
&& template_exists(whm_analytics_include_template);
# The package updates setting check is required to avoid regressions during cPanel&WHM upgrade to v112.
# This regression may occur only for users who have package updates disabled. (Details available in PH-19613)
IF varcache.is_package_update_enabled;
TRY;
'<div id="cp-analytics-whm">';
INCLUDE $whm_analytics_include_template;
'</div>';
CATCH;
"";
END;
ELSIF is_analytics_enabled_server_side;
TRY;
'<div id="cp-analytics-whm">';
INCLUDE $whm_analytics_include_template;
'</div>';
CATCH;
"";
END;
END;
END;
%]
<cp-ui-load-analytics
analytics-config="[% analyticsConfig.json() | html %]"
>
</cp-ui-load-analytics>
<div id="cp-overlay" class="cp-overlay"></div>
<div id="wrap" class="cp-layout-page">
<div id="glass-navbar-overlay"></div>
<!-- Global Banner -->
[% IF template_exists("/var/cpanel/customizations/whm/includes/global_banner.html.tt"); %]
[% INCLUDE "/var/cpanel/customizations/whm/includes/global_banner.html.tt" %]
[% END %]
[% IF !hide_navigation %]
<nav aria-label="[% locale.maketext("Main menu")%]" id="cp-main-menu-container" class="cp-layout-main-menu">
<cp-main-menu
logo-alt-text='[% locale.maketext("WebHost Manager Logo") %]'
></cp-main-menu>
</nav>
[% END %]
<div class="cp-layout-wrapper [% hide_navigation ? 'cp-layout-wrapper--full-width' : '' %]">
<!-- Header Section -->
[% IF !hide_top_chrome %]
<header role="banner" class="cp-layout-header cp-layout-header--with-main-menu">
<cp-whm-header-stats-control>
</cp-whm-header-stats-control>
[%# Single quotes needed to pass the props into the web component correctly. %]
<cp-header
focus-search='true'
logo-alt-text='[% locale.maketext("WebHost Manager Logo") %]'>
</cp-header>
</header>
[% END %]
<script type="text/javascript">
(function() {
const header = document.querySelector('cp-header');
if(header) {
header.addEventListener('menuItemPress', event => {
if(event.detail.id === "menu-reset-link") {
reset_all_interface_settings('[% cp_security_token %]')
}
if(event.detail.id === "lnkCkeditorRemovalNotice") {
var data = {
"api.version": 1,
"personalization": {"ckeditor_removal_notice" : 1},
};
fetch('[% cp_security_token %]' + "/json-api/personalization_set", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data),
}).then(function(response) {
window.location.reload();
}).catch(function(error) {
// Error is caught but intentionally ignored as we
// do not inform users errors regarding system logic
});
}
if(event.detail.id === "lnkConfigserverShutdownNotice") {
var data = {
"api.version": 1,
"personalization": {"configserver_shutdown_notice" : 1},
};
fetch('[% cp_security_token %]' + "/json-api/personalization_set", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data),
}).then(function(response) {
window.location.reload();
}).catch(function(error) {
// Error is caught but intentionally ignored as we
// do not inform users errors regarding system logic
});
}
if(event.detail.id === "lnkSitePublisherDeprecationNotice") {
var data = {
"api.version": 1,
"personalization": {"site_publisher_deprecation_notice" : 1},
};
fetch('[% cp_security_token %]' + "/json-api/personalization_set", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data),
}).then(function(response) {
window.location.reload();
}).catch(function(error) {
// Error is caught but intentionally ignored as we
// do not inform users errors regarding system logic
});
}
});
}
})();
</script>
<!-- masterContainer Start -->
[% IF theme == "bootstrap" || theme == "yui" %]
<div id="masterContainer" data-app-key="[% app_key %]">
[% ELSE %]
<div id="masterContainer" class="grid-container-fluid" data-app-key="[% app_key %]">
[% END %]
[% IF !hide_navigation %]
<div style="display: none;">
[% Command.get() -%]
</div>
[% END %]
<!-- pageContainer Start -->
<div id="pageContainer">
<!-- contentContainer Start -->
<div id="contentContainer">
[% IF !hide_license_warnings %]
<div>
<!-- unsupported distro -->
[% PROCESS 'menu/_unsupported_distro.tmpl' -%]
<!-- trial or dev license warning -->
[% PROCESS 'menu/_trial.tmpl' -%]
</div>
[% END %]
[% IF !hide_banner_ad && banner.defined && theme != 'bootstrap' %]
[% IF locale.get_html_dir_attr() == 'rtl'; %]
<link rel='stylesheet' type='text/css' href="[% Whostmgr.find_file_url('/styles/master-rtl.cmb.min.css') %]" />
[% ELSE %]
<link rel='stylesheet' type='text/css' href="[% Whostmgr.find_file_url('/styles/master-ltr.cmb.min.css') %]" />
[% END %]
[% END %]
<!-- PAGE HEADER -->
[%- IF !skipheader %]
<div class="pageTitle" id="pageTitle-[% app_key %]">
[% header = header || locale.maketext('Results of Your Request') -%]
[% IF icon -%]
[% IF !icon.match('\A/'); icon = Whostmgr.find_file_url( 'icons/' _ icon); END; -%]
<h1><img class="whm-app-title__image" src="[% icon %]" alt="" /> <span>[% header %]</span></h1>
[% ELSE -%]
[% IF !is_home_page %]
<h1>[% header %]</h1>
[% END %]
[% END -%]
</div>
[% END -%]
<!-- Breadcrumbs Section -->
[%- IF !skipbreadcrumb %]
[% PROCESS 'master_templates/breadcrumbs.tmpl' -%]
[% END %]
<!-- Banner Section - now controlled via a plugin -->
[% IF template_exists("/usr/local/cpanel/whostmgr/docroot/templates/master_templates/banner.tmpl"); %]
[% INCLUDE 'master_templates/banner.tmpl' -%]
[% END%]
<!-- PageTop Component -->
<!-- has_component_system: [% has_component_system ? "true" : "false" %] -->
[%
IF has_component_system && Components.has_components_for('whostmgr', app_key, 'page-top');
PROCESS "master_templates/component.html.tt",
APP_KEY => app_key,
TAG => 'div',
SLOT => 'page-top';
END;
%]
<!-- PageTop Component End -->
[% IF theme == "yui" %]
[%- # For Legacy apps that dump html on pages
extrahtml || '';
IF status;
PROCESS '_loadstatusbox.tmpl' appname = statusapp || header;
PROCESS '_setstatus.tmpl';
END;
-%]
[% END %]
<!-- PAGE TEMPLATE'S CONTENT -->
[% IF warn_linked_nodes -%]
[% num_linked_nodes = Whostmgr.count_linked_nodes() -%]
[% IF num_linked_nodes -%]
<div class="callout callout-warning">
[% locale.maketext('This server uses [quant,_1,linked node,linked nodes]. To adjust a linked node’s configuration you must log in to that node directly. This interface will only affect the local server’s configuration. Use the “[output,url,_2,_3]” interface to manage this server’s linked nodes.', num_linked_nodes, "$cp_security_token/scripts7/link-server-nodes/", locale.maketext('Link Server Nodes')) -%]
</div>
[% END -%]
[% END -%]