mirror of
https://gitlab.com/crafty-controller/crafty-4.git
synced 2024-08-30 18:23:09 +00:00
Merge branch 'dev-fixed-sidebar-V2' into 'dev'
Fix scrolling of sidebar v2 See merge request crafty-controller/crafty-4!481
This commit is contained in:
commit
f18b2bbc2f
@ -8,7 +8,7 @@ TBD
|
||||
- Add port constraint for all server creation & api ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/479))
|
||||
- Clean up backup configs when deleting servers ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/480))
|
||||
### Tweaks
|
||||
- Fix sidebar to not move when scrolling ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/475))
|
||||
- Fix sidebar to not move when scrolling ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/481))
|
||||
### Lang
|
||||
TBD
|
||||
<br><br>
|
||||
|
@ -8,6 +8,26 @@
|
||||
color: var(--base-text)
|
||||
}
|
||||
|
||||
nav.sidebar {
|
||||
position: fixed;
|
||||
}
|
||||
|
||||
|
||||
@media (min-width: 992px) {
|
||||
nav.sidebar {
|
||||
position: fixed;
|
||||
max-height: auto;
|
||||
}
|
||||
|
||||
.main-panel {
|
||||
margin-left: 270px;
|
||||
}
|
||||
|
||||
.sidebar-icon-only .main-panel {
|
||||
margin-left: 70px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.sidebar>.nav>.nav-item:not(.nav-profile)>.nav-link:before {
|
||||
content: none;
|
||||
@ -21,30 +41,6 @@
|
||||
display: block;
|
||||
}
|
||||
|
||||
.sticky-sidebar {
|
||||
position: fixed;
|
||||
max-height: fit-content;
|
||||
width: (100% - 270px);
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
.main-panel {
|
||||
margin-left: 70px;
|
||||
margin-top: 63px;
|
||||
}
|
||||
|
||||
@media (min-width: 1200px) {
|
||||
.main-panel {
|
||||
margin-left: 270px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 991px) {
|
||||
.main-panel {
|
||||
margin-left: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
.toggle-handle {
|
||||
background-color: white !important;
|
||||
}
|
||||
|
@ -197,6 +197,12 @@ if ($("canvas").length) {
|
||||
!body.hasClass("sidebar-icon-only")
|
||||
);
|
||||
}
|
||||
if (vw >= 992 && vw < 1200) {
|
||||
localStorage.setItem(
|
||||
"crafty-sidebar-expanded",
|
||||
!body.hasClass("sidebar-icon-only")
|
||||
);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -55,43 +55,42 @@
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- partial:partials/_navbar.html -->
|
||||
<nav class="navbar default-layout col-lg-12 col-12 p-0 fixed-top d-flex flex-row">
|
||||
<div class="text-center navbar-brand-wrapper d-flex align-items-top justify-content-center">
|
||||
<a class="navbar-brand brand-logo" href="/panel/dashboard">
|
||||
<img src="/static/assets/images/logo_long.svg" alt="logo" /> </a>
|
||||
<a class="navbar-brand brand-logo-mini" href="/panel/dashboard">
|
||||
<img src="/static/assets/images/logo_small.svg" alt="logo" /> </a>
|
||||
</div>
|
||||
<div class="navbar-menu-wrapper d-flex align-items-center">
|
||||
<style>
|
||||
body:not(.sidebar-icon-only) .navbar-toggler .mdi-chevron-double-right {
|
||||
display: none;
|
||||
}
|
||||
|
||||
body.sidebar-icon-only .navbar-toggler .mdi-chevron-double-left {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
<button class="navbar-toggler navbar-toggler align-self-center" type="button" data-toggle="minimize">
|
||||
<span class="mdi mdi-chevron-double-left"></span>
|
||||
<span class="mdi mdi-chevron-double-right"></span>
|
||||
</button>
|
||||
|
||||
{% include notify.html %}
|
||||
|
||||
<button class="navbar-toggler navbar-toggler-right d-lg-none align-self-center" type="button"
|
||||
data-toggle="offcanvas">
|
||||
<span class="mdi mdi-menu"></span>
|
||||
</button>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div class="container-scroller">
|
||||
<div class="flex-column">
|
||||
<div class="sticky-sidebar">
|
||||
{% include main_menu.html %}
|
||||
<!-- partial:partials/_navbar.html -->
|
||||
<nav class="navbar default-layout col-lg-12 col-12 p-0 fixed-top d-flex flex-row">
|
||||
<div class="text-center navbar-brand-wrapper d-flex align-items-top justify-content-center">
|
||||
<a class="navbar-brand brand-logo" href="/panel/dashboard">
|
||||
<img src="/static/assets/images/logo_long.svg" alt="logo" /> </a>
|
||||
<a class="navbar-brand brand-logo-mini" href="/panel/dashboard">
|
||||
<img src="/static/assets/images/logo_small.svg" alt="logo" /> </a>
|
||||
</div>
|
||||
<div class="navbar-menu-wrapper d-flex align-items-center">
|
||||
<style>
|
||||
body:not(.sidebar-icon-only) .navbar-toggler .mdi-chevron-double-right {
|
||||
display: none;
|
||||
}
|
||||
|
||||
body.sidebar-icon-only .navbar-toggler .mdi-chevron-double-left {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
<button class="navbar-toggler navbar-toggler align-self-center" type="button" data-toggle="minimize">
|
||||
<span class="mdi mdi-chevron-double-left"></span>
|
||||
<span class="mdi mdi-chevron-double-right"></span>
|
||||
</button>
|
||||
|
||||
{% include notify.html %}
|
||||
|
||||
<button class="navbar-toggler navbar-toggler-right d-lg-none align-self-center" type="button"
|
||||
data-toggle="offcanvas">
|
||||
<span class="mdi mdi-menu"></span>
|
||||
</button>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div class="container-fluid page-body-wrapper">
|
||||
{% include main_menu.html %}
|
||||
|
||||
<div class="main-panel">
|
||||
|
||||
<div class="warnings">
|
||||
@ -107,6 +106,7 @@
|
||||
|
||||
</div>
|
||||
<!-- main-panel ends -->
|
||||
|
||||
</div>
|
||||
<!-- page-body-wrapper ends -->
|
||||
</div>
|
||||
|
@ -1,145 +1,141 @@
|
||||
<!-- partial -->
|
||||
<div class="container-fluid page-body-wrapper vh-100">
|
||||
<!-- partial:partials/_sidebar.html -->
|
||||
<style>
|
||||
@media screen and (max-width: 991px) {
|
||||
.sidebar-offcanvas {
|
||||
-webkit-transition: all 0.25s cubic-bezier(.22, .61, .36, 1);
|
||||
transition: all 0.25s cubic-bezier(.22, .61, .36, 1);
|
||||
box-shadow: 0px 8px 17px 2px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12), 0px 5px 5px -3px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
<!-- partial:partials/_sidebar.html -->
|
||||
<style>
|
||||
@media screen and (max-width: 991px) {
|
||||
.sidebar-offcanvas {
|
||||
-webkit-transition: all 0.25s cubic-bezier(.22, .61, .36, 1);
|
||||
transition: all 0.25s cubic-bezier(.22, .61, .36, 1);
|
||||
box-shadow: 0px 8px 17px 2px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12), 0px 5px 5px -3px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
function debounce(func, wait, immediate) {
|
||||
var timeout;
|
||||
return function () {
|
||||
var context = this, args = arguments;
|
||||
var later = function () {
|
||||
timeout = null;
|
||||
if (!immediate) func.apply(context, args);
|
||||
};
|
||||
var callNow = immediate && !timeout;
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(later, wait);
|
||||
if (callNow) func.apply(context, args);
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
function debounce(func, wait, immediate) {
|
||||
var timeout;
|
||||
return function () {
|
||||
var context = this, args = arguments;
|
||||
var later = function () {
|
||||
timeout = null;
|
||||
if (!immediate) func.apply(context, args);
|
||||
};
|
||||
var callNow = immediate && !timeout;
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(later, wait);
|
||||
if (callNow) func.apply(context, args);
|
||||
};
|
||||
function isExtraLargeBreakpoint() {
|
||||
const vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);
|
||||
return vw >= 1200;
|
||||
};
|
||||
function isExtraLargeBreakpoint() {
|
||||
const vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);
|
||||
return vw >= 1200;
|
||||
}
|
||||
function isLargeBreakpoint() {
|
||||
const vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);
|
||||
return vw >= 992;
|
||||
}
|
||||
$(document).ready(function () {
|
||||
sidebarResizeHandler(null);
|
||||
$(window).on(
|
||||
'resize',
|
||||
debounce(sidebarResizeHandler, 25, true)
|
||||
);
|
||||
});
|
||||
function sidebarResizeHandler(e) {
|
||||
/*
|
||||
Viewport sizes: Extra large (vw >= 1200px), large (vw >= 992px), medium (vw >= 768px)
|
||||
- A localstorage item is set to remember a user's preference between collapsed or expanded.
|
||||
- For extra large viewports, the sidebar is the user's preference (by default expanded). When
|
||||
expanded or collapsed manually, it doesn't overlap the page content and the preference
|
||||
gets saved to a localstorage item.
|
||||
- For large viewports, the sidebar is collapsed. When expanded manually, it doesn't overlap
|
||||
the page content. The user's localstorage preference is not overridden during this state.
|
||||
- For medium and below viewports, the sidebar is hidden behing a hamburger icon. When expanded, the sidebar
|
||||
overlaps the page content. The user's localstorage preference is not overridden during this state.
|
||||
|
||||
More code in `app/frontend/static/assets/js/shared/misc.js` and `app/frontend/templates/base.html`
|
||||
*/
|
||||
if (isLargeBreakpoint()) {
|
||||
let value = localStorage.getItem('crafty-sidebar-expanded') !== 'false';
|
||||
$('body').toggleClass('sidebar-icon-only', !value);
|
||||
localStorage.setItem('crafty-sidebar-expanded', value);
|
||||
}
|
||||
function isLargeBreakpoint() {
|
||||
const vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);
|
||||
return vw >= 992;
|
||||
}
|
||||
$(document).ready(function () {
|
||||
sidebarResizeHandler(null);
|
||||
$(window).on(
|
||||
'resize',
|
||||
debounce(sidebarResizeHandler, 25, true)
|
||||
);
|
||||
});
|
||||
function sidebarResizeHandler(e) {
|
||||
/*
|
||||
Viewport sizes: Extra large (vw >= 1200px), large (vw >= 992px), medium (vw >= 768px)
|
||||
- A localstorage item is set to remember a user's preference between collapsed or expanded.
|
||||
- For extra large viewports, the sidebar is the user's preference (by default expanded). When
|
||||
expanded or collapsed manually, it doesn't overlap the page content and the preference
|
||||
gets saved to a localstorage item.
|
||||
- For large viewports, the sidebar is collapsed. When expanded manually, it doesn't overlap
|
||||
the page content. The user's localstorage preference is not overridden during this state.
|
||||
- For medium and below viewports, the sidebar is hidden behing a hamburger icon. When expanded, the sidebar
|
||||
overlaps the page content. The user's localstorage preference is not overridden during this state.
|
||||
}
|
||||
</script>
|
||||
<nav class="sidebar sidebar-offcanvas" id="sidebar">
|
||||
<ul class="nav">
|
||||
|
||||
More code in `app/frontend/static/assets/js/shared/misc.js` and `app/frontend/templates/base.html`
|
||||
*/
|
||||
if (isExtraLargeBreakpoint()) {
|
||||
let value = localStorage.getItem('crafty-sidebar-expanded') !== 'false';
|
||||
$('body').toggleClass('sidebar-icon-only', !value);
|
||||
localStorage.setItem('crafty-sidebar-expanded', value);
|
||||
} else if (isLargeBreakpoint()) {
|
||||
$('body').toggleClass('sidebar-icon-only', true);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<nav class="sidebar sidebar-offcanvas" id="sidebar">
|
||||
<ul class="nav">
|
||||
<li class="nav-item nav-category" style="margin-top:10px;">{{ translate('sidebar', 'navigation', data['lang']) }}
|
||||
</li>
|
||||
|
||||
<li class="nav-item nav-category" style="margin-top:10px;">{{ translate('sidebar', 'navigation', data['lang']) }}
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/panel/dashboard">
|
||||
<i class="fas fa-chart-network"></i>
|
||||
<span class="menu-title">{{ translate('sidebar', 'dashboard', data['lang']) }}</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/panel/dashboard">
|
||||
<i class="fas fa-chart-network"></i>
|
||||
<span class="menu-title">{{ translate('sidebar', 'dashboard', data['lang']) }}</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" data-toggle="collapse" href="#page-layouts" aria-expanded="false"
|
||||
aria-controls="page-layouts">
|
||||
<i class="fas fa-server"></i>
|
||||
<span class="menu-title">{{ translate('sidebar', 'servers', data['lang']) }}</span>
|
||||
<i class="menu-arrow"></i>
|
||||
</a>
|
||||
<div class="collapse" id="page-layouts">
|
||||
<ul class="nav flex-column sub-menu">
|
||||
{% if data['crafty_permissions']['Server_Creation'] in data['user_crafty_permissions'] %}
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/server/step1"><i class="fas fa-plus-circle"></i> {{ translate('sidebar',
|
||||
'newServer', data['lang']) }}</a>
|
||||
</li>
|
||||
{% end %}
|
||||
{% for s in data['menu_servers'] %}
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/panel/server_detail?id={{s['server_id']}}"><i class="fas fa-server"></i>
|
||||
{{s['server_name']}}</a>
|
||||
</li>
|
||||
{% end %}
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" data-toggle="collapse" href="#page-layouts" aria-expanded="false"
|
||||
aria-controls="page-layouts">
|
||||
<i class="fas fa-server"></i>
|
||||
<span class="menu-title">{{ translate('sidebar', 'servers', data['lang']) }}</span>
|
||||
<i class="menu-arrow"></i>
|
||||
</a>
|
||||
<div class="collapse" id="page-layouts">
|
||||
<ul class="nav flex-column sub-menu">
|
||||
{% if data['crafty_permissions']['Server_Creation'] in data['user_crafty_permissions'] %}
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/server/step1"><i class="fas fa-plus-circle"></i> {{ translate('sidebar',
|
||||
'newServer', data['lang']) }}</a>
|
||||
</li>
|
||||
{% end %}
|
||||
{% for s in data['menu_servers'] %}
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/panel/server_detail?id={{s['server_id']}}"><i class="fas fa-server"></i>
|
||||
{{s['server_name']}}</a>
|
||||
</li>
|
||||
{% end %}
|
||||
</ul>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="https://wiki.craftycontrol.com" target="_blank">
|
||||
<i class="fas fa-book"></i>
|
||||
<span class="menu-title">{{ translate('sidebar', 'documentation', data['lang']) }}</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="https://wiki.craftycontrol.com" target="_blank">
|
||||
<i class="fas fa-book"></i>
|
||||
<span class="menu-title">{{ translate('sidebar', 'documentation', data['lang']) }}</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/panel/wiki">
|
||||
<i class="fa fa-info-circle"></i>
|
||||
<span class="menu-title">Wiki</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/panel/wiki">
|
||||
<i class="fa fa-info-circle"></i>
|
||||
<span class="menu-title">Wiki</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="https://discord.gg/9VJPhCE" target="_blank">
|
||||
<i class="fab fa-discord"></i>
|
||||
<span class="menu-title">Discord</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="https://discord.gg/9VJPhCE" target="_blank">
|
||||
<i class="fab fa-discord"></i>
|
||||
<span class="menu-title">Discord</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/panel/credits">
|
||||
<i class="fas fa-heart"></i>
|
||||
<span class="menu-title">{{ translate('sidebar', 'credits', data['lang']) }}</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/panel/credits">
|
||||
<i class="fas fa-heart"></i>
|
||||
<span class="menu-title">{{ translate('sidebar', 'credits', data['lang']) }}</span>
|
||||
</a>
|
||||
</li>
|
||||
{% if data['show_contribute'] %}
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/panel/contribute">
|
||||
<i class="fas fa-donate"></i>
|
||||
<span class="menu-title">{{ translate('sidebar', 'contribute', data['lang']) }}</span>
|
||||
</a>
|
||||
</li>
|
||||
{% end %}
|
||||
|
||||
{% if data['show_contribute'] %}
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/panel/contribute">
|
||||
<i class="fas fa-donate"></i>
|
||||
<span class="menu-title">{{ translate('sidebar', 'contribute', data['lang']) }}</span>
|
||||
</a>
|
||||
</li>
|
||||
{% end %}
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
<!-- partial -->
|
||||
</div>
|
||||
</ul>
|
||||
</nav>
|
||||
<!-- partial -->
|
Loading…
Reference in New Issue
Block a user