openstamanager/include/top.php

680 lines
31 KiB
PHP
Raw Normal View History

<?php
2020-09-07 15:04:06 +02:00
/*
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
2021-01-20 15:08:51 +01:00
* Copyright (C) DevCode s.r.l.
2020-09-07 15:04:06 +02:00
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
2024-03-05 16:01:45 +01:00
use Models\Module;
2024-03-22 15:52:24 +01:00
use Util\FileSystem;
2022-07-31 00:51:07 +02:00
2024-05-17 00:32:46 +02:00
include_once __DIR__ . '/../core.php';
$paths = App::getPaths();
$user = Auth::user();
2024-03-20 11:13:28 +01:00
$pageTitle = !empty($pageTitle) ? $pageTitle : $structure->getTranslation('title');
2018-09-19 10:44:32 +02:00
2023-08-04 14:54:28 +02:00
$lang = (empty($lang) || $lang == '|lang|') ? 'it_IT' : $lang;
2022-07-31 19:20:49 +02:00
2018-07-19 17:29:21 +02:00
$messages = flash()->getMessages();
2018-02-04 17:31:33 +01:00
echo '<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
2024-05-17 00:32:46 +02:00
<title>' . $pageTitle . ' - ' . tr('OpenSTAManager') . '</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
2018-06-28 15:52:56 +02:00
<meta name="robots" content="noindex,nofollow">
2024-05-17 00:32:46 +02:00
<meta name="description" content="' . tr('OpenSTAManager, il software gestionale open source per assistenza tecnica e fatturazione elettronica.') . '">
2022-06-21 18:38:39 +02:00
<meta name="author" content="DevCode s.r.l.">
2020-06-30 17:38:19 +02:00
2024-05-17 00:32:46 +02:00
<link href="' . $paths['img'] . '/favicon.png" rel="icon" type="image/x-icon" />';
2024-05-17 00:32:46 +02:00
if (file_exists(base_dir() . '/manifest.json')) {
2019-08-02 10:38:55 +02:00
echo '
2024-05-17 00:32:46 +02:00
<link rel="manifest" href="' . base_path() . '/manifest.json?r=' . random_int(0, mt_getrandmax()) . '">';
2019-08-02 10:38:55 +02:00
}
2018-06-23 15:41:32 +02:00
// CSS
foreach (App::getAssets()['css'] as $style) {
echo '
2024-05-17 00:32:46 +02:00
<link rel="stylesheet" type="text/css" media="all" href="' . $style . '"/>';
2018-06-23 15:41:32 +02:00
}
2018-06-23 15:41:32 +02:00
// Print CSS
foreach (App::getAssets()['print'] as $style) {
echo '
2024-05-17 00:32:46 +02:00
<link rel="stylesheet" type="text/css" media="print" href="' . $style . '"/>';
}
if (Auth::check()) {
echo '
<script>
search = []';
2024-05-17 00:32:46 +02:00
$array = $_SESSION['module_' . $id_module];
if (!empty($array)) {
foreach ($array as $field => $value) {
if (!empty($value) && string_starts_with($field, 'search_')) {
$field_name = str_replace('search_', '', $field);
echo '
2024-05-17 00:32:46 +02:00
search.push("search_' . $field_name . '");
search["search_' . $field_name . '"] = "' . addslashes($value) . '";';
}
}
}
echo '
translations = {';
$translations = [
'day' => tr('Giorno'),
'week' => tr('Settimana'),
'month' => tr('Mese'),
'today' => tr('Oggi'),
'firstThreemester' => tr('I trimestre'),
'secondThreemester' => tr('II trimestre'),
'thirdThreemester' => tr('III trimestre'),
'fourthThreemester' => tr('IV trimestre'),
'firstSemester' => tr('I semestre'),
'secondSemester' => tr('II semestre'),
'thisMonth' => tr('Questo mese'),
'lastMonth' => tr('Mese scorso'),
2021-10-05 11:31:26 +02:00
'nextMonth' => tr('Mese prossimo'),
'thisYear' => tr("Quest'anno"),
'lastYear' => tr('Anno scorso'),
2024-03-19 17:11:54 +01:00
'lastYear_thisYear' => tr("Quest'anno + prec."),
'apply' => tr('Applica'),
'cancel' => tr('Annulla'),
'from' => tr('Da'),
'to' => tr('A'),
'custom' => tr('Personalizzato'),
'delete' => tr('Elimina'),
'deleteTitle' => tr('Sei sicuro?'),
'deleteMessage' => tr('Eliminare questo elemento?'),
2018-08-31 18:06:44 +02:00
'errorTitle' => tr('Errore'),
'errorMessage' => tr("Si è verificato un errore nell'esecuzione dell'operazione richiesta"),
'close' => tr('Chiudi'),
'filter' => tr('Filtra'),
'long' => tr('La ricerca potrebbe richiedere del tempo'),
'details' => tr('Dettagli'),
'loading' => tr('Caricamento'),
'waiting' => tr('Impossibile procedere'),
2022-02-05 22:37:45 +01:00
'waitingMessage' => tr('Prima di proseguire devi selezionare alcuni elementi.'),
2019-05-24 21:36:35 +02:00
'hooksExecuting' => tr('Hooks in esecuzione'),
2019-05-17 05:56:10 +02:00
'hookExecuting' => tr('Hook "_NAME_" in esecuzione'),
'hookMultiple' => tr('Hai _NUM_ notifiche'),
'hookSingle' => tr('Hai 1 notifica'),
'hookNone' => tr('Nessuna notifica'),
2022-02-05 22:37:45 +01:00
'singleCalendar' => tr("E' presente un solo periodo."),
'noResults' => tr('Nessun elemento trovato'),
2022-02-05 22:37:45 +01:00
'signatureMissing' => tr('Firma mancante.'),
];
foreach ($translations as $key => $value) {
echo '
2024-05-17 00:32:46 +02:00
' . $key . ': "' . addslashes($value) . '",';
}
echo '
allegati: {
2024-05-17 00:32:46 +02:00
messaggio: "' . tr('Clicca o trascina qui per caricare uno o più file') . '",
maxFilesize: "' . tr('Dimensione massima: _SIZE_ MB') . '",
errore: "' . tr('Errore') . '",
modifica: "' . tr('Modifica allegato') . '",
elimina: "' . tr('Vuoi eliminare questo file?') . '",
procedi: "' . tr('Procedi') . '",
},
ajax: {
"missing": {
2024-05-17 00:32:46 +02:00
"title": "' . tr('Errore') . '",
"text": "' . tr('Alcuni campi obbligatori non sono stati compilati correttamente') . '",
},
"error": {
2024-05-17 00:32:46 +02:00
"title": "' . tr('Errore') . '",
"text": "' . tr('Errore durante il salvataggio del record') . '",
}
},
2019-08-02 15:58:31 +02:00
password: {
2024-05-17 00:32:46 +02:00
"wordMinLength": "' . tr('La password è troppo corta') . '",
"wordMaxLength": "' . tr('La password è troppo lunga') . '",
"wordInvalidChar": "' . tr('La password contiene un carattere non valido') . '",
"wordNotEmail": "' . tr('Non usare la tua e-mail come password') . '",
"wordSimilarToUsername": "' . tr('La password non può contenere il tuo nome') . '",
"wordTwoCharacterClasses": "' . tr('Usa classi di caratteri diversi') . '",
"wordRepetitions": "' . tr('La password contiene ripetizioni') . '",
"wordSequences": "' . tr('La password contiene sequenze') . '",
"errorList": "' . tr('Attenzione') . ':",
"veryWeak": "' . tr('Molto debole') . '",
"weak": "' . tr('Debole') . '",
"normal": "' . tr('Normale') . '",
"medium": "' . tr('Media') . '",
"strong": "' . tr('Forte') . '",
"veryStrong": "' . tr('Molto forte') . '",
2019-07-19 09:32:50 +02:00
},
2019-08-02 15:58:31 +02:00
datatables: {
2024-05-17 00:32:46 +02:00
"emptyTable": "' . tr('Nessun dato presente nella tabella') . '",
"info": "' . tr('Vista da _START_ a _END_ di _TOTAL_ elementi') . '",
"infoEmpty": "' . tr('Vista da 0 a 0 di 0 elementi') . '",
"infoFiltered": "(' . tr('filtrati da _MAX_ elementi totali') . ')",
2019-08-02 15:58:31 +02:00
"infoPostFix": "",
2024-05-17 00:32:46 +02:00
"lengthMenu": "' . tr('Visualizza _MENU_ elementi') . '",
2019-08-02 15:58:31 +02:00
"loadingRecords": " ",
2024-05-17 00:32:46 +02:00
"processing": "' . tr('Elaborazione') . '...",
"search": "' . tr('Cerca') . ':",
"zeroRecords": "' . tr('La ricerca non ha portato alcun risultato') . '.",
2019-08-02 15:58:31 +02:00
"paginate": {
2024-05-17 00:32:46 +02:00
"first": "' . tr('Inizio') . '",
"previous": "' . tr('Precedente') . '",
"next": "' . tr('Successivo') . '",
"last": "' . tr('Fine') . '"
2019-08-02 15:58:31 +02:00
},
},
};
globals = {
2024-05-17 00:32:46 +02:00
rootdir: "' . base_path() . '",
js: "' . $paths['js'] . '",
css: "' . $paths['css'] . '",
img: "' . $paths['img'] . '",
2018-02-23 09:49:31 +01:00
2024-05-17 00:32:46 +02:00
id_module: "' . $id_module . '",
id_record: "' . $id_record . '",
2020-06-30 17:38:19 +02:00
2024-05-17 00:32:46 +02:00
is_mobile: ' . isMobile() . ',
2018-02-23 09:49:31 +01:00
2024-05-17 00:32:46 +02:00
cifre_decimali: ' . setting('Cifre decimali per importi') . ',
2018-02-23 09:49:31 +01:00
2024-05-17 00:32:46 +02:00
timestamp_format: "' . formatter()->getTimestampPattern() . '",
date_format: "' . formatter()->getDatePattern() . '",
time_format: "' . formatter()->getTimePattern() . '",
decimals: "' . formatter()->getNumberSeparators()['decimals'] . '",
thousands: "' . formatter()->getNumberSeparators()['thousands'] . '",
currency: "' . currency() . '",
2018-02-23 09:49:31 +01:00
search: search,
translations: translations,
2024-05-17 00:32:46 +02:00
locale: "' . explode('_', $lang)[0] . '",
full_locale: "' . $lang . '",
2018-02-23 09:49:31 +01:00
2024-05-17 00:32:46 +02:00
start_date: "' . $_SESSION['period_start'] . '",
start_date_formatted: "' . Translator::dateToLocale($_SESSION['period_start']) . '",
end_date: "' . $_SESSION['period_end'] . '",
end_date_formatted: "' . Translator::dateToLocale($_SESSION['period_end']) . '",
minute_stepping: ' . setting('Numero di minuti di avanzamento delle sessioni delle attività') . ',
2018-02-23 09:49:31 +01:00
2024-05-17 00:32:46 +02:00
collapse_plugin_sidebar: ' . intval(setting('Nascondere la barra dei plugin di default')) . ',
2018-02-23 09:49:31 +01:00
ckeditorToolbar: [
2022-07-31 02:59:22 +02:00
["Undo","Redo","-","Cut","Copy","Paste","PasteText","PasteFromWord","-","SpellChecker", "Scayt", "-","Link","Unlink","-","Bold","Italic","Underline","Superscript","SpecialChar","HorizontalRule","-","JustifyLeft","JustifyCenter","JustifyRight","JustifyBlock","-","NumberedList","BulletedList","Outdent","Indent","Blockquote","-","Styles","Format","Image","Table", "TextColor", "BGColor", "EmojiPanel" ],
2018-02-23 09:49:31 +01:00
],
ckeditorToolbar_Full: [
2021-10-25 16:39:37 +02:00
{ name: "document", items : [ "Source", "ExportPdf", "Preview", "Print", "-", "Templates" ] },
{ name: "clipboard", items : [ "Cut","Copy","Paste","PasteText","PasteFromWord","-","Undo","Redo" ] },
{ name: "editing", items : [ "Find","Replace","-","SelectAll","-","SpellChecker", "Scayt" ] },
{ name: "forms", items : [ "Form", "Checkbox", "Radio", "TextField", "Textarea", "Select", "Button", "ImageButton",
"HiddenField" ] },
"/",
2021-10-25 16:39:37 +02:00
{ name: "basicstyles", items : [ "Bold","Italic","Underline","Strike","Subscript","Superscript","-","CopyFormatting","RemoveFormat" ] },
{ name: "paragraph", items : [ "NumberedList","BulletedList","-","Outdent","Indent","-","Blockquote","CreateDiv",
2021-10-25 16:39:37 +02:00
"-","JustifyLeft","JustifyCenter","JustifyRight","JustifyBlock","-","BidiLtr","BidiRtl","Language" ] },
{ name: "links", items : [ "Link","Unlink","Anchor" ] },
2022-07-31 02:59:22 +02:00
{ name: "insert", items : [ "Image","Flash","Table","HorizontalRule","EmojiPanel","SpecialChar","PageBreak","Iframe" ] },
"/",
{ name: "styles", items : [ "Styles","Format","Font","FontSize" ] },
{ name: "colors", items : [ "TextColor","BGColor" ] },
2021-10-25 16:39:37 +02:00
{ name: "tools", items : [ "Maximize", "ShowBlocks" ] },
{ name: "about", items: [ "About" ] }
],
2024-05-17 00:32:46 +02:00
order_manager_id: "' . ($dbo->isInstalled() ? (new Module())->getByField('title', 'Stato dei servizi', Models\Locale::getPredefined()->id) : '') . '",
dataload_page_buffer: ' . setting('Lunghezza in pagine del buffer Datatables') . ',
tempo_attesa_ricerche: ' . setting('Tempo di attesa ricerche in secondi') . ',
restrict_summables_to_selected: ' . setting('Totali delle tabelle ristretti alla selezione') . ',
snapDuration: "' . setting('Tempo predefinito di snap attività sul calendario') . '"
};
</script>';
} else {
echo '
2018-07-09 10:44:54 +02:00
<script>
globals = {
2024-05-17 00:32:46 +02:00
rootdir: "' . base_path() . '",
2020-06-30 17:38:19 +02:00
2019-07-08 12:41:37 +02:00
search: {},
2019-07-19 09:32:50 +02:00
translations: {
password: {
2024-05-17 00:32:46 +02:00
"wordMinLength": "' . tr('La tua password è troppo corta') . '",
"wordMaxLength": "' . tr('La tua password è troppo lunga') . '",
"wordInvalidChar": "' . tr('La tua password contiene un carattere non valido') . '",
"wordNotEmail": "' . tr('Non usare la tua e-mail come password') . '",
"wordSimilarToUsername": "' . tr('La tua password non può contenere il tuo nome') . '",
"wordTwoCharacterClasses": "' . tr('Usa classi di caratteri diversi') . '",
"wordRepetitions": "' . tr('Troppe ripetizioni') . '",
"wordSequences": "' . tr('La tua password contiene sequenze') . '",
"errorList": "' . tr('Errori') . ':",
"veryWeak": "' . tr('Molto debole') . '",
"weak": "' . tr('Debole') . '",
"normal": "' . tr('Normale') . '",
"medium": "' . tr('Media') . '",
"strong": "' . tr('Forte') . '",
"veryStrong": "' . tr('Molto forte') . '",
2019-07-19 09:32:50 +02:00
},
},
2020-06-30 17:38:19 +02:00
2024-05-17 00:32:46 +02:00
timestamp_format: "' . formatter()->getTimestampPattern() . '",
date_format: "' . formatter()->getDatePattern() . '",
time_format: "' . formatter()->getTimePattern() . '",
2019-08-02 15:58:31 +02:00
2024-05-17 00:32:46 +02:00
locale: "' . explode('_', $lang)[0] . '",
full_locale: "' . $lang . '",
2018-07-09 10:44:54 +02:00
};
</script>';
}
2018-06-23 15:41:32 +02:00
// JS
foreach (App::getAssets()['js'] as $js) {
echo '
2024-05-17 00:32:46 +02:00
<script type="text/javascript" charset="utf-8" src="' . $js . '"></script>';
}
// Impostazioni di default per gli alert
echo '
<script>
swal.setDefaults({
buttonsStyling: false,
confirmButtonClass: "btn btn-lg btn-primary",
cancelButtonClass: "btn btn-lg",
2024-05-17 00:32:46 +02:00
cancelButtonText: "' . tr('Annulla') . '",
});
</script>';
2018-07-02 16:56:00 +02:00
if (Auth::check()) {
2018-07-09 10:44:54 +02:00
if (setting('Abilita esportazione Excel e PDF')) {
2018-07-02 16:56:00 +02:00
echo '
<script type="text/javascript" charset="utf-8" src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script>
<script type="text/javascript" charset="utf-8" src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.9/pdfmake.min.js"></script>
<script type="text/javascript" charset="utf-8" src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.9/vfs_fonts.min.js"></script>';
2018-07-02 16:56:00 +02:00
}
2020-02-20 02:02:01 +01:00
if (setting('Attiva scorciatoie da tastiera')) {
2024-05-17 00:32:46 +02:00
echo '<script type="text/javascript" charset="utf-8" src="' . App::getPaths()['js'] . '/hotkeys-js/hotkeys.min.js?v=' . $version . '"></script>';
2020-02-20 02:02:01 +01:00
echo '
<script>
hotkeys("f1,f2,f3,f4", function(event, handler) {
switch (handler.key) {
case "f1":
event.preventDefault();
$("button[data-toggle]").first().trigger("click");
break;
case "f2":
event.preventDefault();
$("#save").first().trigger("click");
break;
case "f3":
event.preventDefault();
window.open($("#print-button_p").first().attr("href"));
break;
case "f4":
event.preventDefault();
$("#email-button_p").first().trigger("click");
break;
default: alert(event);
}
2020-02-20 02:02:01 +01:00
});
2020-02-20 02:02:01 +01:00
</script>';
}
}
2024-01-31 14:23:46 +01:00
// Set the group theme
if (isset($user)) {
if ($user->getThemeAttribute()) {
2024-01-19 10:32:20 +01:00
$theme = $user->getThemeAttribute();
}
}
$settings_collapse = session_get('settings.sidebar-collapse') ? 1 : 0;
$hide_sidebar = Auth::check() && (setting('Nascondere la barra sinistra di default') || $settings_collapse);
echo '
</head>
2024-05-17 00:32:46 +02:00
<body class="sidebar-mini layout-fixed skin-' . $theme . (!empty($hide_sidebar) ? ' sidebar-collapse' : '') . (!Auth::check() ? ' hold-transition login-page' : '') . '">
<div class="' . (!Auth::check() ? '' : 'wrapper') . '">';
if (Auth::check()) {
2024-05-17 00:32:46 +02:00
$calendar_color_label = ($_SESSION['period_start'] != date('Y') . '-01-01' || $_SESSION['period_end'] != date('Y') . '-12-31') ? 'danger' : 'secondary';
echo '
<!-- Loader principale -->
2024-05-17 00:32:46 +02:00
<!-- Preloader -->
<div id="main_loading" class="preloader flex-column justify-content-center align-items-center">
<img class="animation__shake" src="'.$rootdir.'/assets/dist/img/logo.png" alt="OSM" height="60" width="60">
</div>
<!-- Loader secondario -->
<div id="mini-loader" style="display:none;">
<div></div>
</div>
<!-- Loader senza overlay -->
<div id="tiny-loader" style="display:none;"></div>
2024-05-17 00:32:46 +02:00
<!-- Navbar -->
<nav class="main-header navbar navbar-expand navbar-white navbar-light">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" data-widget="pushmenu" href="#" role="button"><i class="fa fa-bars"></i></a>
</li>
<li class="nav-item">
<a href="#" id="daterange" class="nav-link" role="button">
<i class="fa fa-calendar"></i> <i class="fa fa-caret-down"></i>
</a>
</li>
<li class="nav-item d-none d-sm-inline-block">
<a class="nav-link text-' . $calendar_color_label . '">
' . Translator::dateToLocale($_SESSION['period_start']) . ' - ' . Translator::dateToLocale($_SESSION['period_end']) . '
</a>
</li>
</ul>
2019-08-02 15:58:31 +02:00
2024-05-17 00:32:46 +02:00
<!-- Navbar Right Menu -->
<ul class="navbar-nav ml-auto">';
2024-03-22 15:52:24 +01:00
// Visualizzo gli hooks solo se non sono stati disabilitati
2024-03-05 17:39:32 +01:00
if (!$config['disable_hooks']) {
2023-08-04 14:54:28 +02:00
echo '
2024-05-17 00:32:46 +02:00
<div class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-bell-o"></i>
<span id="hooks-badge" class="badge badge-warning">
<span id="hooks-loading"><i class="fa fa-spinner fa-spin"></i></span>
<span id="hooks-notified"></span>
<span id="hooks-counter" class="d-none">0</span>
<span id="hooks-number" class="d-none">0</span>
</span>
</a>
<div class="dropdown-menu dropdown-menu-lg dropdown-menu-right">
<a href="#" class="dropdown-item">
<span class="small" id="hooks-header"></span>
2019-05-10 06:32:06 +02:00
</a>
2024-05-17 00:32:46 +02:00
<div id="hooks"></div>
</div>
</div>';
2024-03-05 17:39:32 +01:00
}
2024-03-05 17:39:32 +01:00
echo '
2024-05-17 00:32:46 +02:00
<li class="nav-item">
<a href="#" onclick="window.print()" class="nav-link" title="' . tr('Stampa') . '">
<i class="fa fa-print nav-icon"></i>
</a>
</li>
2019-08-02 15:58:31 +02:00
2024-05-17 00:32:46 +02:00
<li class="nav-item">
<a href="' . base_path() . '/log.php" class="nav-link" title="' . tr('Log accessi') . '">
<i class="fa fa-book nav-icon"></i>
</a>
</li>
2019-08-02 15:58:31 +02:00
2024-05-17 00:32:46 +02:00
<li class="nav-item">
<a href="' . base_path() . '/shortcuts.php" class="nav-link" title="' . tr('Scorciatoie') . '">
<i class="fa fa-keyboard-o nav-icon"></i>
</a>
</li>
2019-08-02 15:58:31 +02:00
2024-05-17 00:32:46 +02:00
<li class="nav-item">
<a href="' . base_path() . '/info.php" class="nav-link" title="' . tr('Informazioni') . '">
<i class="fa fa-info nav-icon"></i>
</a>
</li>
2023-06-13 13:15:31 +02:00
2024-05-17 00:32:46 +02:00
<li class="nav-item">
<a href="' . base_path() . '/index.php?op=logout" onclick="sessionStorage.clear()" class="nav-link bg-danger" title="' . tr('Esci') . '">
<i class="fa fa-power-off nav-icon"></i>
</a>
</li>
</ul>
</nav>
<!-- /.navbar -->
<!-- Main Sidebar Container -->
<aside class="main-sidebar sidebar-dark-primary elevation-4">
<a href="' . tr('https://www.openstamanager.com') . '" class="brand-link" title="' . tr("Il gestionale open source per l'assistenza tecnica e la fatturazione") . '" target="_blank">
<img src="' . $rootdir . '/assets/dist/img/logo_completo.png" alt="' . tr("Il gestionale open source per l'assistenza tecnica e la fatturazione") . '" class="img-fluid">
<span class="brand-text font-weight-light">&nbsp;</span>
</a>
<!-- Sidebar -->
<div class="sidebar">
<!-- Sidebar user panel (optional) -->
<div class="user-panel mt-3 pb-3 mb-3 d-flex">
<div class="image">';
$user_photo = $user->photo;
if ($user_photo) {
echo '
2024-05-17 00:32:46 +02:00
<img src="' . $user_photo . '" class="img-circle elevation-2" alt="' . $user['username'] . '" />';
} else {
echo '
2024-05-17 00:32:46 +02:00
<i class="fa fa-user-circle-o fa-2x text-light" alt="' . tr('Utente') . '"></i>';
}
echo '
2024-05-17 00:32:46 +02:00
</div>
<div class="info">
<a href="' . base_path() . '/modules/utenti/info.php" class="d-block">
' . $user['username'] . '
</a>
</div>
</div>
2024-05-17 00:32:46 +02:00
<!-- SidebarSearch Form -->
<div class="form-inline">
<div class="input-group" data-widget="sidebar-search">
<input class="form-control form-control-sidebar" id="supersearch" type="search" placeholder="' . tr('Cerca') . '" aria-label="' . tr('Cerca') . '">
2024-05-16 18:02:50 +02:00
<div class="input-group-append">
2024-05-17 00:32:46 +02:00
<button class="btn btn-sidebar">
<i class="fa fa-search fa-fw"></i>
2024-05-16 18:02:50 +02:00
</button>
</div>
</div>
</div>
2024-05-17 00:32:46 +02:00
<!-- Sidebar Menu -->
<nav class="mt-2">
2024-05-16 18:02:50 +02:00
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu">';
echo Modules::getMainMenu();
echo '
</ul>
</section>
<!-- /.sidebar -->
</aside>';
if (string_contains($_SERVER['SCRIPT_FILENAME'], 'editor.php')) {
// Menu laterale per la visualizzazione dei plugin
echo '
<aside class="control-sidebar control-sidebar-light">
2024-05-17 00:32:46 +02:00
<h4><i class="fa fa-plug"></i> ' . tr('Plugin') . '</h4>
<ul class="nav nav-tabs nav-pills nav-stacked">
2024-05-16 18:02:50 +02:00
<li data-toggle="control-sidebar" class="active btn-default nav-item">
<a class="nav-link" data-toggle="tab" href="#tab_0">
2024-05-17 00:32:46 +02:00
' . $structure->getTranslation('title') . '
</a>
</li>';
2024-05-17 00:32:46 +02:00
// Tab dei plugin
if (!empty($id_record)) {
$plugins = $dbo->fetchArray('SELECT `zz_plugins`.`id`, `title`, `options`, `options2` FROM `zz_plugins` LEFT JOIN `zz_plugins_lang` ON (`zz_plugins`.`id` = `zz_plugins_lang`.`id_record` AND `zz_plugins_lang`.`id_lang` = ' . prepare(Models\Locale::getDefault()->id) . ') WHERE `idmodule_to`=' . prepare($id_module) . " AND `position`='tab' AND `enabled` = 1 ORDER BY `zz_plugins`.`order` DESC");
foreach ($plugins as $plugin) {
// Badge count per record plugin
$count = 0;
$opt = '';
if (!empty($plugin['options2'])) {
$opt = json_decode($plugin['options2'], true);
} elseif (!empty($plugin['options'])) {
$opt = json_decode($plugin['options'], true);
}
if (!empty($opt)) {
$q = str_replace('|id_parent|', $id_record, $opt['main_query'][0]['query']);
$count = $dbo->fetchNum($q);
}
echo '
2024-05-16 18:02:50 +02:00
<li data-widget="control-sidebar" class="btn-default nav-item" >
2024-05-17 00:32:46 +02:00
<a class="nav-link" data-widget="tab" href="#tab_' . $plugin['id'] . '" id="link-tab_' . $plugin['id'] . '">
' . $plugin['title'] . '
<span class="right badge badge-danger">' . ($count > 0 ? $count : '') . '</span>
2024-05-16 18:02:50 +02:00
</a>
</li>';
2024-05-17 00:32:46 +02:00
}
}
// Tab per le note interne
if ($structure->permission != '-' && $structure->use_notes) {
$notes = $structure->recordNotes($id_record);
echo '
2024-05-16 18:02:50 +02:00
<li data-widget="control-sidebar" class="btn-default">
<a class="bg-info" data-widget="tab" href="#tab_note" id="link-tab_note">
2024-05-17 00:32:46 +02:00
<' . tr('Note interne') . '
<span class="badge pull-right">' . ($notes->count() ?: '') . '</span>
2024-05-16 18:02:50 +02:00
</a>
</li>';
2024-05-17 00:32:46 +02:00
}
// Tab per le checklist
if ($structure->permission != '-' && $structure->use_checklists) {
$checklists_unchecked = $structure->recordChecks($id_record)->where('checked_at', null);
$checklists_total = $structure->recordChecks($id_record);
echo '
2024-05-16 18:02:50 +02:00
<li data-widget="control-sidebar" class="btn-default">
<a class="bg-info" data-widget="tab" href="#tab_checks" id="link-tab_checks">
2024-05-17 00:32:46 +02:00
<' . tr('Checklist') . '
<' . ($checklists_total->count() > 0) ? '<span class="badge pull-right">' . $checklists_unchecked->count() . tr(' / ') . $checklists_total->count() . '</span>' : '' . '
2024-05-16 18:02:50 +02:00
</a>
</li>';
2024-05-17 00:32:46 +02:00
}
// Tab per le informazioni sulle operazioni
if (Auth::admin()) {
echo '
2024-05-16 18:02:50 +02:00
<li data-widget="control-sidebar" class="btn-default">
<a class="bg-info" data-widget="tab" href="#tab_info" id="link-tab_info">
2024-05-17 00:32:46 +02:00
<' . tr('Info') . '
2024-05-16 18:02:50 +02:00
</a>
</li>';
2024-05-17 00:32:46 +02:00
}
echo '
</ul>
</aside>
<div class="control-sidebar-bg"></div>';
}
echo '
2024-05-17 00:32:46 +02:00
<!-- Main content -->
<div class="content-wrapper">
<section class="content">';
if (string_contains($_SERVER['SCRIPT_FILENAME'], 'editor.php')) {
$location = 'editor_right';
} elseif (string_contains($_SERVER['SCRIPT_FILENAME'], 'controller.php')) {
$location = 'controller_right';
}
// Eventuale messaggio personalizzato per l'installazione corrente
$extra_file = App::filepath('include/custom/extra', 'extra.php');
if ($extra_file) {
include_once $extra_file;
}
} else {
// Eventuale messaggio personalizzato per l'installazione corrente
$extra_file = App::filepath('include/custom/extra', 'login.php');
if ($extra_file) {
include_once $extra_file;
}
if (!empty($messages['warning']) || !empty($messages['error'])) {
echo '
2024-05-16 18:02:50 +02:00
<div class="card card-warning card-center">
<div class="card-header with-border text-center">
2024-05-17 00:32:46 +02:00
<h3 class="card-title">' . tr('Informazioni') . '</h3>
</div>
2024-05-16 18:02:50 +02:00
<div class="card-body">';
}
}
2018-07-19 12:47:28 +02:00
// Infomazioni
2018-07-19 12:47:28 +02:00
if (!empty($messages['info'])) {
foreach ($messages['info'] as $value) {
echo '
<script>
$(document).ready( function(){
2024-05-17 00:32:46 +02:00
window.parent.toastr.success("' . $value . '", toastr.options);
});
</script>';
2018-07-19 12:47:28 +02:00
}
}
// Errori
2018-07-19 12:47:28 +02:00
if (!empty($messages['error'])) {
foreach ($messages['error'] as $value) {
echo '
<div class="alert alert-danger push">
2024-05-17 00:32:46 +02:00
<h4><i class="icon fa fa fa-ban"></i> ' . tr('Errore') . '</h4>
' . $value . '
</div>';
2018-07-19 12:47:28 +02:00
}
}
// Avvisi
2018-07-19 12:47:28 +02:00
if (!empty($messages['warning'])) {
foreach ($messages['warning'] as $value) {
echo '
<div class="alert alert-warning push">
2024-05-17 00:32:46 +02:00
<h4><i class="icon fa fa-warning"></i> ' . tr('Attenzione') . '</h4>
' . $value . '
</div>';
2018-07-19 12:47:28 +02:00
}
}
if (!Auth::check() && (!empty($messages['info']) || !empty($messages['warning']) || !empty($messages['error']))) {
echo '
</div>
</div>';
}
// Messaggio informativo per l'esaurimento dello spazio totale disponibile nel server
$free_space = disk_free_space('.');
$space_limit = 1; // GB
if ($free_space < ($space_limit * (1024 ** 3))) {
echo '
2020-11-24 18:30:52 +01:00
<div class="callout callout-warning">
<h4>
2024-05-17 00:32:46 +02:00
<i class="fa fa-warning"></i> ' . tr('Spazio in esaurimento') . '
2020-11-24 18:30:52 +01:00
</h4>
2024-05-17 00:32:46 +02:00
<p>' . tr('Lo spazio a disposizione del gestionale è in esaurimento: sono al momento disponibili _TOT_', [
2024-03-22 15:52:24 +01:00
'_TOT_' => FileSystem::formatBytes($free_space),
2024-05-17 00:32:46 +02:00
]) . '.</p>
<p>' . tr('Questo può risultare un serio problema per la continuità di funzionamento del software, poiché le operazioni più espansive che richiedono spazio di archiviazione possono causare malfunzionamenti imprevisti') . '. ' . tr('Ad esempio, le attività di backup, caricamento di allegati o anche l\'utilizzo normale del gestionale potrebbero rendere i dati inaffidabili, provocando pertanto una perdita delle informazioni salvate') . '.</p>
<p>' . tr('Contatta gli amministratori di sistema per risolvere al più presto il problema') . '.</p>
2020-11-24 18:30:52 +01:00
</div>';
}