<?php
$nav_shown = true;
$arr = []; Hook::run(HOOKTYPE_PRE_HEADER, $arr);
+
?>
<!DOCTYPE html>
<head>
<meta name="HandheldFriendly" content="true">
<link href="<?php echo get_config("base_url"); ?>css/unrealircd-admin.css" rel="stylesheet">
+<link href="<?php echo get_config("base_url"); ?>css/right-click.css" rel="stylesheet">
+<style>
+.big-page-item:hover, .big-page-item:active, .nav-link {
+ color: black;
+}
+</style>
<link rel="stylesheet" href="<?php echo get_config("base_url"); ?>css/datatables.min.css" />
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.min.js" integrity="sha384-+sLIOodYLS7CIrQpBjl+C7nPvqq+FbNUBDunl/OZv93DB7Ln/533i8e/mZXLi/P+" crossorigin="anonymous"></script>
<script src="<?php echo get_config("base_url"); ?>js/unrealircd-admin.js"></script>
+<!-- <script defer src="<?php echo get_config("base_url"); ?>js/right-click-menus.js"></script> -- We're not doing this yet XD -->
+<script src="<?php echo get_config("base_url"); ?>js/bs-modal.js"></script>
+<script src="<?php echo get_config("base_url"); ?>js/bs-toast.js"></script>
<script src="<?php echo get_config("base_url"); ?>js/datatables.min.js"></script>
<script src="<?php echo get_config("base_url"); ?>js/datatables-natural-sort.js"></script>
<script src="<?php echo get_config("base_url"); ?>js/datatables-ellipsis.js"></script>
+<script src="<?php echo get_config("base_url"); ?>js/moment-with-locales.min.js"></script>
<script>
var BASE_URL = "<?php echo get_config("base_url"); ?>";
function timeoutCheck() {
.list-group-item-action {
color: #e0e0e0;
}
+ .list-group-item-action:visited{
+ color: black;
+ }
</style>
-<nav id="sidebarlol" style="left: 0" class="w3-sidebar navbar-expand-md bg-dark padding-top me-5 ma-5">
+<?php $a = []; Hook::run(HOOKTYPE_HEADER, $a); ?>
+<nav id="sidebarlol" style="left:0;overflow:auto" class="w3-sidebar navbar-expand-md bg-dark padding-top me-5 ma-5">
<div class="list-group">
<div class="badge badge-secondary rounded-pill">Main Menu</div>
<?php
-function show_page_item($name, $page, $nestlevel)
+function show_page_item($name, $page, $nestlevel, $small = false)
{
$active_page = NULL;
$icon = $style = "";
$class = "nav-link nav-item";
- if (is_string($active_page) && $page == $active_page)
- $class .= " active";
+ if ($small)
+ $class .= " list-group-item-action";
+ //if (is_string($active_page) && $page == $active_page)
+ // $class .= " active";
+
+ $is_link = isset($page["script"]) ? true : false;
if ($nestlevel > 0)
{
} else {
echo "<b>";
}
- if (is_array($page))
+ if (!$is_link)
{
$style = "padding-bottom: 0px;";
} else {
- echo "<a href=\"".get_config("base_url").$page."\" style=\"text-decoration: none\">\n";
+ $url = $page["script"];
+ if (str_ends_with($url, "/index.php"))
+ $url = str_replace('/index.php', '', $url);
+ if (!str_ends_with($url, ".php") && !empty($url))
+ $url = $url.'/';
+ echo "<a href=\"".get_config("base_url").$url."\" style=\"text-decoration: none\">\n";
}
- echo "<div class=\"big-page-item d-flex justify-content-between align-items-center $class list-group-item-action\" style=\"$style\">$name
+ echo "<div class=\"big-page-item d-flex justify-content-between align-items-center $class\" style=\"$style\">$name
<div class=\"text-right padding-top\">
<i class=\"fa fa-$icon\"></i>
</div></div>\n";
- if (!is_array($page))
+ if ($is_link)
echo "</a>";
if ($nestlevel > 0)
echo "</small>";
else
echo "</b>";
- if (is_array($page))
+ if (!$is_link)
{
foreach ($page as $subname=>$subpage)
- show_page_item($subname, $subpage, 1);
+ show_page_item($subname, $subpage, 1, $small);
}
}
$servers = get_config("unrealircd");
$cnt = count($servers);
?>
- <div class="dropdown" style="color: #d0d0d0">
- <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><?php echo $active_server ?> <span class="caret"></span></a>
+
+ <div class="dropdown navbar-expand-md navbar-nav">
+ <a href="#" class="dropdown-toggle nav-link" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><?php echo $active_server ?></a>
<div class="dropdown-menu">
<?php
foreach($servers as $name=>$d)
foreach($pages as $name=>$page)
- show_page_item($name, $page, 0);
+ show_page_item($name, $page, 0, true);
?>
</div>
</nav>
?>
</ul>
-
+ <style>
+ .search-container {
+ position: fixed;
+ right: 20px;
+ }
+ .search-container input,button {
+ border-radius: 7px;
+ }
+ #search-results {
+ max-height: 70vh;
+ overflow-y: auto;
+ }
+ #search-results .card.p-3:hover {
+ cursor: pointer;
+ }
+
+ </style>
+ <div class="search-container">
+ <input type="text" placeholder="Search.." id="search_box" name="search">
+ </div>
</nav><br>
</div>
-
+ <div style="font-size: 13px; position: absolute; top:40px; right: 20px; width: 520px; z-index:1040; height: auto;">
+ <ol><div id="search-results" class="card" hidden>
+
+ </div></ol>
+ </div>
<div id="main_contain" class="container-fluid" style="padding-left: 180px" role="main">
<script>
+
+ const searchBox = document.getElementById('search_box');
+ const searchResults =document.getElementById('search-results');
+ // Add event listener for keyup event
+ searchBox.addEventListener('input', function(event) {
+ // Get the value from the input box
+ const query = event.target.value.trim();
+
+ // Make sure query is not empty
+ if (query !== '') {
+ searchResults.removeAttribute('hidden');
+ // Make a request to the JSON endpoint with the query
+ fetch(BASE_URL+`api/search.php?search=`+encodeURIComponent(searchBox.value))
+ .then(response => {
+ // Check if the response is successful
+ if (!response.ok) {
+ throw new Error('Network response was not ok');
+ }
+ // Parse the JSON data
+ return response.json();
+ })
+ .then(data => {
+ searchResults.innerHTML = null;
+ // Work with the JSON data
+ console.log(data);
+
+ // Update UI with search results
+
+ //users
+ var search_label =document.createElement('div');
+ search_label.classList.add('card', 'bg-light', 'badge','p-2', 'm-1');
+ search_label.innerText = "Users";
+ searchResults.appendChild(search_label);
+ for (let key in data.users)
+ {
+ console.log(key+": "+data.users[key].name);
+ var user_result =document.createElement('div');
+ user_result.classList.add('card','p-3', 'm-1');
+ user_result.onclick = function(){
+ window.location.href = BASE_URL+"users/details.php?nick="+encodeURIComponent(data.users[key].name);
+ };
+ user_result.innerHTML = "<span class='p-0'>"+data.users[key].name+"<div class='badge ml-2 badge-primary'>Matches "+data.users[key].label+"</div></span><i>"+data.users[key].data+"</i>";
+ searchResults.appendChild(user_result);
+ }
+
+ //channels
+ var search_label =document.createElement('div');
+ search_label.classList.add('card', 'badge', 'bg-light','p-2', 'm-1');
+ search_label.innerText = "Channels";
+ searchResults.appendChild(search_label);
+ for (let key in data.channels)
+ {
+ console.log(key+": "+data.channels[key].name);
+ var channel_result =document.createElement('div');
+ channel_result.classList.add('card','p-3', 'm-1');
+ channel_result.onclick = function(){
+ window.location.href = BASE_URL+"channels/details.php?chan="+encodeURIComponent(data.channels[key].name);
+ };
+ channel_result.innerHTML = "<span class='p-0'>"+data.channels[key].name+"<div class='badge ml-2 badge-primary'>Matches "+data.channels[key].label+"</div></span><i>"+(data.channels[key].topic?data.channels[key].topic:"")+"</i>";
+ searchResults.appendChild(channel_result);
+ }
+
+ //Servers
+ var search_label =document.createElement('div');
+ search_label.classList.add('card', 'badge', 'bg-light','p-2', 'm-1');
+ search_label.innerText = "Servers";
+ searchResults.appendChild(search_label);
+ for (let key in data.servers)
+ {
+ console.log(key+": "+data.servers[key].name);
+ var serv_result =document.createElement('div');
+ serv_result.classList.add('card','p-3', 'm-1');
+ serv_result.onclick = function(){
+ window.location.href = BASE_URL+"servers/details.php?server="+encodeURIComponent(data.servers[key].name);
+ };
+ serv_result.innerHTML = data.servers[key].name;
+ searchResults.appendChild(serv_result);
+ }
+
+ //Server Bans
+ var search_label =document.createElement('div');
+ search_label.classList.add('card', 'badge', 'bg-light','p-2', 'm-1');
+ search_label.innerText = "Server Bans";
+ searchResults.appendChild(search_label);
+ for (let key in data.server_bans)
+ {
+ console.log(key+": "+data.server_bans[key].name);
+ var serv_result =document.createElement('div');
+ serv_result.classList.add('card','p-3', 'm-1');
+ serv_result.onclick = function(){
+ window.location.href = BASE_URL+"server-bans";
+ };
+ serv_result.innerHTML = "<span class='p-0'>"+data.server_bans[key].name+"<div class='badge ml-2 badge-primary'>Matches "+data.server_bans[key].label+"</div></span><i>"+(data.server_bans[key].data?data.server_bans[key].data:"")+"</i>";
+ searchResults.appendChild(serv_result);
+ }
+
+ //Server Excepts
+ var search_label =document.createElement('div');
+ search_label.classList.add('card', 'badge', 'bg-light','p-2', 'm-1');
+ search_label.innerText = "Server Exceptions";
+ searchResults.appendChild(search_label);
+ for (let key in data.excepts)
+ {
+ console.log(key+": "+data.excepts[key].name);
+ var serv_result =document.createElement('div');
+ serv_result.classList.add('card','p-3', 'm-1');
+ serv_result.onclick = function(){
+ window.location.href = BASE_URL+"server-bans/ban-exceptions";
+ };
+ serv_result.innerHTML = "<span class='p-0'>"+data.excepts[key].name+"<div class='badge ml-2 badge-primary'>Matches "+data.excepts[key].label+"</div></span><i>"+(data.excepts[key].data?data.excepts[key].data:"")+"</i>";
+ searchResults.appendChild(serv_result);
+ }
+
+ //Name Bans
+ var search_label =document.createElement('div');
+ search_label.classList.add('card', 'badge', 'bg-light','p-2', 'm-1');
+ search_label.innerText = "Name Bans";
+ searchResults.appendChild(search_label);
+ for (let key in data.name_bans)
+ {
+ console.log(key+": "+data.name_bans[key].name);
+ var serv_result =document.createElement('div');
+ serv_result.classList.add('card','p-3', 'm-1');
+ serv_result.onclick = function(){
+ window.location.href = BASE_URL+"server-bans/name-bans";
+ };
+ serv_result.innerHTML = "<span class='p-0'>"+data.name_bans[key].name+"<div class='badge ml-2 badge-primary'>Matches "+data.name_bans[key].label+"</div></span><i>"+(data.name_bans[key].data?data.name_bans[key].data:"")+"</i>";
+ searchResults.appendChild(serv_result);
+ }
+ //Spamfilter
+ var search_label =document.createElement('div');
+ search_label.classList.add('card', 'badge', 'bg-light','p-2', 'm-1');
+ search_label.innerText = "Spamfilter";
+ searchResults.appendChild(search_label);
+ for (let key in data.spamfilter)
+ {
+ console.log(key+": "+data.spamfilter[key].name);
+ var serv_result =document.createElement('div');
+ serv_result.classList.add('card','p-3', 'm-1');
+ serv_result.onclick = function(){
+ window.location.href = BASE_URL+"server-bans/spamfilter.php";
+ };
+ serv_result.innerHTML = "<span class='p-0'>"+data.spamfilter[key].name+"<div class='badge ml-2 badge-primary'>Matches "+data.spamfilter[key].label+"</div></span><i>"+(data.spamfilter[key].data?data.spamfilter[key].data:"")+"</i>";
+ searchResults.appendChild(serv_result);
+ }
+
+ //Logs
+ var search_label =document.createElement('div');
+ search_label.classList.add('card', 'badge', 'bg-light','p-2', 'm-1');
+ search_label.innerText = "Logs";
+ searchResults.appendChild(search_label);
+ for (let key in data.logs)
+ {
+ console.log(key+": "+data.logs[key].msg);
+ var log_result =document.createElement('div');
+ log_result.classList.add('card','p-3', 'm-1');
+ log_result.onclick = function(){
+ window.location.href = BASE_URL+"logs";
+ };
+ log_result.innerHTML = data.logs[key].msg;
+ searchResults.appendChild(log_result);
+ }
+
+ })
+ .catch(error => {
+ // Handle any errors
+ console.error('There was a problem with the fetch operation:', error);
+ // Display error message to the user
+ });
+ }
+ else
+ {
+ searchResults.hidden = 'true';
+ searchResults.innerHTML = null;
+ }
+ });
function nav_resize_check()
{
var width = window.innerWidth;
window.addEventListener('resize', function() {
nav_resize_check();
});
+
</script>
+
+<?php
+ if ($current_page)
+ {
+ if (!(isset($current_page["no_irc_server_required"]) &&
+ ($current_page["no_irc_server_required"] == true)) &&
+ !get_active_rpc_server())
+ {
+ Message::Fail("No RPC server configured. Go to Settings - RPC Servers.");
+ require_once('footer.php');
+ die;
+ }
+ $current_page_title = "UnrealIRCd Panel";
+ if (!empty($current_page_name))
+ $current_page_title = "$current_page_name - $current_page_title";
+ echo "<script>document.title='".htmlspecialchars($current_page_title)."';</script>\n";
+ }