templates/app-base.html.twig line 1

Open in your IDE?
  1. {# app-base.html.twig template base di app, include favicon, bootstrap, jquery, al momento non ancora google fonts e fontawesome #}
    {% extends "bsjq.html.twig" %}
    {% set loadBar = '<div class="w-100 text-center"><div class="spinner-border text-primary" role="status"><span class="sr-only">Caricamento...</span></div></div>' %}
    {% block pagejs %}
        {# Se l'utente è già loggato, importa la gestione di google del logout #}
        {#{% if datiUtente is defined %}
        <script nonce="S2GScr1pt" src="https://apis.google.com/js/platform.js" async defer></script>
        {% endif %}
        {# Fine Google Logout import #}
    {% endblock %}
    {% block body %}
        {# Topbar con logo di app, idealmente presente su qualsiasi pagina di app #}
        {#<div id="topbarWrapper" class="w-100 container gx-0 d-flex justify-content-center align-items-center">
            <div id="topbar" class="row w-100 justify-content-center align-items-center">#}
    <section id="topbarWrapper" class="sticky-top">
        <div id="topbar" class="container d-flex justify-content-center align-items-center">
            <div class="row w-100 justify-content-center align-items-center">
                <div class="col-12 col-md-3 d-flex justify-content-center justify-content-md-start align-items-center">
                    <a class="navbar-brand text-dark" href="/" title="{{ APPNAME }} v.{{ APPVERSION }}">
                    <img class="img-fluid" srcset="{{ asset("logo/Scan2Go-Logo-173x40.png")}} 1x {{ asset("logo/Scan2Go-Logo-346x80.png") }} 2x {{ asset("logo/Scan2Go-Logo-691x160.png") }} 3x" src={{ asset("logo/Scan2Go-Logo-173x40.png") }} alt="{{ APPNAME }} Logo">
                    {#{% include "inc/logo.html.twig" %}{# svg del logo, incluso #}
                    {#<img class="mr-1" src={{ asset("Scan2Go-Logo-300px.png") }} width="100" height="100" alt="{{ APPNAME }} Favicon">#}
                    {#{{ APPNAME }}{% if titoloBrand is defined %} {{ titoloBrand }}{% endif %}#}</a>
                </div>
                {% block menuBlock %}
                <nav id="{{ APPNAME }}TopNavBar" class="navbar navbar-expand-lg navbar-light row col-12 col-md-9">
                {#<div class="container">#}
                    <button class="navbar-toggler ml-auto" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                        <span class="navbar-toggler-icon "></span>
                        {# aggiunge campanella notifiche se ce n'è almeno una da leggere #}
                        {#{% if notifiche is defined and notifiche.daLeggere is defined and notifiche.daLeggere == true %}#}
                            <i class="fas fa-bell text-warning d-none dispIcoNotif colIcoNotif float-end" id="iconaNotificheMobile"></i>
                        {#{% endif %}#}
                    </button>
                    {% set route_name = app.request.attributes.get('_route') %}{# Per gestire il menu #}
                    <div class="collapse navbar-collapse justify-content-center" id="navbarSupportedContent">
                        {% block incmenu %}{% include "inc/app-menu.html.twig" %}{% endblock %}
                        <div class="my-2 my-lg-0 d-flex flex-direction-column align-items-center justify-content-center">
                            {% if datiUtente is defined %}
                            {# Nome Utente - Ruolo - Lingua - Logout #}
                            {# Soltanto se l'utente è loggato, prepara una navbar supplementare per la scelta del metodo di logout #}
                            <nav id="logoutNav" class="navbar">
                                <ul class="navbar-nav mr-auto">
                                    <li class="nav-item dropdown">
                                        <a class="dropdown-toggle nav-profile-link" href="#" id="logoutDropdown" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                                            <img class="s2g_icona ps-1 pe-1 pe-lg-3 s2g_icona_User" src="{{ asset("images/Scan2Go-User.png") }}" srcset="{{ asset("images/Scan2Go-User.png") }} 1x, {{ asset("images/Scan2Go-User2x.png") }} 2x" alt="{% trans %}Utente{% endtrans %}">
                                            {% if datiUtente['nomeutente'] is defined %} {# Se il nome utente è stato passato #}
                                                Utente
                                            {% endif %}
                                            {#{% if notifiche is defined and notifiche.daLeggere is defined and notifiche.daLeggere == true %}#}
                                                <i class="fas fa-bell text-warning d-none dispIcoNotif colIcoNotif ms-1" id="iconaNotifiche"></i>
                                            {#{% endif %}#}
                                        </a>
                                        <div class="dropdown-menu" aria-labelledby="logoutDropdown">
                                            <div class="d-flex justify-content-center">
                                                <span class="dropdown-item-text my-0 small badge bg-info" title="{{ datiUtente['nomeutentecompleto'] }}">{{ datiUtente['nomeutente']|u.split(' ')[0] }}</span>
                                            </div>
                                            <hr class="dropdown-divider">
                                            <a id="btnModalNotifiche" class="dropdown-item small"><i class="fas fa-bell iconaNotifiche colIcoNotif float-end"></i>{% trans %}Notifiche{% endtrans %}</a>
                                            {% if (is_granted('ROLE_ADMIN')) %}
                                            <a class="dropdown-item small" href="/admin">{% trans %}Impostazioni Sistema{% endtrans %}</a>
                                            <hr class="dropdown-divider">
                                            {% else %}
                                            {% endif %}
                                            <span class="dropdown-item-text my-0 small" href="#">{% trans %}Esci da...{% endtrans %}</span>
                                            <a class="dropdown-item small" href="/logout">{{ APPNAME }}</a>
                                            <a id="logoutGsuite"class="dropdown-item small" href="https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout?continue=https://{{ APPDOMAIN }}/logout">{{ APPNAME }} e GSuite</a>
                                        </div>
                                    </li>
                                </ul>
                            </nav>
                            {% else %}
                                <a href="/login/google" class="nav-link" title="{{ APPNAME }} login">{% trans %}Login{% endtrans %}</a>
                            {% endif %}
                        </div>
                    </div>
                {#</div>#}{# /container #}
                </nav>
                {% endblock %}
            </div>
        </div>
    </section>
        {# Logo di Istituto #}
    
        {# Moduli #}
        {% block moduli %}
        <div class="container">
            <div class="row justify-content-center">
                {#  #}
            </div>
        </div>
        {% endblock %}
        {# Modale per notifiche #}
        <div id="notificationModal" class="modal" tabindex="-1">
            <div class="modal-dialog modal-xl modal-fullscreen-sm-down">
                <div class="modal-content">
                    <div class="modal-header">
                        <h5 class="modal-title">{% trans %}Notifiche{% endtrans %}</h5>
                        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                    </div>
                    <div class="modal-body">
                        {{ loadBar|raw }}
                    </div>
                    <div class="modal-footer">
                        <button id="btnAltreNotifiche" type="button" class="btn btn-primary w-100">Carica Altre...</button>
                    </div>
                </div>
            </div>
        </div>
        {# FINE Modale per notifiche #}
        {# Aggiunta a fine Body, esterna ai moduli #}
        {% block aggiuntaFineBody %}{% endblock %}
    {# chiusura body #}
    {% endblock %}
    
    {# Parte con il javascript utile di pagina #}
    {% block tailjs %}
        {% if datiUtente is defined and datiUtente is not null %}
        {# javascript notifiche #}
        var notificationModal = new bootstrap.Modal(document.getElementById('notificationModal'));
        {% include('js/notification.js.twig') %}
        
        {# Inclusione delle funzioni se l'utente ha ruolo >= admin #}
        {% if (is_granted('ROLE_ADMIN')) %}
        {#  #}
        {% endif %}
        {# fine parte utente ha ruolo >= admin #}
    
    
        {# Definizioni trigger per funzionalità e funzione utente normale #}
        var freeAjax = true; {# definisco un check di controllo globale sulle funzioni ajax, va in false quando c'è un ajax in corso #}
    
        var triggersAccordion = {
            {% if bookmarks is defined and bookmarks|length > 0 %}
            'apertoBook' : true, {# definisco un check di controllo sui Bookmarks, caso in cui i bookmarks sono preaperti #}
            {% else %}
            'apertoBook' : false, {# definisco un check di controllo sui Bookmarks, caso in cui i bookmarks sono chiusi #}
            {% endif %}
            'apertoBookMan' : false, {# definisco un check di controllo sul Manager Bookmarks #}
            'apertoCPVLAN' : false, {# definisco un check di controllo sul Captive Portal VLAN manager #}
            'apertoMT' : false, {# definisco un check di controllo sul Manager #}
            'apertoDNS' : false,{# definisco un check di controllo sul Manager DNS #}
            'apertoTask' : false{# definisco un check di controllo sul Task Scheduler #}
        };
    
        function turnOffTriggersExcept(trigger){ {# Funzione per mettere true sul trigger dell'accordion che si apre e false su tutti gli altri #}
            $.each(triggersAccordion,function(key,value){
                if(key != trigger){
                    triggersAccordion[key] = false;
                }
                else {
                    triggersAccordion[key] = true;
                }
            });
            return true;
        }
    
        {# Session ping per verifica validità sessione Utente #}
        function appSessionPing(){
            $.ajax({
                url:'/ajax/appSessionPing',
                type: "POST",
                dataType: "json",
                success: function(data){
                    console.log("Session Ping Ok");
                    return true;
                },
                error: function(data){
                    console.log("sessione scaduta");
                    if ( confirm('La sessione di {{ APPNAME }} è scaduta, al prossimo click dovrai rieffettuare il login.') ){
                        location.reload();
                    } else {
                        //
                    }
                    return false;
                }
            });
        }
    
        {% if (is_granted('ROLE_OPERATORE')) %}
        {# #}
        {% endif %}
    
        {# INIZIO DOCUMENT READY #}
        $(function () { //apertura document ready
            {% if datiUtente['nomeutentecompleto'] is defined %}
                $('#showUsername').tooltip();
                {# SESSION PING COUNTER #}
                var sessiontime = 1450; //il controllo parte 10 secondi dopo la scadenza della sessione
                var sessionpingid = setInterval(function() {
                    sessiontime = sessiontime - 30;
                    if(sessiontime > 0){
                        {% if APPDEBUG is defined and APPDEBUG %}console.log('{{ APPNAME }} Session Check tempo residuo '+sessiontime);{% endif %}
                    }
                    else {
                        if(!appSessionPing()){
                            //alert('La sessione di {{ APPNAME }} è scaduta, al prossimo click dovrai rieffettuare il login.');
                        }
                        else {
                            sessiontime = 1450; //reimposto il contatore all' inizio
                            {% if APPDEBUG is defined and APPDEBUG %}console.log('{{ APPNAME }} SC verificata, ancora valida, tempo residuo '+sessiontime);{% endif %}
                        }
                    }
                },  30 * 1000); // 60 * 1000 milsec
                {# FINE PARTE SESSION PING COUNTER #}
            {% endif %}
            {# Fine funzione per il signout di google dall'applicativo #}
            {# Inizializzazione Popovers #}
            var popoverTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]'));
            var popoverList = popoverTriggerList.map(function (popoverTriggerEl) {
                return new bootstrap.Popover(popoverTriggerEl), { trigger:'focus' }
            });
            {# Fine inizializzazione Popovers #}
        });
        {# FINE DOCUMENT READY #}
    
        {# INIZIO AJAXCOMPLETE Dopo il completamento qualsiasi chiamata AJAX viene eseguito questo ciclo di funzioni, prettamente il refresh degli event listeners #}
        $( document ).ajaxComplete(function() {
            freeAjax=true; {# Visto che la chiamata Ajax precedente è conclusa, rilibero il check ajax #}
            {# #}
        });
        {# Fine ciclo funzioni post chiamata Ajax #}
    
        {% endif %}
        {% block addtailjs %}{% endblock %}
    {% endblock %}