openpanel/templates/tabler/base.html

1124 lines
63 KiB
HTML

<!doctype html>
<!--
* Tabler - Premium and Open Source dashboard template with responsive and high quality UI.
* @version 1.0.0-beta19
* @link https://tabler.io
* Copyright 2018-2023 The Tabler Authors
* Copyright 2018-2023 codecalm.net Paweł Kuna
* Licensed under MIT (https://github.com/tabler/tabler/blob/master/LICENSE)
-->
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>OpenAdmin [{% if force_domain_value %}{{ force_domain_value }}{% elif server_hostname %}{{ server_hostname }}{% else %}{{public_ip}}{% endif %}] {% if title %}{{title}}{%endif%}</title>
<link rel="icon" type="image/x-icon" href="{{ url_for('static', filename='images/favicon.svg') }}">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<meta name="robots" content="noindex,nofollow">
<!-- CSS files -->
<link href="{{ url_for('static', filename='dist/css/tabler.min.css') }}?1684106062" rel="stylesheet" />
<link href="{{ url_for('static', filename='custom/custom.css') }}?1684106062" rel="stylesheet" />
<link href="{{ url_for('static', filename='dist/css/tabler-vendors.min.css') }}?1684106062" rel="stylesheet" />
<link href="{{ url_for('static', filename='dist/css/demo.min.css') }}?1684106062" rel="stylesheet" />
<style>
@import url('https://rsms.me/inter/inter.css');
.navbar-vertical.navbar-expand-lg .navbar-collapse .navbar-nav .nav-link {
padding: 0.75rem calc(calc(var(--tblr-page-padding) * 2)/ 2);
}
.nav-link-icon {
width: 1.5rem;
height: 1.5rem;
margin-right: 0.75rem;
}
:root {
--tblr-font-sans-serif: 'Inter Var', -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI, Roboto, Helvetica Neue, sans-serif;
}
body {
font-feature-settings: "cv03", "cv04", "cv11";
}
</style>
</head>
<body class="layout-fluid">
<script src="{{ url_for('static', filename='dist/js/demo-theme.min.js') }}?1684106062"></script>
<div class="page">
<!-- Sidebar -->
<aside class="navbar navbar-vertical navbar-expand-lg" style="background:#0c0c0e" id="main-menu-container" data-bs-theme="dark">
<div class="container-fluid">
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#sidebar-menu" aria-controls="sidebar-menu" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<h1 class="navbar-brand navbar-brand-autodark" style="overflow-y: hidden; background: url('{{ url_for('static', filename='images/honeycomb.png') }}') no-repeat;">
<a href="/" id="hostname" style="text-decoration:none;">{% if force_domain_value %}{{ force_domain_value }}{% else %}{{ public_ip }}{% endif %}</a>
</h1>
<div class="nav-item dropdown d-lg-none">
<a href="#" class="nav-link d-flex lh-1 text-reset p-0" data-bs-toggle="dropdown"
aria-label="Open user menu">
<span class="avatar me-0">{{ current_user.username|first|upper }}{% if unread_notifications %}</span>
</a><span class="badge bg-blue text-blue-fg badge-notification badge-pill">{{ unread_notifications }}</span>{% endif %}
<div class="dropdown-menu dropdown-menu-end dropdown-menu-arrow">
<span class="dropdown-item">Username: &nbsp;<b> {{ current_user.username }}</b></span>
<a href="{{ url_for('view_notifications') }}" class="dropdown-item"><svg xmlns="http://www.w3.org/2000/svg" class="icon dropdown-item-icon" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M10 5a2 2 0 1 1 4 0a7 7 0 0 1 4 6v3a4 4 0 0 0 2 3h-16a4 4 0 0 0 2 -3v-3a7 7 0 0 1 4 -6" /><path d="M9 17v1a3 3 0 0 0 6 0v-1" /></svg> Notifications</a>
<div class="dropdown-divider"></div>
<a href="/logout" class="dropdown-item"><svg xmlns="http://www.w3.org/2000/svg" class="icon dropdown-item-icon" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M14 8v-2a2 2 0 0 0 -2 -2h-7a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h7a2 2 0 0 0 2 -2v-2"></path><path d="M9 12h12l-3 -3"></path><path d="M18 15l3 -3"></path></svg> Logout</a>
</div>
</div>
<div class="collapse navbar-collapse" id="sidebar-menu">
<button id="toggleDropdowns" class="btn btn-sm">Expand All</button>
<ul class="navbar-nav pt-lg-3" style="flex-grow:0;">
<li
class="nav-item {% if request.path.startswith('/dashboard') or request.path == ('/') %}active{% endif %}">
<a class="nav-link" href="/dashboard">
<span class="nav-link-icon d-md-none d-lg-inline-block"><!-- Download SVG icon from http://tabler-icons.io/i/home -->
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="{% if request.path.startswith('/dashboard') or request.path == ('/') %}var(--tblr-primary){% else %}currentColor{% endif %}" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-layout-dashboard"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 4h4a1 1 0 0 1 1 1v6a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1v-6a1 1 0 0 1 1 -1" /><path d="M5 16h4a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1v-2a1 1 0 0 1 1 -1" /><path d="M15 12h4a1 1 0 0 1 1 1v6a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1v-6a1 1 0 0 1 1 -1" /><path d="M15 4h4a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1v-2a1 1 0 0 1 1 -1" /></svg>
</span>
<span class="nav-link-title">
Dashboard
</span>
</a>
</li>
</ul>
<h5 class="sidebar-heading d-flex align-items-center px-3 mt-4 mb-1 text-body-secondary text-uppercase">
<span>Hosting Services</span>
</h5>
<ul class="navbar-nav pt-lg-3" style="flex-grow:0;">
<li class="nav-item {% if request.path.startswith('/user') %}active{% endif %}">
<a class="nav-link" href="/users">
<span class="nav-link-icon d-md-none d-lg-inline-block"><!-- Download SVG icon from http://tabler-icons.io/i/users -->
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-users" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="{% if request.path.startswith('/user') %}var(--tblr-primary){% else %}currentColor{% endif %}" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M9 7m-4 0a4 4 0 1 0 8 0a4 4 0 1 0 -8 0" /><path d="M3 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2" /><path d="M16 3.13a4 4 0 0 1 0 7.75" /><path d="M21 21v-2a4 4 0 0 0 -3 -3.85" /></svg> </span>
<span class="nav-link-title">
Users
</span>
</a>
</li>
<li class="nav-item {% if request.path.startswith('/plans') %}active{% endif %}">
<a class="nav-link" href="/plans">
<span class="nav-link-icon d-md-none d-lg-inline-block"><!-- Download SVG icon from http://tabler-icons.io/i/checkbox -->
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-packages" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="{% if request.path.startswith('/plans') %}var(--tblr-primary){% else %}currentColor{% endif %}" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M7 16.5l-5 -3l5 -3l5 3v5.5l-5 3z" /><path d="M2 13.5v5.5l5 3" /><path d="M7 16.545l5 -3.03" /><path d="M17 16.5l-5 -3l5 -3l5 3v5.5l-5 3z" /><path d="M12 19l5 3" /><path d="M17 16.5l5 -3" /><path d="M12 13.5v-5.5l-5 -3l5 -3l5 3v5.5" /><path d="M7 5.03v5.455" /><path d="M12 8l5 -3" /></svg> </span>
<span class="nav-link-title">
Hosting Plans
</span>
</a>
</li>
<li class="nav-item {% if request.path.startswith('/domains') %}active{% endif %}">
<a class="nav-link" href="/domains">
<span class="nav-link-icon d-md-none d-lg-inline-block"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="{% if request.path.startswith('/domains') %}var(--tblr-primary){% else %}currentColor{% endif %}" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-world-www"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M19.5 7a9 9 0 0 0 -7.5 -4a8.991 8.991 0 0 0 -7.484 4" /><path d="M11.5 3a16.989 16.989 0 0 0 -1.826 4" /><path d="M12.5 3a16.989 16.989 0 0 1 1.828 4" /><path d="M19.5 17a9 9 0 0 1 -7.5 4a8.991 8.991 0 0 1 -7.484 -4" /><path d="M11.5 21a16.989 16.989 0 0 1 -1.826 -4" /><path d="M12.5 21a16.989 16.989 0 0 0 1.828 -4" /><path d="M2 10l1 4l1.5 -4l1.5 4l1 -4" /><path d="M17 10l1 4l1.5 -4l1.5 4l1 -4" /><path d="M9.5 10l1 4l1.5 -4l1.5 4l1 -4" /></svg> </span>
<span class="nav-link-title">
Domains
</span>
</a>
</li>
{% if license_type == "Enterprise" %}
<li
class="nav-item dropdown {% if request.path.startswith('/emails') %}active{% endif %}">
<a class="nav-link dropdown-toggle show" href="/emails" data-bs-toggle="dropdown" data-bs-auto-close="false" role="button" aria-expanded="true">
<span class="nav-link-icon d-md-none d-lg-inline-block"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-mail"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M3 7a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-10z" /><path d="M3 7l9 6l9 -6" /></svg></span>
<span class="nav-link-title"> Emails
</span>
</a>
<div class="dropdown-menu {% if request.path.startswith('/emails') %}show{% endif %}" data-bs-popper="static">
<div class="dropdown-menu-columns">
<div class="dropdown-menu-column">
</div>
<div class="dropdown-menu-column">
<a class="dropdown-item {% if request.path.startswith('/emails/accounts') %}active{% endif %}" href="/emails/accounts">
<span class="nav-link-title"> Email Accounts
</span>
</a>
<a class="d-none dropdown-item {% if request.path.startswith('/emails/queue') %}active{% endif %}" href="/emails/queue">
<span class="nav-link-title"> Mail Queue
</span>
</a>
<a class="dropdown-item {% if request.path.startswith('/emails/reports') %}active{% endif %}" href="/emails/reports">
<span class="nav-link-title"> Summary Reports
</span>
</a>
<a class="dropdown-item {% if request.path.startswith('/emails/settings') %}active{% endif %}" href="/emails/settings">
<span class="nav-link-title"> Email Settings
</span>
</a>
</div>
</div>
</div>
</li>
{% endif %}
</ul>
<h5 class="sidebar-heading d-flex align-items-center px-3 mt-4 mb-1 text-body-secondary text-uppercase">
<span>Server Management</span>
</h5>
<ul class="navbar-nav pt-lg-3" style="flex-grow:0;">
<li class="nav-item {% if request.path.startswith('/backups') %}active{% endif %}">
<a class="nav-link" href="/backups">
<span class="nav-link-icon d-md-none d-lg-inline-block"><!-- Download SVG icon from http://tabler-icons.io/i/star -->
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-box-seam" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="{% if request.path.startswith('/backups') %}var(--tblr-primary){% else %}currentColor{% endif %}" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 3l8 4.5v9l-8 4.5l-8 -4.5v-9l8 -4.5" /><path d="M12 12l8 -4.5" /><path d="M8.2 9.8l7.6 -4.6" /><path d="M12 12v9" /><path d="M12 12l-8 -4.5" /></svg></span>
<span class="nav-link-title"> Backups
</span>
</a>
</li>
<li
class="nav-item dropdown {% if request.path.startswith('/settings') %}active{% endif %}">
<a class="nav-link dropdown-toggle show" href="/settings" data-bs-toggle="dropdown" data-bs-auto-close="false" role="button" aria-expanded="true">
<span class="nav-link-icon d-md-none d-lg-inline-block"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="{% if request.path.startswith('/settings') %}var(--tblr-primary){% else %}currentColor{% endif %}" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-settings"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.325 4.317c.426 -1.756 2.924 -1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543 -.94 3.31 .826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756 .426 1.756 2.924 0 3.35a1.724 1.724 0 0 0 -1.066 2.573c.94 1.543 -.826 3.31 -2.37 2.37a1.724 1.724 0 0 0 -2.572 1.065c-.426 1.756 -2.924 1.756 -3.35 0a1.724 1.724 0 0 0 -2.573 -1.066c-1.543 .94 -3.31 -.826 -2.37 -2.37a1.724 1.724 0 0 0 -1.065 -2.572c-1.756 -.426 -1.756 -2.924 0 -3.35a1.724 1.724 0 0 0 1.066 -2.573c-.94 -1.543 .826 -3.31 2.37 -2.37c1 .608 2.296 .07 2.572 -1.065z" /><path d="M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0" /></svg></span>
<span class="nav-link-title">
Settings
</span>
</a>
<div class="dropdown-menu {% if request.path.startswith('/settings') %}show{% endif %}" data-bs-popper="static">
<div class="dropdown-menu-columns">
<div class="dropdown-menu-column">
</div>
<div class="dropdown-menu-column">
<a class="dropdown-item {% if request.path.startswith('/settings/general') %}active{% endif %}" href="/settings/general">
<span class="nav-link-title"> General Settings
</span>
</a>
<a class="dropdown-item {% if request.path.startswith('/settings/open-panel') %}active{% endif %}" href="/settings/open-panel">
<span class="nav-link-title"> OpenPanel
</span>
</a>
<a class="dropdown-item {% if request.path.startswith('/settings/open-admin') %}active{% endif %}" href="/settings/open-admin">
<span class="nav-link-title"> OpenAdmin
</span>
</a>
{% if license_type == "EnterpriseTODO" %}
<a class="dropdown-item {% if request.path.startswith('/settings/cluster') %}active{% endif %}" href="/settings/cluster">
<span class="nav-link-title"> Cluster
</span>
</a>
{% endif %}
{% if license_type == "Enterprise" %}
<a class="dropdown-item {% if request.path.startswith('/settings/api') %}active{% endif %}" href="/settings/api">
<span class="nav-link-title"> API Access
</span>
</a>
{% endif %}
</div>
</div>
</div>
</li>
<li
class="nav-item dropdown {% if request.path.startswith('/services') %}active{% endif %}">
<a class="nav-link dropdown-toggle show" href="/services" data-bs-toggle="dropdown" data-bs-auto-close="false" role="button" aria-expanded="true">
<span class="nav-link-icon d-md-none d-lg-inline-block"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="{% if request.path.startswith('/services') %}var(--tblr-primary){% else %}currentColor{% endif %}" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-server-2"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M3 4m0 3a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v2a3 3 0 0 1 -3 3h-12a3 3 0 0 1 -3 -3z" /><path d="M3 12m0 3a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v2a3 3 0 0 1 -3 3h-12a3 3 0 0 1 -3 -3z" /><path d="M7 8l0 .01" /><path d="M7 16l0 .01" /><path d="M11 8h6" /><path d="M11 16h6" /></svg></span>
<span class="nav-link-title">
Services
</span>
</a>
<div class="dropdown-menu {% if request.path.startswith('/services') %}show{% endif %}" data-bs-popper="static">
<div class="dropdown-menu-columns">
<div class="dropdown-menu-column">
</div>
<div class="dropdown-menu-column">
<a class="dropdown-item {% if request.path.startswith('/services/status') %}active{% endif %}" href="/services/status">
<span class="nav-link-title"> Service Status
</span>
</a>
<a class="dropdown-item {% if request.path.startswith('/services/nginx') %}active{% endif %}" href="/services/nginx">
<span class="nav-link-title"> Nginx Configuration
</span>
</a>
<a class="dropdown-item {% if request.path.startswith('/services/docker') %}active{% endif %}" href="/services/docker">
<span class="nav-link-title"> Docker Configuration
</span>
</a>
{% if license_type == "Enterprise" %}
<a class="dropdown-item {% if request.path.startswith('/services/ftp') %}active{% endif %}" href="/services/ftp">
<span class="nav-link-title"> FTP Server Configuration
</span>
</a>
{% endif %}
<a class="dropdown-item {% if request.path.startswith('/services/resources') %}active{% endif %}" href="/services/resources">
<span class="nav-link-title"> Resource Allocation <span class="badge badge-sm bg-green-lt text-uppercase ms-auto">New</span>
</span>
</a>
<a class="dropdown-item {% if request.path.startswith('/services/logs') %}active{% endif %}" href="/services/logs">
<span class="nav-link-title"> View Log Files
</span>
</a>
</div>
</div>
</div>
</li>
<li
class="nav-item dropdown {% if request.path.startswith('/security') %}active{% endif %}">
<a class="nav-link dropdown-toggle show" href="/security" data-bs-toggle="dropdown" data-bs-auto-close="false" role="button" aria-expanded="true">
<span class="nav-link-icon d-md-none d-lg-inline-block"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="{% if request.path.startswith('/security') %}var(--tblr-primary){% else %}currentColor{% endif %}" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-spy"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M3 11h18" /><path d="M5 11v-4a3 3 0 0 1 3 -3h8a3 3 0 0 1 3 3v4" /><path d="M7 17m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0" /><path d="M17 17m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0" /><path d="M10 17h4" /></svg></span>
<span class="nav-link-title">
Security
</span>
</a>
<div class="dropdown-menu {% if request.path.startswith('/security') %}show{% endif %}" data-bs-popper="static">
<div class="dropdown-menu-columns">
<div class="dropdown-menu-column">
</div>
<div class="dropdown-menu-column">
<a class="d-none dropdown-item {% if request.path.startswith('/security/passwords') %}active{% endif %}" href="/security/passwords">
<span class="nav-link-title"> Password Strength
</span>
</a>
<a class="d-none dropdown-item {% if request.path.startswith('/security/ssl') %}active{% endif %}" href="/security/ssl">
<span class="nav-link-title"> SSL Certificates
</span>
</a>
<!--a class="dropdown-item {% if request.path.startswith('/security/modsecurity') %}active{% endif %}" href="/security/modsecurity">
<span class="nav-link-title"> ModSecurity WAF
</span>
</a-->
<a class="dropdown-item {% if request.path.startswith('/security/firewall') %}active{% endif %}" href="/security/firewall">
<span class="nav-link-title"> Firewall
</span>
</a>
</div>
</div>
</div>
</li>
<li
class="nav-item dropdown {% if request.path.startswith('/server') %}active{% endif %}">
<a class="nav-link dropdown-toggle show" href="/server" data-bs-toggle="dropdown" data-bs-auto-close="false" role="button" aria-expanded="true">
<span class="nav-link-icon d-md-none d-lg-inline-block"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="{% if request.path.startswith('/server') %}var(--tblr-primary){% else %}currentColor{% endif %}" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-terminal-2"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M8 9l3 3l-3 3" /><path d="M13 15l3 0" /><path d="M3 4m0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z" /></svg></span>
<span class="nav-link-title">
Advanced
</span>
</a>
<div class="dropdown-menu {% if request.path.startswith('/server') %}show{% endif %}" data-bs-popper="static">
<div class="dropdown-menu-columns">
<div class="dropdown-menu-column">
</div>
<div class="dropdown-menu-column">
<a class="dropdown-item {% if request.path.startswith('/server/root-password') %}active{% endif %}" href="/server/root-password">
<span class="nav-link-title">Change Root Password
</span>
</a>
<a class="d-none dropdown-item {% if request.path.startswith('/server/terminal') %}active{% endif %}" href="/server/terminal">
<span class="nav-link-title">Terminal
</span>
</a>
<a class="dropdown-item {% if request.path.startswith('/server/ssh') %}active{% endif %}" href="/server/ssh">
<span class="nav-link-title">SSH Access
</span>
</a>
<a class="dropdown-item {% if request.path.startswith('/server/crons') %}active{% endif %}" href="/server/crons">
<span class="nav-link-title">OpenPanel Cron Jobs
</span>
</a>
<a class="dropdown-item {% if request.path.startswith('/server/timezone') %}active{% endif %}" href="/server/timezone">
<span class="nav-link-title">Server Time
</span>
</a>
</div>
</div>
</div>
</li>
</ul>
<h5 class="sidebar-heading d-flex align-items-center px-3 mt-4 mb-1 text-body-secondary text-uppercase">
<span>Billing and Support</span>
</h5>
<ul class="navbar-nav pt-lg-3" style="flex-grow:0;">
<li class="nav-item {% if request.path.startswith('/license') %}active{% endif %}">
<a class="nav-link" href="/license">
<span class="nav-link-icon d-md-none d-lg-inline-block">
<svg version="1.0" style="vertical-align:middle;" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 213.000000 215.000000" preserveAspectRatio="xMidYMid meet"><g transform="translate(0.000000,215.000000) scale(0.100000,-0.100000)" fill="currentColor" stroke="none"><path d="M990 2071 c-39 -13 -141 -66 -248 -129 -53 -32 -176 -103 -272 -158 -206 -117 -276 -177 -306 -264 -17 -50 -19 -88 -19 -460 0 -476 0 -474 94 -568 55 -56 124 -98 604 -369 169 -95 256 -104 384 -37 104 54 532 303 608 353 76 50 126 113 147 184 8 30 12 160 12 447 0 395 -1 406 -22 461 -34 85 -98 138 -317 264 -104 59 -237 136 -295 170 -153 90 -194 107 -275 111 -38 2 -81 0 -95 -5z m205 -561 c66 -38 166 -95 223 -127 l102 -58 0 -262 c0 -262 0 -263 -22 -276 -13 -8 -52 -31 -88 -51 -36 -21 -126 -72 -200 -115 l-135 -78 -3 261 -3 261 -166 95 c-91 52 -190 109 -219 125 -30 17 -52 34 -51 39 3 9 424 256 437 255 3 0 59 -31 125 -69z"></path></g></svg></span>
<span class="nav-link-title"> OpenPanel Enterprise</span>
</a>
</li>
</ul>
</div>
<script>
document.getElementById('toggleDropdowns').addEventListener('click', function() {
const sidebarMenu = document.getElementById('sidebar-menu');
const dropdowns = sidebarMenu.querySelectorAll('.dropdown-menu');
const dropdownToggles = sidebarMenu.querySelectorAll('.dropdown-toggle');
const isExpand = !dropdowns[0].classList.contains('show'); // Check if we are expanding or collapsing
dropdowns.forEach(dropdown => {
if (isExpand) {
dropdown.classList.add('show');
} else {
dropdown.classList.remove('show');
}
});
dropdownToggles.forEach(toggle => {
toggle.setAttribute('aria-expanded', isExpand ? 'true' : 'false');
});
// Save state in localStorage
localStorage.setItem('dropdownState', isExpand ? 'open' : 'closed');
// Update button text
this.textContent = isExpand ? 'Collapse All' : 'Expand All';
});
// Restore state from localStorage on page load
document.addEventListener('DOMContentLoaded', function() {
const savedState = localStorage.getItem('dropdownState');
const toggleButton = document.getElementById('toggleDropdowns');
const sidebarMenu = document.getElementById('sidebar-menu');
const dropdowns = sidebarMenu.querySelectorAll('.dropdown-menu');
const dropdownToggles = sidebarMenu.querySelectorAll('.dropdown-toggle');
if (savedState && savedState === 'open') {
dropdowns.forEach(dropdown => dropdown.classList.add('show'));
dropdownToggles.forEach(toggle => toggle.setAttribute('aria-expanded', 'true'));
toggleButton.textContent = 'Collapse All';
} else {
dropdowns.forEach(dropdown => dropdown.classList.remove('show'));
dropdownToggles.forEach(toggle => toggle.setAttribute('aria-expanded', 'false'));
toggleButton.textContent = 'Expand All';
}
// Ensure active dropdown remains expanded
const activeDropdown = sidebarMenu.querySelector('.nav-item.dropdown.active .dropdown-menu');
if (activeDropdown) {
activeDropdown.classList.add('show');
const activeToggle = sidebarMenu.querySelector('.nav-item.dropdown.active .dropdown-toggle');
if (activeToggle) {
activeToggle.setAttribute('aria-expanded', 'true');
}
}
});
</script>
<div class="docs_links btn-list m-2">
{% if request.path.startswith('/license') %}
<a href="https://openpanel.com/docs/articles/license/upgrade_to_openpanel_enterprise_and-activate_license/
{% elif request.path.startswith('/import') %}
<a href="https://openpanel.com/docs/articles/transfers/import-cpanel-backup-to-openpanel/
{% else %}
<a href="https://openpanel.com/docs/admin/{% if request.path.startswith('/dashboard') %}dashboard
{% elif request.path == '/users' %}users/openpanel
{% elif request.path == '/user/new' %}users/openpanel#create-users
{% elif request.path.startswith('/users/') %}users/openpanel#detailed-user-information
{% elif request.path.startswith('/plans') %}plans/hosting_plans
{% elif request.path.startswith('/domains') %}domains
{% elif request.path.startswith('/backups') %}backups
{% elif request.path.startswith('/services/status') %}services/status
{% elif request.path.startswith('/services/nginx') %}services/nginx
{% elif request.path.startswith('/services/docker') %}services/docker
{% elif request.path.startswith('/services/resources') %}services/allocation
{% elif request.path.startswith('/services/logs') %}services/log_viewer
{% elif request.path.startswith('/server/root-password') %}server/change_root_password
{% elif request.path.startswith('/server/ssh') %}server/ssh
{% elif request.path.startswith('/server/crons') %}server/crons
{% elif request.path.startswith('/server/timezone') %}server/timezone
{% elif request.path.startswith('/emails') %}admin/emails
{% elif request.path.startswith('/settings/general') %}settings/general
{% elif request.path.startswith('/security/firewall') %}security/firewall
{% elif request.path.startswith('/settings/modsecurity') %}settings/waf
{% elif request.path.startswith('/settings/open-panel') %}settings/openpanel
{% elif request.path.startswith('/settings/open-admin') %}settings/adminpanel
{% elif request.path.startswith('/settings/api') %}settings/api
{% elif request.path.startswith('/view_notifications') or request.path.startswith('/notifications') %}notifications
{% else %}intro{% endif %}{% endif %}" class="btn w-100" target="_blank" rel="noreferrer"{% if title %}title="{{title}} documentation" data-bs-toggle="tooltip" data-bs-placement="right"{% endif %}>
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-message-2-question"
width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none"
stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M8 9h8" />
<path d="M8 13h6" />
<path d="M14.5 18.5l-2.5 2.5l-3 -3h-3a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v4.5" />
<path d="M19 22v.01" />
<path d="M19 19a2.003 2.003 0 0 0 .914 -3.782a1.98 1.98 0 0 0 -2.414 .483" />
</svg>
Documentation
</a>
{% if license_type == "Enterprise" %}
<a href="https://my.openpanel.com/submitticket.php?step=2&deptid=1" class="btn w-100" target="_blank" rel="noreferrer" title="Submit a ticket" data-bs-toggle="tooltip" data-bs-placement="right">
<svg xmlns="http://www.w3.org/2000/svg" width="25" height="24" class="icon icon-tabler" viewBox="0 0 25 24">
<path fill="currentColor" fill-rule="nonzero" d="M10.537 13.201c0 .693-.575 1.255-1.284 1.255-.709 0-1.284-.561-1.284-1.255 0-.693.575-1.255 1.284-1.255.709 0 1.284.562 1.284 1.255zm5.21-1.255c-.709 0-1.284.562-1.284 1.255 0 .694.575 1.255 1.284 1.255.709 0 1.284-.561 1.284-1.255 0-.693-.575-1.255-1.284-1.255zm9.253.556v2.385c0 1.198-.993 2.169-2.218 2.169h-1.609C19.58 21.385 15.507 24 12.5 24c-3.007 0-7.079-2.615-8.673-6.944h-1.61C.994 17.056 0 16.085 0 14.887v-2.385c0-.825.47-1.541 1.163-1.908.023-3.387 1.032-6.032 3.004-7.86C6.123.92 8.927 0 12.5 0c3.573 0 6.377.92 8.333 2.733 1.972 1.829 2.981 4.474 3.004 7.86A2.162 2.162 0 0 1 25 12.503zm-4.694.707c0-.558-.029-1.082-.072-1.59-.984-.88-2.77-1.549-5.026-1.797.296.326.552.754.707 1.318-1.381-1.065-4.092-.811-6.143-3.192a6.372 6.372 0 0 1-.307-.376l-.003-.004c-.365-.483-.49-.77-.496-.452-.06 2.737-2.044 4.87-4.247 5.171-.014.301-.025.605-.025.922 0 1.157.193 2.211.521 3.161 1.238 1.46 3.281 1.872 5.09 1.981.335-.522 1.089-.887 1.966-.887 1.19 0 2.154.67 2.154 1.495 0 .826-.965 1.495-2.154 1.495-.915 0-1.695-.397-2.007-.955-1.264-.072-2.653-.283-3.892-.855 1.742 2.51 4.442 3.838 6.128 3.838 2.65 0 7.806-3.273 7.806-9.273zm2.196-2.876c-.14-5.91-3.59-9.032-10.002-9.032-6.411 0-9.861 3.122-10.002 9.032h.853c.312-1.992.971-3.63 1.972-4.89C6.92 3.436 9.333 2.418 12.5 2.418s5.581 1.018 7.177 3.025c1 1.26 1.66 2.898 1.972 4.89h.853z"></path>
</svg>
Hands-on Support
</a>
{% elif license_type == "Community" %}
<a href="https://community.openpanel.com/t/openadmin" class="btn w-100" target="_blank" rel="noreferrer" title="Explore community forums" data-bs-toggle="tooltip" data-bs-placement="right">
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-pink icon-tabler icon-tabler-message-2-heart"
width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none"
stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M8 9h8" />
<path d="M8 13h3.5" />
<path d="M10.5 19.5l-1.5 -1.5h-3a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v4" />
<path
d="M18 22l3.35 -3.284a2.143 2.143 0 0 0 .005 -3.071a2.242 2.242 0 0 0 -3.129 -.006l-.224 .22l-.223 -.22a2.242 2.242 0 0 0 -3.128 -.006a2.143 2.143 0 0 0 -.006 3.071l3.355 3.296z" />
</svg>
Community Forums
</a>
{% endif %}
</div>
</div>
</aside>
<button class="unl-toggler default" id="toggleButton" type="button"></button>
<!-- Navbar -->
<header class="navbar navbar-expand-md d-none d-lg-flex d-print-none sticky-top">
<div class="container-xl">
<h1 class="navbar-brand navbar-brand-autodark d-none-navbar-horizontal d-lg-flex d-none pe-0 pe-md-3">
<a href="https://openpanel.com/docs/articles/intro/" target="_blank" style="text-decoration:none;"><svg version="1.0" style="vertical-align:middle;" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 213.000000 215.000000" preserveAspectRatio="xMidYMid meet"><g transform="translate(0.000000,215.000000) scale(0.100000,-0.100000)" fill="currentColor" stroke="none"><path d="M990 2071 c-39 -13 -141 -66 -248 -129 -53 -32 -176 -103 -272 -158 -206 -117 -276 -177 -306 -264 -17 -50 -19 -88 -19 -460 0 -476 0 -474 94 -568 55 -56 124 -98 604 -369 169 -95 256 -104 384 -37 104 54 532 303 608 353 76 50 126 113 147 184 8 30 12 160 12 447 0 395 -1 406 -22 461 -34 85 -98 138 -317 264 -104 59 -237 136 -295 170 -153 90 -194 107 -275 111 -38 2 -81 0 -95 -5z m205 -561 c66 -38 166 -95 223 -127 l102 -58 0 -262 c0 -262 0 -263 -22 -276 -13 -8 -52 -31 -88 -51 -36 -21 -126 -72 -200 -115 l-135 -78 -3 261 -3 261 -166 95 c-91 52 -190 109 -219 125 -30 17 -52 34 -51 39 3 9 424 256 437 255 3 0 59 -31 125 -69z"></path></g></svg></a>
</h1>
<h1 class="navbar-brand navbar-brand-autodark d-none-navbar-horizontal d-flex d-lg-none pe-0 pe-md-3">
<a href="/" id="hostname" style="text-decoration:none;">{% if force_domain_value %}{{ force_domain_value }}{% else %}{{ public_ip }}{% endif %}</a>
</h1>
<div class="collapse navbar-collapse" id="navbar-menu">
<div>
<form action="./" method="get" autocomplete="off" novalidate="">
<div class="input-icon">
<span class="input-icon-addon">
<!-- Download SVG icon from http://tabler-icons.io/i/search -->
<svg xmlns="http://www.w3.org/2000/svg" class="icon" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0"></path><path d="M21 21l-6 -6"></path></svg>
</span>
<input type="text" class="form-control search-bar" id="searchInput" aria-label="Search" placeholder="Search…">
<ul class="dropdown-menu scroller" style="top: 100%; width: 100%; right: 0px; overflow-x: hidden; overflow-y: overlay; max-height: 90vh;" aria-labelledby="searchInput" id="filteredDropdown">
</ul>
</div>
</form>
</div>
</div>
<script>
$(document).ready(function(){
$('#searchInput').on('input', function() {
var searchText = $(this).val().toLowerCase();
var dropdownItems = '';
$.when(
$.get('/core/search_filter'),
$.get('/core/search_users'),
$.get('/core/search_websites')
).done(function(jsonData, usersData, websiteData) {
jsonData = jsonData[0];
usersData = usersData[0];
websiteData = websiteData[0];
$.each(jsonData, function(index, item) {
var itemName = item.name || '';
var linkTarget = '';
if (itemName.toLowerCase().includes(searchText)) {
dropdownItems += '<li style="border-bottom: 1px solid #e2e5ec;"><h3 class="m-0"><a class="dropdown-item" href="' + item.link + '" ' + linkTarget + '>' + item.name + '<br><p class="dropdown-item-description" style="display:contents; font-size: 0.7em;margin-bottom: 0px;">' + item.description + '</p></a></h3></li>';
}
});
$.each(usersData, function(index, item) {
var itemName = item[0] || '';
var suspended = itemName.toLowerCase().includes('suspended');
var iconClass = suspended ? '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-person-fill-x" viewBox="0 0 16 16"> <path d="M11 5a3 3 0 1 1-6 0 3 3 0 0 1 6 0m-9 8c0 1 1 1 1 1h5.256A4.5 4.5 0 0 1 8 12.5a4.5 4.5 0 0 1 1.544-3.393Q8.844 9.002 8 9c-5 0-6 3-6 4"/> <path d="M12.5 16a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7m-.646-4.854.646.647.646-.647a.5.5 0 0 1 .708.708l-.647.646.647.646a.5.5 0 0 1-.708.708l-.646-.647-.646.647a.5.5 0 0 1-.708-.708l.647-.646-.647-.646a.5.5 0 0 1 .708-.708"/> </svg>' : '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-person-fill" viewBox="0 0 16 16"><path d="M3 14s-1 0-1-1 1-4 6-4 6 3 6 4-1 1-1 1zm5-6a3 3 0 1 0 0-6 3 3 0 0 0 0 6"/></svg>';
if (itemName.toLowerCase().startsWith('suspended_')) {
var displayName = itemName.substring(itemName.lastIndexOf('_') + 1);
var itemLink = '/users/' + itemName;
dropdownItems += '<li><h3 class="m-0"><a class="dropdown-item bg-danger text-light" href="' + itemLink + '">' + iconClass + ' &nbsp;' + displayName + ' <b>(SUSPENDED)</b></a></h3></li>';
} else {
var itemLink = '/users/' + itemName;
dropdownItems += '<li><h3 class="m-0"><a class="dropdown-item" href="' + itemLink + '">' + iconClass + ' &nbsp;' + itemName + '</a></h3></li>';
}
});
$.each(websiteData, function(index, item) {
var itemName = item[0] || ''; // Get the site name from the first element
var itemLink = '/domains/' + itemName; // Construct link using site name
if (itemName.toLowerCase().includes(searchText)) {
dropdownItems += '<li><h3 class="m-0"><a class="dropdown-item" href="' + itemLink + '"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-globe2" viewBox="0 0 16 16"> <path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8m7.5-6.923c-.67.204-1.335.82-1.887 1.855q-.215.403-.395.872c.705.157 1.472.257 2.282.287zM4.249 3.539q.214-.577.481-1.078a7 7 0 0 1 .597-.933A7 7 0 0 0 3.051 3.05q.544.277 1.198.49zM3.509 7.5c.036-1.07.188-2.087.436-3.008a9 9 0 0 1-1.565-.667A6.96 6.96 0 0 0 1.018 7.5zm1.4-2.741a12.3 12.3 0 0 0-.4 2.741H7.5V5.091c-.91-.03-1.783-.145-2.591-.332M8.5 5.09V7.5h2.99a12.3 12.3 0 0 0-.399-2.741c-.808.187-1.681.301-2.591.332zM4.51 8.5c.035.987.176 1.914.399 2.741A13.6 13.6 0 0 1 7.5 10.91V8.5zm3.99 0v2.409c.91.03 1.783.145 2.591.332.223-.827.364-1.754.4-2.741zm-3.282 3.696q.18.469.395.872c.552 1.035 1.218 1.65 1.887 1.855V11.91c-.81.03-1.577.13-2.282.287zm.11 2.276a7 7 0 0 1-.598-.933 9 9 0 0 1-.481-1.079 8.4 8.4 0 0 0-1.198.49 7 7 0 0 0 2.276 1.522zm-1.383-2.964A13.4 13.4 0 0 1 3.508 8.5h-2.49a6.96 6.96 0 0 0 1.362 3.675c.47-.258.995-.482 1.565-.667m6.728 2.964a7 7 0 0 0 2.275-1.521 8.4 8.4 0 0 0-1.197-.49 9 9 0 0 1-.481 1.078 7 7 0 0 1-.597.933M8.5 11.909v3.014c.67-.204 1.335-.82 1.887-1.855q.216-.403.395-.872A12.6 12.6 0 0 0 8.5 11.91zm3.555-.401c.57.185 1.095.409 1.565.667A6.96 6.96 0 0 0 14.982 8.5h-2.49a13.4 13.4 0 0 1-.437 3.008M14.982 7.5a6.96 6.96 0 0 0-1.362-3.675c-.47.258-.995.482-1.565.667.248.92.4 1.938.437 3.008zM11.27 2.461q.266.502.482 1.078a8.4 8.4 0 0 0 1.196-.49 7 7 0 0 0-2.275-1.52c.218.283.418.597.597.932m-.488 1.343a8 8 0 0 0-.395-.872C9.835 1.897 9.17 1.282 8.5 1.077V4.09c.81-.03 1.577-.13 2.282-.287z"/> </svg> &nbsp;' + itemName + '</a></h3></li>';
}
});
if (dropdownItems) {
$('#filteredDropdown').html(dropdownItems).show();
} else {
$('#filteredDropdown').html('').hide();
}
});
});
// Hide dropdown when clicking outside
$(document).on('click', function(event) {
if (!$(event.target).closest('#searchGroup').length) {
$('#filteredDropdown').hide();
}
});
});
</script>
<div class="navbar-nav flex-row order-md-last LINKOVIIII">
<div class="d-none d-md-flex">
<a href="?theme=dark" class="nav-link px-0 hide-theme-dark" title="Enable dark mode"
data-bs-toggle="tooltip" data-bs-placement="bottom">
<!-- Download SVG icon from http://tabler-icons.io/i/moon -->
<svg xmlns="http://www.w3.org/2000/svg" class="icon" width="24" height="24" viewBox="0 0 24 24"
stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" />
</svg>
</a>
<a href="?theme=light" class="nav-link px-0 hide-theme-light" title="Enable light mode"
data-bs-toggle="tooltip" data-bs-placement="bottom">
<!-- Download SVG icon from http://tabler-icons.io/i/sun -->
<svg xmlns="http://www.w3.org/2000/svg" class="icon" width="24" height="24" viewBox="0 0 24 24"
stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M12 12m-4 0a4 4 0 1 0 8 0a4 4 0 1 0 -8 0" />
<path d="M3 12h1m8 -9v1m8 8h1m-9 8v1m-6.4 -15.4l.7 .7m12.1 -.7l-.7 .7m0 11.4l.7 .7m-12.1 -.7l-.7 .7" />
</svg>
</a>
<div class="nav-item dropdown d-none d-md-flex me-3">
{% if unread_notifications %}
<a href="#" class="nav-link px-0" data-bs-toggle="dropdown" tabindex="-1" aria-label="Show notifications">
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-bell-filled" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M14.235 19c.865 0 1.322 1.024 .745 1.668a3.992 3.992 0 0 1 -2.98 1.332a3.992 3.992 0 0 1 -2.98 -1.332c-.552 -.616 -.158 -1.579 .634 -1.661l.11 -.006h4.471z" stroke-width="0" fill="currentColor" /><path d="M12 2c1.358 0 2.506 .903 2.875 2.141l.046 .171l.008 .043a8.013 8.013 0 0 1 4.024 6.069l.028 .287l.019 .289v2.931l.021 .136a3 3 0 0 0 1.143 1.847l.167 .117l.162 .099c.86 .487 .56 1.766 -.377 1.864l-.116 .006h-16c-1.028 0 -1.387 -1.364 -.493 -1.87a3 3 0 0 0 1.472 -2.063l.021 -.143l.001 -2.97a8 8 0 0 1 3.821 -6.454l.248 -.146l.01 -.043a3.003 3.003 0 0 1 2.562 -2.29l.182 -.017l.176 -.004z" stroke-width="0" fill="currentColor" /></svg>
<span class="badge bg-blue text-blue-fg badge-notification badge-pill">{{ unread_notifications }}</span>
{% else %}
<a href="{{ url_for('view_notifications') }}" style="color: rgba(var(--tblr-body-color-rgb)),.16\) transparent;
}">
<!-- Download SVG icon from http://tabler-icons.io/i/bell -->
<svg xmlns="http://www.w3.org/2000/svg" class="icon" width="24" height="24" viewBox="0 0 24 24"
stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M10 5a2 2 0 1 1 4 0a7 7 0 0 1 4 6v3a4 4 0 0 0 2 3h-16a4 4 0 0 0 2 -3v-3a7 7 0 0 1 4 -6" />
<path d="M9 17v1a3 3 0 0 0 6 0v-1" />
</svg>
{% endif %}
</a>
<div class="dropdown-menu dropdown-menu-arrow dropdown-menu-end dropdown-menu-card" style="min-width: 350px;">
<div class="card">
<div class="card-header">
<div class="col"><h3 class="card-title">Notifications</h3></div>
<div class="col"><a href="{{ url_for('view_notifications') }}" class="text-secondary float-end">view all</a></div>
</div>
<div class="list-group list-group-flush list-group-hoverable">
{% for notification in last_5_notifications %}
{% set parts = notification.split(' ', 3) %}
<div class="list-group-item {% if "UNREAD" in parts[2] %}active{% endif %}">
<div class="row align-items-center">
<div class="col-auto"><span class="status-dot {% if "UNREAD" in parts[2] %}status-dot-animated{% endif %} bg-{% if "REBOOT" in parts[3] or "service" in parts[3] %}red{% elif "CPU" in parts[3] or "Memory" in parts[3] or "Disk" in parts[3] or "Load" in parts[3] %}warning{% elif "update" in parts[3] %}green{%else%}secondary{% endif %} d-block"></span></div>
<div class="col text-truncate">
<a href="{{ url_for('view_notifications') }}#{{ loop.index }}" class="text-body d-block">{{ parts[3] }}</a>
<div class="d-block text-muted text-truncate mt-n1">{{ parts[0] }} {{ parts[1] }}</div>
</div>
<div class="col-auto">
{% if "UNREAD" in parts[2] %}
<form method="post" id="notification_{{loop.index}}" action="{{ url_for('mark_notification_as_read', line_number=loop.index) }}" style="display:inline;">
<a style="cursor: pointer;" title="Mark as read" data-bs-toggle="tooltip" data-bs-placement="right" onclick="document.getElementById('notification_{{loop.index}}').submit();"><svg xmlns="http://www.w3.org/2000/svg" class="icon text-yellow" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M5 12l5 5l10 -10"></path></svg></a>
</form>
{% else %}
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-muted" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M5 12l5 5l10 -10"></path></svg>
{% endif %}
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
</div>
<div class="nav-item dropdown">
<a href="#" class="nav-link d-flex lh-1 text-reset p-0" data-bs-toggle="dropdown"
aria-label="Open user menu">
<span class="avatar me-3">{{ current_user.username|first|upper }}</span>
</a>
<div class="dropdown-menu dropdown-menu-end dropdown-menu-arrow">
<span class="dropdown-item">Logged in as: &nbsp;<b> {{ current_user.username }}</b></span>
<!--div class="dropdown-divider"></div-->
<a href="/logout" class="dropdown-item"><svg xmlns="http://www.w3.org/2000/svg" class="icon dropdown-item-icon" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M14 8v-2a2 2 0 0 0 -2 -2h-7a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h7a2 2 0 0 0 2 -2v-2"></path><path d="M9 12h12l-3 -3"></path><path d="M18 15l3 -3"></path></svg> Logout</a>
</div>
</div>
</div>
</div>
</header>
<div class="page-wrapper">
<!-- Page body -->
<div class="page-body">
<div id="no_margin_for_iframe" class="container-xl d-flex flex-column justify-content-center">
<!-- flash messages -->
{% with messages = get_flashed_messages() %}
{% if messages %}
{% for message in messages %}
{% if 'success' in message.lower() %}
{% set alert_class = 'alert-success' %}
{% set alert_icon = '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon alert-icon"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M5 12l5 5l10 -10"></path></svg>' %}
{% elif 'error' in message.lower() %}
{% set alert_class = 'alert-danger' %}
{% set alert_icon = '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon alert-icon"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0"></path><path d="M12 8v4"></path><path d="M12 16h.01"></path></svg>' %}
{% else %}
{% set alert_class = 'alert-primary' %}
{% set alert_icon = '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon alert-icon"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0"></path><path d="M12 9h.01"></path><path d="M11 12h1v4h1"></path></svg>' %}
{% endif %}
<div class="alert {{alert_class}} alert-dismissible" role="alert">
<div class="d-flex">
<div>
{{ alert_icon | safe }}
</div>
<div>
{{ message }}
</div>
</div>
<a class="btn-close" data-bs-dismiss="alert" aria-label="close"></a>
</div>
{% endfor %}
{% endif %}
{% endwith %}
<!-- START individual template file -->
{% block content %}{% endblock %}
<!-- END individual template file -->
</div>
</div>
<footer class="footer footer-transparent d-print-none">
<div class="container-xl">
<div class="row text-center align-items-center flex-row-reverse">
<div class="col-lg-auto ms-lg-auto">
<ul class="list-inline list-inline-dots mb-0">
<li class="list-inline-item">
{% if request.path.startswith('/license') %}
<a href="https://openpanel.com/docs/articles/license/upgrade_to_openpanel_enterprise_and-activate_license/
{% elif request.path.startswith('/import') %}
<a href="https://openpanel.com/docs/articles/transfers/import-cpanel-backup-to-openpanel/
{% else %}
<a href="https://openpanel.com/docs/admin/{% if request.path.startswith('/dashboard') %}dashboard
{% elif request.path == '/users' %}users/openpanel
{% elif request.path == '/user/new' %}users/openpanel#create-users
{% elif request.path.startswith('/users/') %}users/openpanel#detailed-user-information
{% elif request.path.startswith('/plans') %}plans/hosting_plans
{% elif request.path.startswith('/domains') %}domains
{% elif request.path.startswith('/backups') %}backups
{% elif request.path.startswith('/services/status') %}services/status
{% elif request.path.startswith('/services/nginx') %}services/nginx
{% elif request.path.startswith('/services/docker') %}services/docker
{% elif request.path.startswith('/services/resources') %}services/allocation
{% elif request.path.startswith('/services/logs') %}services/log_viewer
{% elif request.path.startswith('/server/root-password') %}server/change_root_password
{% elif request.path.startswith('/server/ssh') %}server/ssh
{% elif request.path.startswith('/server/crons') %}server/crons
{% elif request.path.startswith('/server/timezone') %}server/timezone
{% elif request.path.startswith('/emails') %}admin/emails
{% elif request.path.startswith('/settings/general') %}settings/general
{% elif request.path.startswith('/security/firewall') %}security/firewall
{% elif request.path.startswith('/settings/modsecurity') %}settings/waf
{% elif request.path.startswith('/settings/open-panel') %}settings/openpanel
{% elif request.path.startswith('/settings/open-admin') %}settings/adminpanel
{% elif request.path.startswith('/settings/api') %}settings/api
{% elif request.path.startswith('/view_notifications') or request.path.startswith('/notifications') %}notifications
{% else %}intro{% endif %}{% endif %}" target="_blank" class="link-secondary" rel="noopener" {% if title %}title="Read about the {{title}} page in the documentation" data-bs-toggle="tooltip" data-bs-placement="top" {%endif%}>Documentation</a></li>
{% if license_type == "Enterprise" %}
<li class="list-inline-item"><a href="https://my.openpanel.com/supporttickets.php"
target="_blank" class="link-secondary" rel="noopener">Ticketing System</a></li>
{% elif license_type == "Community" %}
<li class="list-inline-item"><a href="https://community.openpanel.com/t/openadmin"
target="_blank" class="link-secondary" rel="noopener">Support Forums</a></li>
{% endif %}
</ul>
</div>
<div class="col-12 col-lg-auto mt-3 mt-lg-0">
<ul class="list-inline list-inline-dots mb-0">
<li class="list-inline-item">
<a href="https://openpanel.com/docs/changelog/{{ panel_version }}"
target="_blank" class="link-secondary" rel="noopener">Running on <svg version="1.0" style="vertical-align:middle;" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 213.000000 215.000000" preserveAspectRatio="xMidYMid meet"><g transform="translate(0.000000,215.000000) scale(0.100000,-0.100000)" fill="currentColor" stroke="none"><path d="M990 2071 c-39 -13 -141 -66 -248 -129 -53 -32 -176 -103 -272 -158 -206 -117 -276 -177 -306 -264 -17 -50 -19 -88 -19 -460 0 -476 0 -474 94 -568 55 -56 124 -98 604 -369 169 -95 256 -104 384 -37 104 54 532 303 608 353 76 50 126 113 147 184 8 30 12 160 12 447 0 395 -1 406 -22 461 -34 85 -98 138 -317 264 -104 59 -237 136 -295 170 -153 90 -194 107 -275 111 -38 2 -81 0 -95 -5z m205 -561 c66 -38 166 -95 223 -127 l102 -58 0 -262 c0 -262 0 -263 -22 -276 -13 -8 -52 -31 -88 -51 -36 -21 -126 -72 -200 -115 l-135 -78 -3 261 -3 261 -166 95 c-91 52 -190 109 -219 125 -30 17 -52 34 -51 39 3 9 424 256 437 255 3 0 59 -31 125 -69z"></path></g></svg> <b>OpenPanel {% if license_type == "Enterprise" %} Enterprise edition{% elif license_type == "Community" %}Community edition{% endif %} {{ panel_version }}</b></a>
</li>
<li class="list-inline-item">
{% if force_domain_value %}{{ force_domain_value }}{% else %}{{ server_hostname }}{% endif %} ({{public_ip}})
</li>
</ul>
</div>
</div>
</div>
</footer>
</div>
</div>
<!-- Libs JS -->
<script src="{{ url_for('static', filename='dist/libs/list.js/dist/list.min.js') }}?1684106062" defer></script>
<!-- Tabler Core -->
<script src="{{ url_for('static', filename='dist/js/tabler.min.js') }}?1684106062" defer></script>
<script src="{{ url_for('static', filename='dist/js/demo.min.js') }}?1684106062" defer></script>
</body>
<style>
@media screen and (max-width: 1400px) {
.docs_links {
display: none;
}
}
@media screen and (max-width: 992px) {
.unl-toggler {
display: none!important;
}
}
@media screen and (min-width: 992px) {
.navbar-vertical.navbar-expand-lg {
overflow-y: overlay;
}
}
.unl-toggler.default {
background-image: url('{{ url_for('static', filename='images/left-arrow.png') }}');
}
.unl-toggler {
appearance: none;
background-color: rgba(34,34,34,.09);
border: none;
border-radius: 0px 5px 6px 0px;
bottom: 0;
background-image: url('{{ url_for('static', filename='images/left-arrow.png') }}');
background-repeat: no-repeat;
background-position: center;
background-size: 8px;
display: block;
margin: 0;
padding: 0;
position: fixed;
top: 50vh;
transform: translateY(-50%);
width: 16px;
height: 88px;
transition: height 0.3s ease-in-out;
z-index: 9999;
left: 15rem;
}
.unl-toggler.rotated {
background-image: url('{{ url_for('static', filename='images/right-arrow.png') }}');
left: 0rem;
}
.unl-toggler:hover {
height: calc(100vh);
border-radius: 0px;
}
</style>
<script>
// LEVA TRAKA
const toggleButton = document.getElementById('toggleButton');
// Get the main menu container element
const mainMenuContainer = document.getElementById('main-menu-container');
// Function to set a cookie
function setCookie(name, value, days) {
const expires = new Date();
expires.setTime(expires.getTime() + days * 24 * 60 * 60 * 1000);
document.cookie = name + '=' + value + ';expires=' + expires.toUTCString() + ';path=/'; // Set the cookie path to '/'
}
// Function to get a cookie
function getCookie(name) {
const cookieArr = document.cookie.split(';');
for (let i = 0; i < cookieArr.length; i++) {
const cookiePair = cookieArr[i].split('=');
if (name === cookiePair[0].trim()) {
return cookiePair[1];
}
}
return null;
}
// Function to apply the CSS according to the menu visibility state
function applyMenuVisibilityState(menuVisibility) {
const cpLayoutWrapper = document.querySelector('.container-fluid');
const containerFULLPAGE = document.querySelector('.page-wrapper');
const containerFULLPAGEMENU = document.querySelector('.navbar-expand-lg.navbar-vertical~.navbar');
if (menuVisibility === 'd-none') {
mainMenuContainer.classList.add('d-none');
toggleButton.textContent = '';
toggleButton.classList.remove('default');
toggleButton.classList.toggle('rotated');
cpLayoutWrapper.style.marginLeft = '0px';
containerFULLPAGE.style.marginLeft = '0rem';
containerFULLPAGEMENU.style.marginLeft = '0rem';
} else {
mainMenuContainer.classList.remove('d-none');
toggleButton.classList.toggle('default');
toggleButton.textContent = '';
cpLayoutWrapper.style.marginLeft = '';
containerFULLPAGE.style.marginLeft = '';
containerFULLPAGEMENU.style.marginLeft = '';
}
}
// Add a click event listener to the toggle button
toggleButton.addEventListener('click', function() {
const currentMenuVisibility = mainMenuContainer.classList.contains('d-none') ? 'd-none' : 'visible';
// Toggle the 'hidden' class on the main menu container
mainMenuContainer.classList.toggle('d-none');
// Toggle the 'rotated' class on the toggle button
toggleButton.classList.toggle('rotated');
//toggleButton.style.transform = 'background-image: url(/static/images/right-arrow.png';
toggleButton.style.backgroundImage = 'url("{{ url_for('static', filename='images/right-arrow.png') }}")';
// Apply the additional CSS code and update the cookie
if (mainMenuContainer.classList.contains('d-none')) {
toggleButton.textContent = '>>';
// Toggle the 'rotated' class on the toggle button
toggleButton.classList.toggle('rotated');
setCookie('menuVisibility', 'd-none', 7); // Set the cookie for 7 days
applyMenuVisibilityState('d-none');
} else {
toggleButton.textContent = '<<';
setCookie('menuVisibility', 'visible', 7); // Set the cookie for 7 days
applyMenuVisibilityState('visible');
// Toggle the 'default' class on the toggle button
toggleButton.classList.toggle('default');
}
});
// Apply the menu visibility state on page load
window.addEventListener('DOMContentLoaded', function() {
const userChoice = localStorage.getItem('menuVisibility');
const cookieChoice = getCookie('menuVisibility');
const menuVisibility = userChoice || cookieChoice;
applyMenuVisibilityState(menuVisibility);
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const popoverTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]'));
const popoverList = popoverTriggerList.map(function (popoverTriggerEl) {
return new bootstrap.Popover(popoverTriggerEl);
});
document.querySelectorAll('[data-bs-toggle="popover"]').forEach(function (popoverEl) {
popoverEl.addEventListener('click', function () {
popoverList.forEach(function (popover) {
if (popover._element !== popoverEl) {
popover.hide();
}
});
});
});
});
</script>
</html>