Simplify menu handling by using flex instead of offcanvas and make it resizable

Closes #13444
This commit is contained in:
José Antonio Díaz Miralles
2024-10-10 12:52:07 +02:00
parent 91d7ec1289
commit 9b3d3f85d6
4 changed files with 55 additions and 94 deletions
+13 -14
View File
@@ -36,14 +36,14 @@ this repository contains the full copyright notices and license terms. -->
<strong>Sorry sao does not work without JavaScript enabled. Please enable it to continue.</strong> <strong>Sorry sao does not work without JavaScript enabled. Please enable it to continue.</strong>
</noscript> </noscript>
<div class="body" style="display: none;"> <div class="body" style="display: none;">
<nav class="navbar navbar-inverse navbar-static-top" role="navigation" style="margin-bottom: 0px;"> <nav class="navbar navbar-inverse navbar-static-top" role="navigation">
<div class="container-fluid"> <div class="container-fluid">
<div class="navbar-header"> <div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" <button type="button" class="navbar-toggle collapsed"
data-toggle="collapse" data-target="#main_navbar"> data-toggle="collapse" data-target="#main_navbar">
<span class="caret"></span> <span class="caret"></span>
</button> </button>
<a class="navbar-brand" href="javascript:void(0)" data-toggle="offcanvas"> <a class="navbar-brand" href="javascript:void(0)" data-toggle="menu">
<span class="icon"> <span class="icon">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor">
<path d="M0 0h24v24H0z" fill="none"/> <path d="M0 0h24v24H0z" fill="none"/>
@@ -76,14 +76,10 @@ this repository contains the full copyright notices and license terms. -->
</div> </div>
</div> </div>
</nav> </nav>
<div id="main" class="container-fluid" style="padding: 0px;"> <div id="main">
<div class="row row-offcanvas row-offcanvas-left active" <div id="menu" role="navigation"></div>
style="height: calc(100vh - 50px - 1px - 20px); margin: 0px;"> <div id="tabs" class="hidden-xs" role="tabpanel">
<div class="col-xs-12 col-sm-4 col-lg-3 sidebar-offcanvas" id="menu" role="navigation" <div id="tabcontent" class="tab-content"></div>
style="overflow-y: auto; height: 100%;"></div>
<div class="col-xs-12 col-sm-8 col-lg-9 main-offcanvas" style="display:flex; overflow-y: auto; height: 100%;" id="tabs" role="tabpanel">
<div id="tabcontent" class="tab-content"></div>
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -93,16 +89,19 @@ this repository contains the full copyright notices and license terms. -->
} else { } else {
jQuery(function() { jQuery(function() {
jQuery('.body').show(); jQuery('.body').show();
jQuery('[data-toggle="offcanvas"]').click(function() { jQuery('[data-toggle="menu"]').click(function() {
jQuery('.row-offcanvas').toggleClass('active'); jQuery('#menu').toggleClass('hidden');
jQuery('#tabs').toggleClass('hidden-xs');
}); });
jQuery('#tabs').on('ready', function() { jQuery('#tabs').on('ready', function() {
var mq = window.matchMedia('(max-width: 991px)'); var mq = window.matchMedia('(max-width: 991px)');
if (mq.matches) { if (mq.matches) {
if (jQuery('#tablist').children().length) { if (jQuery('#tablist').children().length) {
jQuery('.row-offcanvas').removeClass('active'); jQuery('#menu').addClass('hidden');
jQuery('#tabs').removeClass('hidden-xs');
} else { } else {
jQuery('.row-offcanvas').addClass('active'); jQuery('#menu').removeClass('hidden');
jQuery('#tabs').addClass('hidden-xs');
} }
} }
}); });
-74
View File
@@ -1,74 +0,0 @@
/* This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. */
@import "variables";
@offcanvas-md: @screen-md-max;
body {
overflow-x: hidden;
}
.row-offcanvas {
position: relative;
-webkit-transition: all .25s ease-out;
-o-transition: all .25s ease-out;
transition: all .25s ease-out;
}
.row-offcanvas-right {
right: 0;
}
.row-offcanvas-left {
left: 0;
}
.row-offcanvas:not(.active) .main-offcanvas {
width: 100%;
}
.sidebar-offcanvas {
position: absolute !important;
top: 0;
}
.make-offcanvas(@size) {
.row-offcanvas-right
.sidebar-offcanvas {
right: -@size;
}
.row-offcanvas-left
.sidebar-offcanvas {
left: -@size;
}
.row-offcanvas-right.active {
right: @size;
}
.row-offcanvas-left.active {
left: @size;
}
.sidebar-offcanvas {
width: @size;
}
}
@media (min-width: @screen-lg-min) {
.make-offcanvas(25%);
}
@media (max-width: @screen-md-max) {
.make-offcanvas(33.3333%);
}
@media (max-width: (@screen-sm-max)) {
.make-offcanvas(50%);
}
@media (max-width: (@screen-xs-max)) {
.make-offcanvas(100%);
}
-3
View File
@@ -439,9 +439,6 @@ var Sao = {
Sao.i18n.set_direction = function(direction) { Sao.i18n.set_direction = function(direction) {
Sao.i18n.rtl = (direction === 'rtl'); Sao.i18n.rtl = (direction === 'rtl');
jQuery('html').attr('dir', direction); jQuery('html').attr('dir', direction);
jQuery('.row-offcanvas')
.removeClass('row-offcanvas-left row-offcanvas-right')
.addClass(Sao.i18n.rtl ? 'row-offcanvas-right' : 'row-offcanvas-left');
}; };
Sao.i18n.locale = {}; Sao.i18n.locale = {};
+42 -3
View File
@@ -11,6 +11,18 @@ html[theme="default"] {
@import "theme"; @import "theme";
} }
.body {
bottom: 0;
left: 0;
position: absolute;
right: 0;
top: 0;
> .navbar {
margin-bottom: 0;
}
}
// Fix double rtl prefix // Fix double rtl prefix
.float-rtl-grid-columns(@class, @rtl-prefix) { .float-rtl-grid-columns(@class, @rtl-prefix) {
.col(@index) { // initial .col(@index) { // initial
@@ -157,8 +169,20 @@ html[theme="default"] {
} }
} }
#main {
bottom: 0;
display: flex;
flex-direction: row;
gap: .5rem;
left: 0;
position: absolute;
right: 0;
top: 6rem;
}
#menu, #tabs { #menu, #tabs {
margin-top: 5px; display: flex;
overflow: auto;
.navbar-brand { .navbar-brand {
.title { .title {
@@ -170,6 +194,12 @@ html[theme="default"] {
} }
} }
#tabs {
flex: 1;
overflow-x: hidden;
padding: 0 5px;
}
@media screen and (max-width: @screen-md-max) { @media screen and (max-width: @screen-md-max) {
#menu, #tabs { #menu, #tabs {
.navbar-brand { .navbar-brand {
@@ -207,20 +237,30 @@ html[theme="default"] {
} }
#menu { #menu {
overflow-y: auto;
padding: 0; padding: 0;
background-color: @navbar-default-bg; background-color: @navbar-default-bg;
border-color: @panel-default-border; border-color: @panel-default-border;
border-style: solid; border-style: solid;
border-radius: 0 @panel-border-radius @panel-border-radius 0; border-radius: 0 @panel-border-radius @panel-border-radius 0;
border-width: 1px; border-width: 1px;
margin-top: 5px;
.treeview { .treeview {
height: auto; height: auto;
.cell { .cell {
user-select: none; user-select: none;
} }
} }
@media (min-width: @screen-md-min) {
resize: horizontal;
width: 35rem;
min-width: 20ch;
max-width: 100vw;
}
@media (max-width: (@screen-sm-max)) {
width: 100%;
}
} }
[dir="rtl"] #menu { [dir="rtl"] #menu {
border-right: none; border-right: none;
} }
@@ -1366,5 +1406,4 @@ img.favorite-icon {
} }
@import "input-icon"; @import "input-icon";
@import "offcanvas";
@import (optional) "custom.less"; @import (optional) "custom.less";