Design en Frame + Footer avec le Menu de F$B33

Bonjour à tous,

J’avais commencé a posté dans le post initiale mais afin de ne pas le polluer, et sur recommandation de @noBru77 je vais poursuivre mes péripéties ici !

Le but est simple !

  • Mon menu en faut, dimension 1280x80
  • Contenu au centre, dimension 1280x570
  • Footer en bas, dimension 1280x150

    Ce qui nous fait donc un espace de 1280x800 qui correspond à la résolution de ma tablette.

Pour y parvenir, j’ai donc créé 3 HTMLDisplay (Menu, Contenu, Footer) que voilà !

Menu

<!-- 
    @noodom / Menu F$B33 : ajout de la gestion des boutons par fichier JSon 
    - reprise du menu FSB33 simplifié par @salvialf en ajoutant la gestion des boutons par un paramétrage JSon

    - il n'y a plus besoin de modifier le code : seul le fichier perso.json est à adapter à son menu
    - pour valider que le fichier perso.json est correct :
        - copier son contenu ici : https://jsonlint.com/
        - cliquer sur 'Validate JSON'
        - le résultat sous Result doit être vert avec le message 'Valid JSON'
-->

<link href="montheme/menuJsonFsb33Frame/css/perso.css" rel="stylesheet" type="text/css">

<div class="menu_top">
</div>

<script>
    $(document).ready(function () {
        let menuTop = $('.menu_top');
        menuTop.append('Chargement du menu..');

        $.getJSON('montheme/menuJsonFsb33Frame/json/perso.json' + '?v=' + (new Date()).getTime(), function (data) {
            let buttons = data.buttons.map(function (button) {
                    return '<a id="' + button.link + '" onClick="gotoPlan(this.id,' + button.footer + ')">'
                        + '<li class="monmenu">'
                            + '<div class="imagette"><img src="' + button.icon + '" height=50px width=50px></div></br>'
                        + '</li>'
                    + '</a>';
            });

            menuTop.empty();

            if (buttons.length) {
                let listButtons = buttons.join(' ');
                let menuList = $('<ul class="monmenu" />').html(listButtons);
                menuTop.append(menuList);
            }

            let planID = '#' + (location.search.split('plan_id' + '=')[1] || '').split('&')[0];
            $(planID + ' li').addClass('selected'); // selected = classe CSS sur élément actif
        })
    });

    function gotoPlan(id, idFooter) {
		let urlDestination = getUrlDestination(id);
		let urlDestinationFooter = getUrlDestination(idFooter);
		
		// get frame in htmlDisplay equipment
		let frameDestination = document.getElementById('menuFrame');
		let frameDestinationFooter = document.getElementById('menuFooter');

		if (frameDestination == null) {
			// no frame : page redirection
			planHeader_id = id;
			displayPlan();
		}
		else {
			// display focus
			$('.monmenu').removeClass('selected');
			$('#' + id + ' li').addClass('selected');

			// frame redirection
			if (frameDestination.src.split('?')[1] != urlDestination.split('?')[1]) {
				frameDestination.src = urlDestination;
			}
			// frame footer redirection
			if (frameDestinationFooter.src.split('?')[1] != urlDestinationFooter.split('?')[1]) {
				frameDestinationFooter.src = urlDestinationFooter;
			}
		}
	}
</script>

Contenu

<iframe id="menuFrame" src="about:blank" style="width:100%;height:100%;border:none;"/>

Footer

<iframe id="menuFooter" src="about:blank" style="width:100%;height:100%;border:none;"/>

Coté perso.json, voilà ce que j’ai !

{
    "buttons": [
        {
            "link": "25",
            "icon": "montheme/menuJsonFsb33Frame/img/icon_home.png",
            "footer" : "29"
        },
        {
            "link": "26",
            "icon": "montheme/menuJsonFsb33Frame/img/icon_light.png",
            "footer" : "29"
        },
        {
            "link": "27",
            "icon": "montheme/menuJsonFsb33Frame/img/icon_camera.png",
            "footer" : "29"
        },
        {
            "link": "28",
            "icon": "montheme/menuJsonFsb33Frame/img/icon_camera.png",
            "footer" : "29"
        }
      ],
 
  "parameters": {
        "menu_x": "0px",
        "menu_y": "0px",
        "menu_width": "1280px",
        "menu_height": "80px",
        "content_x": "0px",
        "content_y": "80px",
        "content_width": "1280px",
        "content_height": "570px",
        "foot_x": "0px",
        "foot_y": "570px",
        "foot_width": "1280px",
        "foot_height": "150px"
     }
}

Perso.css

div.menu_top {
    width: 1280px;
    height: 70px;
    background-color: rgba(0, 0, 0, 0.6);
    #border-bottom: 2px solid rgba(0, 0, 0, 1);
}

ul.monmenu ul.monmenu_sep {
    list-style-type: none;
    color: rgba(255, 255, 255, 0.8);
    font-family: Roboto;
    font-size: 16px;
    font-weight: normal;
}

li.monmenu {
    display: inline-block;
    width: 100px;
    margin-left: -5px;
    text-align: center;
    height: 70px;
    padding-top: 10px;
    border-right: 1px solid rgba(255, 255, 255, 0.3);
    background-color: rgba(0, 0, 0, 0.2);
}

div.imagette {
    text-align: center;
    margin-bottom: 5px;
    opacity: 0.8;
}

li.monmenu:hover {
    background-color: rgba(255, 255, 255, 0.2);
}

li.selected {
    display: inline-block;
    width: 100px;
    margin-left: -5px;
    text-align: center;
    height: 70px;
    padding-top: 10px;
    border-left: 1px solid rgba(255, 255, 255, 0.3);
    border-right: 1px solid rgba(255, 255, 255, 0.3);
    background-color: rgba(255, 255, 255, 0.2);
}

li.monmenu_sep {
    display: inline-block;
    width: 100px;
    margin-left: -5px;
    text-align: center;
    height: 70px;
    padding-top: 10px;
    border-right: 1px solid rgba(0, 0, 0, 0.3);
}

div.bouton {
    opacity: 1;
}

div.bouton:hover {
    opacity: 0.5;
}

Voilà ! merci pour cotre aide, j’ai le cerveau en ébullition ! ^^

Premier retour rapide : il y a un souci dans le json pour la position y du footer. il faut ajouter la hauteur du menu et du contenu.
Là tu as que la hauteur du contenu (570)

Sinon le code que j’avais donné pour @noBru77 était une première version pour faire ce qu’il souhaitait.
Il doit être complété par des tests supplémentaires pour ne pas faire planter la page : ex, pas de frame footer ajoutée dans le design. Il faut le vérifier dans le code.

Ça n’empêche pas de fonctionner si tout est bien créé mais je l’ajouterai.

Je vais regarder pour faire une version complète sur mon github, ce sera plus simple que de regarder toutes les adaptations de chacun😉

2 « J'aime »

@tonejay,

Je vais y jeter un oeil et t’aider. Tu auras un retour cet après-midi ou ce soir.

Mets aussi ton CSS.

@+

1 « J'aime »

@tonejay premier test à faire avec ta version actuelle que tu as installée :
Fais F12 pour ouvrir le debugger puis CTRL-F5 pour recharger ta page et regarde si tu as des erreurs dans la console du debugger.
Ca pourra te donner un piste sur le problème.

"foot_x": "0px",
"foot_y": "570px",
"foot_width": "1280px",
"foot_height": "150px"

Tout y est non?

Je peux dejà voir ca…

DevTools failed to load SourceMap: Could not load content for http://xxx.xxx.x.xxx/3rdparty/jquery.contextMenu/jquery.contextMenu.min.js.map: HTTP error: status code 404, net::ERR_HTTP_RESPONSE_CODE_FAILURE

Si je clic sur un bouton du menu

Uncaught ReferenceError: getUrlDestination is not defined
    at gotoPlan (<anonymous>:29:24)
    at HTMLAnchorElement.onclick (index.php?v=d&p=plan&plan_id=24:1)
gotoPlan @ VM1403:29
onclick @ index.php?v=d&p=plan&plan_id=24:1

J’ai aussi cette erreur direct sur l’interface Jeedom lorsque je clic un bouton

Uncaught ReferenceError: getUrlDestination is not defined

Le CSS est ajouté dans le post original ! merci !

Oui mais tu superposes ton footer sur le contenu.
Ou il se retrouve dessous selon le z-index…

Exact, il doit démarer a 650px normalement. C’est corrigé ! Le footer doit aussi etre en niveau 3 ?

Ça doit pas gêner, les 3 htmlDisplay ne se superposent pas dans ton cas.

Les z-index sont importants quand le menu est positionné sur le contenu.

Voici ce que j’obtiens: ti avais quelques erreurs dans tes fichiers, notament dans le htmlDisplay Menu.

MENU:

<!-- 
	@noodom / Menu menuJsonFsb33Frame : menu F$B33 avec gestion des boutons par fichier JSon et navigation par frame
	- reprise du menu F$B33 simplifié par @salvialf
	- ajout de la gestion des boutons par un paramétrage JSon
	- ajout de la navigation par frame à l'aide de htmlDisplay

Installation du menu : https://github.com/noodom/jeedom_menus/blob/master/menuJsonFsb33Frame/README.md

-->

<link href="montheme/menuJsonFsb33Frame/css/perso.css" rel="stylesheet" type="text/css">

<div class="menu_top">
</div>

<script id="menuCreation-js">
	$(document).ready(function () {
		let menuTop = $('.menu_top');
		let link_id = (location.search.split('link_id' + '=')[1] || '').split('&')[0];
		menuTop.append('Chargement du menu..');

		$.getJSON('montheme/menuJsonFsb33Frame/json/perso.json' + '?v=' + (new Date()).getTime(), function (data) {
			let buttons = data.buttons.map(function (button) {
                return '<a id="' + button.link + '" onClick="gotoPlan(this.id,' + button.footer + ')">'
				     + '<li class="monmenu">'
					 + '<div class="imagette"><img src="' + button.icon + '" height=50px width=50px></div></br>'
					 + '</li>'
					 + '</a>';
			});

			menuTop.empty();

			if (buttons.length) {
				let listButtons = buttons.join(' ');
				let menuList = $('<ul class="monmenu" />').html(listButtons);
				menuTop.append(menuList);
			}

			if (data.parameters) {
				// menu parameters
				let htmlDisplayId = '[data-eqlogic_id="#id#"]';
				$(htmlDisplayId)[0].style.left = data.parameters.menu_x ? data.parameters.menu_x : "0px";
				$(htmlDisplayId)[0].style.top = data.parameters.menu_y ? data.parameters.menu_y : "0px";
				$(htmlDisplayId)[0].style.width = data.parameters.menu_width ? data.parameters.menu_width : "1280px";
				$(htmlDisplayId)[0].style.height = data.parameters.menu_height ? data.parameters.menu_height : "80px";

				// frame parameters
				$("#menuFrame").offsetParent().style().left = data.parameters.content_x ? data.parameters.content_x : "0px";
				$("#menuFrame").offsetParent().style().top = data.parameters.content_y ? data.parameters.content_y : "80px";
				$("#menuFrame").offsetParent().style().width = data.parameters.content_width ? data.parameters.content_width : "1280px";
				$("#menuFrame").offsetParent().style().height = data.parameters.content_height ? data.parameters.content_height : "580px";

              // footer frame parameters
				$("#menuFooter").offsetParent().style().left = data.parameters.footer_x ? data.parameters.footer_x : "0px";
				$("#menuFooter").offsetParent().style().top = data.parameters.footer_y ? data.parameters.footer_y : "650px";
				$("#menuFooter").offsetParent().style().width = data.parameters.footer_width ? data.parameters.footer_width : "1280px";
				$("#menuFooter").offsetParent().style().height = data.parameters.footer_height ? data.parameters.footer_height : "150px";
			}

			let frameDestination = document.getElementById('menuFrame');
			if (frameDestination == null) {
				// no frame navigation : focus on button with url parameter plan_id as id
				let planID = '#' + (location.search.split('plan_id' + '=')[1] || '').split('&')[0];
				$(planID + ' li').addClass('selected'); // selected = classe CSS sur élément actif
			}
			else {
				if (link_id == "") {
					// frame navigation : set focus on first button 
					$('#' + data.buttons[0].link + ' li').click();
				}
				else {
					// frame navigation : goto design id (url parameter link_id)
					gotoPlan(link_id);
				}
			}
		});
	});

	// create url destination
	function getUrlDestination(urlParam) {
		if (isNaN(urlParam)) {
			return urlParam;
		} else {
			return 'index.php?v=d&p=plan&plan_id=' + urlParam + '&fullscreen=1';
		}
	}
  
 	// menu redirection
  	function gotoPlan(id, idFooter) {
		let urlDestination = getUrlDestination(id);
		let urlDestinationFooter = getUrlDestination(idFooter);
		
		// get frame in htmlDisplay equipment
		let frameDestination = document.getElementById('menuFrame');
		let frameDestinationFooter = document.getElementById('menuFooter');

		if (frameDestination == null) {
			// no frame : page redirection
			planHeader_id = id;
			displayPlan();
		}
		else {
			// display focus
			$('.monmenu').removeClass('selected');
			$('#' + id + ' li').addClass('selected');

			// frame redirection
			if (frameDestination.src.split('?')[1] != urlDestination.split('?')[1]) {
				frameDestination.src = urlDestination;
			}
			// frame footer redirection
			if (frameDestinationFooter.src.split('?')[1] != urlDestinationFooter.split('?')[1]) {
				frameDestinationFooter.src = urlDestinationFooter;
			}
		}
	}
</script>

Fichier PERSO.JSON: à adapter suivant tes IDs

{
    "buttons": [
        {
            "link": "13",
            "icon": "montheme/menuJsonFsb33Frame/img/icon_home.png",
            "footer" : "17"
        },
        {
            "link": "14",
            "icon": "montheme/menuJsonFsb33Frame/img/icon_light.png",
            "footer" : "17"
        },
        {
            "link": "15",
            "icon": "montheme/menuJsonFsb33Frame/img/icon_camera.png",
            "footer" : "17"
        },
        {
            "link": "16",
            "icon": "montheme/menuJsonFsb33Frame/img/icon_camera.png",
            "footer" : "17"
        }
      ],
 
  "parameters": {
        "menu_x": "0px",
        "menu_y": "0px",
        "menu_width": "1280px",
        "menu_height": "70px",
        "content_x": "0px",
        "content_y": "70px",
        "content_width": "1280px",
        "content_height": "580px",
        "footer_x": "0px",
        "footer_y": "650px",
        "footer_width": "1280px",
        "footer_height": "150px"
  }
}

Les html Contenu et Foorter ne changent pas.

1 « J'aime »

Tu as tout de même gentiment viré tous les paramètres de ton fichier MENU. Soit c’est une erreur de copier/coller ici, soit effectivement, tu as tout supprimé.

Voici le résultat:

Yes c good !!! Ca fonctionne ! Un GRAND MERCI !
Je t’avoue que je n’avais plus trop les yeux en face des trous a force de chercher…il manquait du code ds le menu alors ? Et la partie sur le positionnement des frames est indispensable dans le HTML ?

Du coup je poursuit la creation de mes designs et comment avec un fond uniforme avec l’ajout des frames ? J’ai tenté de le mettre sur mon design d’accueil, en mettant les HTMLDisplay en transparent mais ca ne fonctionne pas…
J’ai toujours le fond de mes designs appelés par les menus qui prennent le dessus…

Le positionnement des frames sont normalement à indiquer dans le fichier perso.json. Le fichier CSS décrit le menu. Dans ce CSS il y a la taille des icônes et la taille du menu.
La taille de chaque frame dépend de ton design. Chaque design que tu souhaites afficher dans une frame doit avoir la même taille que ce que tu déclares dans ton fichier perso.json, sinon, les ascenseurs apparaissent.
Tu dois à présent créer des pages de designs que tu souhaites faire apparaitre dans le frame ‹ menuFrame ›. Chaque page doit avoir la taille de 1280 x 580 et se présente comme tu as envie qu’elle se présente. Les paramètres de l’équipements htmlDisplay ne changent rien à l’apparence de la frame. J’espère que je suis claire.
Il faut aussi créer une page de design pour le footer.
Il te faut donc en tout 2 pages de designs pour le menu et footer plus autant de pages de designs que de boutons dans ton menu.

Oui, déjà remonté dans le post initial de mémoire,
Mais il semble y avoir un bug avec la transparence du fond des htmlDisplay . A confirmer je n’ai pas refait de tests depuis quelques temps, mais actuellement il n’est pas possible de définir un fond au design accueillant les 3 htmlDisplay pour qu’il soit commun.

Oui tout ca c’etait déjà pret ! ^^ je poursuit ! Merci !

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.