{# 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 %}