Scriptcase 9. Convierta un MENÚ TREEVIEW en un MENÚ SIDEBAR

773 views
Skip to first unread message

Fausto

unread,
May 16, 2020, 12:26:19 AM5/16/20
to comunidad-scrip...@googlegroups.com

Convierta un MENÚ TREEVIEW en un MENÚ SIDEBAR


1- Crear una Aplicación Menú Tree View :  preferentemente seleccione el tema Sc9_Rhino, aunque de todos modos tendremos que personalizar el tema del menú, si no le aparece ese tema entonces debes de agregarlo al proyecto, por la opción Proyectos - Propiedades - Temas.


2.- Personalizar el Tema para el Menú :  SC tiene todo el CSS del menú treeView en la opción CSS de Aplicaciones (Temas), para hacer una copia del tema y poder modificarlo, presionamos sobre el enlace Guardar Como, lo colocamos en modo de proyecto y le escribimos el nombre del tema (a preferencia del desarrollador).

01_sidebar.png


3.- Editar en modo Avanzado

02_sidebar.png

SC mostrará todos los elementos del tema a modo de árbol, donde cada nodo representa un elemento que a la vez contienen sub-elementos, en lo adelante pego una imagen con las instrucciones de los cambios a realizar en cada elemento:

Todos los elementos que contengan la palabra "!importat" deben de quitarla.

Menú  ➜ Menú TreeView

 ➜ Página ➜ Otros :  Quitar contenido de :

·         Carpeta abierta,

·         carpeta cerrada

·         Elemento de menú.

➜ Cabecera

 Borde : Quitar contenido de:

·         Ancho de Borde

·         Color de borde

·         Estilo de borde

·         Cerrar borde

 Fondo : Quitar contenido de:

·         Color de Fondo

➜ Menú ➜ Item ➜ Texto : Color de Texto: #CCCED1

➜ Menú ➜ Enlace ➜ Texto : Color de Texto: #CCCED1

➜ Menú ➜ Mouseover ➜ Texto : Color de Texto: #000000

➜ Menú ➜ Mouseover ➜ Fondo :  Quitar Color de fondo

➜ Menú ➜ Selección ➜ Texto : Color de Texto: #CCCED1

➜ Menú ➜ Selección ➜ Fondo :  Quitar Color de fondo

➜ Menú ➜ Visitado ➜ Texto : Color de Texto: #CCCED1

➜ iFrame ➜ Fondo :  Quitar Color de fondo

➜ Tabla

 Borde : Quitar contenido de:

·         Estilo de borde

·         Ancho del borde

·         Color de borde

·         Cerrar de borde

 Fondo :  Quitar Color de fondo

Luego de cambiar estas propiedades del CSS, debemos de guardar el tema, cerrar la aplicación menú y abrirla de nuevo, eso es para poder utilizar el tema en ella.

4. Configuración Visual del Menu TreeView:

04_sidebar.png

En la opción cabecera activamos mostrar cabecera y solo dejamos el título, intente que este título no sea muy largo para que quepa en el tamaño del sidebar.

5.-  Pasamos a la opción de Configuración, donde nos aseguramos que  los siguientes atributos tiene los valores especificados aquí:

 

Ancho del menú : 260

Mostrar los elementos siempre: On

Mantener ajustes:  ON

Ocultar las líneas de puntos del menú: On

Utilizar expandir/cerrar: On

Barra de desplazamiento: Off

Expandir Items : Off

Seleccionar idioma: Off

Navegación

Abrir elementos en pestañas: On

Menú contextual de pestañas: On

Navegación de las pestañas del menú: On

Usar iconos predeterminados en la pestaña: On

 


6.- Ahora pegamos el código que controla el comportamiento del menú:

El código es un poco largo, la parte más larga es CSS y este podría ser puesto en una librería externa, no lo hice de esa forma porque eso complicaba un poco el ejemplo, de todas formas agregué un adjunto con el código por si se compromete la integridad de este en la publicación.


// onload

?>

<style>

 

/* valores */

:root {

--menu_ancho : 260px;

--menu_bg-color : #424C62;

/*--menu_bg-color : #4c8bf4; */

}

 

 

/* Este ancho debe de coincidir con el ancho del menu en figuración */

#css3menut {

width: var(--menu_ancho);

}

 

.scMenuTHeader {

width: var(--menu_ancho); 

height: 37px;

}

 

.scMenuTHeaderFont {

text-shadow: 2px 3px #222529;

}

 

 

/* area de opciones del menu pantalla mayor que celulares*/

@media only screen and (min-width: 360px) {

body > div.ui-layout-west {

overflow: hidden;

}

 

table#main_menutree_table {

padding-top: 0px !important;

}

}

 

/* area de opciones del menu */

body > div.ui-layout-west {

width : var(--menu_ancho) !important;

background-color : var(--menu_bg-color);

overflow: hidden;

}

 

 

/* **************************************** */

/* Scroll del Árbol del Ménu   21/06/2020   */

/* **************************************** */

#css3menut {

position:absolute;

top: 102px;

overflow:auto; 

 

/* Firefox */

height: -moz-calc(100% - 140px);

/* WebKit */

height: -webkit-calc(100% - 140px);

/* Opera */

height: -o-calc(100% - 140px);

/* Standard */

height: calc(100% - 140px)

}

 

#css3menut p:not(:last-child) {

margin-bottom: 1rem;

}

 

/* Tamaño del scroll */

#css3menut::-webkit-scrollbar {

width: 8px;

height: 8px;

}

 

/* Estilos barra (thumb) de scroll */

#css3menut::-webkit-scrollbar-thumb {

/*background: #ccc; */

background: #637293;

border-radius: 4px;

}

 

#css3menut::-webkit-scrollbar-thumb:active {

background-color: #999999;

}

 

#css3menut::-webkit-scrollbar-thumb:hover {

background: #b3b3b3;

box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.2);

}

 

/* Estilos track de scroll */

#css3menut::-webkit-scrollbar-track {

background: #e1e1e1;

border-radius: 4px;

}

 

#css3menut::-webkit-scrollbar-track:hover, 

#css3menut::-webkit-scrollbar-track:active {

background: #d4d4d4;

}

/* **************************************** */

/* **************************************** */

 

 

/* Caja de los iconos de las opciones principales */

div > ul > li > a > i   {

background-color: #333c50 !important;

border-radius: 5px;

}

 

/* Espacios entre las opciones del menú principal */

div > ul > li   {

padding-top: 10px !important;

}

 

/* Texto de las opciones del menú principal */

div > ul > li > a > span  {

padding-left : 5px;

}

 

/* Encabezado */

body > div.ui-layout-north {

width: var(--menu_ancho) !important;

background-color : var(--menu_bg-color);

z-index:999 !important;

}

 

/* Area de las Pestañas */

body > div.ui-layout-center {

top : -11px !important;

height: auto !important;

}

 

div#css3menut {

margin-top : 0px !important;

}

 

 

/* Boton de mostrar menu */

#divbtnshowmenu  {

width: 35px;

height: 26px;

top: 41px;

position: absolute;

background-color: var(--menu_bg-color);

border-radius: 0 4px 4px 0px;

left: 0;

}

 

.hidebtn {

left: -40px !important;

transition-delay: 0s !important;

}

 

 

#divbtnshowmenu > a  {

color: white;

position: fixed;

font-size: 14px;

font-weight: 14px;

padding: 8px 4px 8px 12px

}

 

/* Quitar botón de mostrar menu para usar el mismo de scritorio */

a#bmenu {

display: none !important;

}

 

#body > div.ui-layout-north,

#divbtnshowmenu,

#id_collapse,

#id_expand,

#show-sidebar,

#close-sidebar {

-webkit-transition: all 0.3s ease;

-moz-transition: all 0.3s ease;

-ms-transition: all 0.3s ease;

-o-transition: all 0.3s ease;

transition: all 0.3s ease;

}

 

#divbtnshowmenu,

#show-sidebar,

#close-sidebar {

cursor: pointer;

font-size: 20px;

}

 

#divbtnshowmenu,

#show-sidebar,

#close-sidebar {

color: #bdbdbd;

}

 

#divbtnshowmenu:hover,

#show-sidebar:hover,

#close-sidebar:hover {

color: #ffffff;

}

 

 

/*--------------------sidebar-header----------------------*/

.sidebar-header {

padding: 20px;

overflow: hidden;

color: #bbb;

border: #bbb;

border-bottom-style: solid;

border-bottom-width: thin;

border-top-style: solid;

border-top-width: thin;

}

 

.sidebar-header .user-pic {

float: left;

width: 60px;

padding: 2px;

border-radius: 12px;

margin-right: 15px;

overflow: hidden;

}

 

.sidebar-header .user-pic img {

object-fit: cover;

height: 56px;

width: 56px;

border-radius: 12px;

z-index : 999;

}

 

.sidebar-header .user-info {

float: left;

}

 

.sidebar-header .user-info > span {

display: block;

}

 

.sidebar-header .user-info .user-role {

font-size: 12px;

}

 

.sidebar-header .user-info .user-status {

font-size: 11px;

margin-top: 4px;

}

 

.sidebar-header .user-info .user-status i {

font-size: 8px;

margin-right: 4px;

color: #5cb85c;

}

 

/* Animación de los iconos menu principal*/

@-webkit-keyframes shake {

0% {-webkit-transform: rotate(-12deg);transform: rotate(-12deg);}

8% {-webkit-transform: rotate(12deg);transform: rotate(12deg);}

10% {-webkit-transform: rotate(24deg);transform: rotate(24deg);}

18% {-webkit-transform: rotate(-24deg);transform: rotate(-24deg);}

20% {-webkit-transform: rotate(-24deg);transform: rotate(-24deg);}

28% {-webkit-transform: rotate(24deg);transform: rotate(24deg);}

30% {-webkit-transform: rotate(24deg);transform: rotate(24deg);}

38% {-webkit-transform: rotate(-24deg);transform: rotate(-24deg);}

40% {-webkit-transform: rotate(-24deg);transform: rotate(-24deg);}

48% {-webkit-transform: rotate(24deg);transform: rotate(24deg);}

50% {-webkit-transform: rotate(24deg);transform: rotate(24deg);}

58% {-webkit-transform: rotate(-24deg);transform: rotate(-24deg);}

60% {-webkit-transform: rotate(-24deg);transform: rotate(-24deg);}

68% {-webkit-transform: rotate(24deg);transform: rotate(24deg);}

75% {-webkit-transform: rotate(0deg);transform: rotate(0deg);}

}

 

@keyframes shake {

0% {-webkit-transform: rotate(-12deg);-ms-transform: rotate(-12deg);transform: rotate(-12deg);}

8% {-webkit-transform: rotate(12deg);-ms-transform: rotate(12deg);transform: rotate(12deg);}

10% {-webkit-transform: rotate(24deg);-ms-transform: rotate(24deg);transform: rotate(24deg);}

18% {-webkit-transform: rotate(-24deg);-ms-transform: rotate(-24deg);transform: rotate(-24deg);}

20% {-webkit-transform: rotate(-24deg);-ms-transform: rotate(-24deg);transform: rotate(-24deg);}

28% {-webkit-transform: rotate(24deg);-ms-transform: rotate(24deg);transform: rotate(24deg);}

30% {-webkit-transform: rotate(24deg);-ms-transform: rotate(24deg);transform: rotate(24deg);}

38% {-webkit-transform: rotate(-24deg);-ms-transform: rotate(-24deg);transform: rotate(-24deg);}

40% {-webkit-transform: rotate(-24deg);-ms-transform: rotate(-24deg);transform: rotate(-24deg);}

48% {-webkit-transform: rotate(24deg);-ms-transform: rotate(24deg);transform: rotate(24deg);}

50% {-webkit-transform: rotate(24deg);-ms-transform: rotate(24deg);transform: rotate(24deg);}

58% {-webkit-transform: rotate(-24deg);-ms-transform: rotate(-24deg);transform: rotate(-24deg);}

60% {-webkit-transform: rotate(-24deg);-ms-transform: rotate(-24deg);transform: rotate(-24deg);}

68% {-webkit-transform: rotate(24deg);-ms-transform: rotate(24deg);transform: rotate(24deg);}

75% {-webkit-transform: rotate(0deg);-ms-transform: rotate(0deg);transform: rotate(0deg);}

}

 

div > ul > li > i:hover + a > i,  

div > ul > li > a:hover > i {

-webkit-animation: shake 1s ease;

animation: shake 1s ease ;

transform-origin-x: 90%;

transform-origin-y: 35%;

transform-origin-z: initial;

}

 

 

</style>

 

 

<script>

document.addEventListener("DOMContentLoaded", function(event) {

 

let btnExpand = document.getElementById('id_expand');

let btnCollapse = document.getElementById('id_collapse');

 

btnExpand.innerHTML = '<div id="close-sidebar"> <i class="fas fa-times"></i></div>';

btnCollapse.innerHTML = '<div id="show-sidebar"> <i class="fas fa-bars"></i></div>';

 

// Div del Encabezado del menú

let divEnc = btnExpand.parentNode;

let divMenu = document.getElementById('main_menutree_table');

 

let divFotoarea = divMenu.insertAdjacentElement('beforebegin' ,document.createElement("div"));

divFotoarea.setAttribute("class", "sidebar-header");

divFotoarea.setAttribute("id", "divFotoarea");

 

// Acondicionar área de imagen del usuario.

divFotoarea.innerHTML  = '<div class="user-pic"><img id="user_foto"'+

' src="https://raw.githubusercontent.com/azouaoui-med/pro-sidebar-template/gh-pages/src/img/user.jpg"'+

' alt="User picture"></div>'+

' <div class="user-info"> '+

' <span class="user-name">Jhon <strong>Smith</strong></span>'+

' <span class="user-role">Administrator</span>'+

' <span class="user-status"><i class="fa fa-circle"></i><span>Online</span></span>'+

' </div>';

 

 

// Agregar boton que mostrará el menú despues de ser escondido

let btnShowMenu = document.querySelector("body").appendChild(document.createElement("div"));

btnShowMenu.setAttribute("id", "divbtnshowmenu");

btnShowMenu.setAttribute("class", "hidebtn");

 

 

btnShowMenu.innerHTML  = '<a href="#" onclick="collapseMenu();collapseMenu_ex();">'+

' <i class="fas fa-bars">'+

' </i></a>';

 

// Agregar comportamiento a los botones de mostrar y esconder menú

btnExpand.addEventListener("click", expandMenu_ex);

btnCollapse.addEventListener("click", collapseMenu_ex);

 

//a cada item con opciones del menú, agregar el expandmenu_ex solo para moviles  

var oldonclick ='';

let opciones = document.querySelectorAll("a.scMenuTItem");

opciones.forEach(function(miOpcion) {

oldonclick = miOpcion.getAttribute("onclick")+"expandMenu_mobile();";

miOpcion.setAttribute('onclick',oldonclick)

});

 

//$("#divbtnshowmenu").hide();

});

 

// Para extender la funcionalidad del menú expandir

function expandMenu_ex() {

$("body > div.ui-layout-north.ui-layout-pane.ui-layout-pane-north").hide();

$("#divbtnshowmenu").removeClass("hidebtn");

}

 

// Para extender la funcionalidad del menú expandir

function collapseMenu_ex() {

$("body > div.ui-layout-north.ui-layout-pane.ui-layout-pane-north").show();

$("#divbtnshowmenu").addClass("hidebtn");

}

 

function expandMenu_mobile() {

if (typeof window.orientation !== 'undefined') { 

$("body > div.ui-layout-north.ui-layout-pane.ui-layout-pane-north").hide();

$("#divbtnshowmenu").removeClass("hidebtn");

}

}

</script>

<?php

 

7.- Acuérdate de colocar muebles en la casa (Los Items del Menú):

05_sidebar.png

8.- Si todo marcha bien debería verse de esta forma, y debería poder esconder el menú al presionar el botón de cerrado.


06_sidebar.png

Espero que esto sea de ayuda, el uso de este menú conlleva el compromiso de publicar en este mismos hilo las mejoras que los beneficiarios de este aporte pudieren ir aplicando en su desarrollo, puesto que esta técnica viene siendo un inicio en la personalización de los menú para llevar nuestras aplicaciones a un nivel envidiable.



 

Miguel Angel Cortés Díaz

unread,
May 16, 2020, 9:30:44 AM5/16/20
to Comunidad ScriptCase Latino
Hola compañeros de SC.... primer aporte que hago sobre este maravilloso menú que hizo Fausto.
Me puse a configurar la foto para que aparezca la del usuario que ha entrado de esta manera.

Previamente en la tabla de usuarios he puesto la foto para que el usuario pueda meter su foto y la guardo en "../_lib/img/"
Delante de todo lo que hay en onLoad rescato en una variable la ruta y nombre de la foto y el nombre del usuario. Sino existiera dejo la que nos viene por defecto.

sc_lookup(rs,"select foto, name from seg_users where login='[usr_login]'","conn_mysql");
$foto={rs[0][0]};
$name={rs[0][1]};
if($foto==null) {
}else{
$foto="../_lib/img/".$foto;
if(file_exists($foto)){
$imagen=$foto;
}else{
}
}


Y simplemente tengo que ir al apartado donde se carga la foto del html y hacer un echo de esta manera:

' src="<?php echo $imagen;?>"'+
' <span class="user-name"><strong><?php echo $name;?></strong></span>'+

Fausto

unread,
May 16, 2020, 9:46:15 AM5/16/20
to Comunidad ScriptCase Latino
Al aporte de Miguel Angel

Le Cambiaría esta linea de código
$foto="../_lib/img/".$foto;

por esta
$foto=$this->Ini->path_img_global."/".$foto;

Para que utilice una ruta relativa y así funcione igual tanto en desarrollo como en producción.

code bry

unread,
Jun 8, 2020, 7:27:46 PM6/8/20
to Comunidad ScriptCase Latino
Tengo una duda si llego a tener en el submenú mas items esto es posible ?

Miguel Angel Cortés Díaz

unread,
Jun 21, 2020, 6:34:41 AM6/21/20
to Comunidad ScriptCase Latino
Hola Fausto...
He añadido esto para que funcione el scroll
En la apartado Style dentro de   body > div.ui-layout-west   le cambiamos  overflow: auto;  y despues de ese div le añadimos

.ui-layout-west p:not(:last-child) {
  margin-bottom: 1rem;
}

/* Tamaño del scroll */
.ui-layout-west::-webkit-scrollbar {
  width: 8px;
  height: 8px;
}

 /* Estilos barra (thumb) de scroll */
.ui-layout-west::-webkit-scrollbar-thumb {
  /*background: #ccc; */
  background: #637293;
  border-radius: 4px;
}

.ui-layout-west::-webkit-scrollbar-thumb:active {
  background-color: #999999;
}

.ui-layout-west::-webkit-scrollbar-thumb:hover {
  background: #b3b3b3;
  box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.2);
}

 /* Estilos track de scroll */
.ui-layout-west::-webkit-scrollbar-track {
  background: #e1e1e1;
  border-radius: 4px;
}

.ui-layout-west::-webkit-scrollbar-track:hover, 
.ui-layout-west::-webkit-scrollbar-track:active {
  background: #d4d4d4;
}


Quedará un bonito scroll con barritas redondeadas.

Fausto

unread,
Jun 21, 2020, 6:14:29 PM6/21/20
to Comunidad ScriptCase Latino
Saludos a Todos!

Muchas gracias a Miguel Ángel por por compartir los códigos CSS para activar el Scroll del Menú.

Ya que todos estamos muy animado con el tema del menú, utilizando los códigos que Dejo Miguel Ángel, Con un pequeño ajuste, para hacer que el Scroll no afecte el área de la foto, aquí le dejo el código:

Para que el código funcione de forma adecuada debes de dejar el "overflow : hidden" para el selector  "body > div.ui-layout-west " , puesto que ya ese no será el bloque que activará el scroll.

/* **************************************** */
/* Scroll del Árbol del Ménu                */
/* **************************************** */
#css3menut {
position:absolute;
top: 102px;
overflow:auto; 

/* Firefox */
height: -moz-calc(100% - 140px);
/* WebKit */
height: -webkit-calc(100% - 140px);
/* Opera */
height: -o-calc(100% - 140px);
/* Standard */
height: calc(100% - 140px)
}

#css3menut p:not(:last-child) {
margin-bottom: 1rem;
}

/* Tamaño del scroll */
#css3menut::-webkit-scrollbar {
width: 8px;
height: 8px;
}

/* Estilos barra (thumb) de scroll */
#css3menut::-webkit-scrollbar-thumb {
/*background: #ccc; */
background: #637293;
border-radius: 4px;
}

#css3menut::-webkit-scrollbar-thumb:active {
background-color: #999999;
}

#css3menut::-webkit-scrollbar-thumb:hover {
background: #b3b3b3;
box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.2);
}

/* Estilos track de scroll */
#css3menut::-webkit-scrollbar-track {
background: #e1e1e1;
border-radius: 4px;
}

#css3menut::-webkit-scrollbar-track:hover, 
#css3menut::-webkit-scrollbar-track:active {
background: #d4d4d4;
}
/* **************************************** */
/* **************************************** */


Si alguien más se anima el próximo paso sería hacer una barra de botones y notificaciones al pie del menú, ahí dejo el reto!!!!    

Javier Mendoza Jaimes

unread,
Jul 2, 2020, 6:07:12 PM7/2/20
to Comunidad ScriptCase Latino
como hago para probar con SC, o solo puedo modificar codigo ya publicado en ele web server?.. imagino que es la unica por que al generar o ejecutar programa sobre entorno SC me borra las modificaciones
Reply all
Reply to author
Forward
0 new messages