openstamanager/include/top.php

686 lines
30 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-21 16:26:19 +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-21 16:26:19 +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-21 16:26:19 +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-21 16:26:19 +02:00
<link href="'.$paths['img'].'/favicon.png" rel="icon" type="image/x-icon" />';
2024-05-21 16:26:19 +02:00
if (file_exists(base_dir().'/manifest.json')) {
2019-08-02 10:38:55 +02:00
echo '
2024-05-21 16:26:19 +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-21 16:26:19 +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-21 16:26:19 +02:00
<link rel="stylesheet" type="text/css" media="print" href="'.$style.'"/>';
}
if (Auth::check()) {
echo '
<script>
search = []';
2024-05-21 16:26:19 +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-21 16:26:19 +02:00
search.push("search_'.$field_name.'");
2024-05-23 11:36:25 +02:00
search["search_'.$field_name.'"] = "'.addslashes((string) $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-21 16:26:19 +02:00
'.$key.': "'.addslashes($value).'",';
}
echo '
allegati: {
2024-05-21 16:26:19 +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-21 16:26:19 +02:00
"title": "'.tr('Errore').'",
"text": "'.tr('Alcuni campi obbligatori non sono stati compilati correttamente').'",
},
"error": {
2024-05-21 16:26:19 +02:00
"title": "'.tr('Errore').'",
"text": "'.tr('Errore durante il salvataggio del record').'",
}
},
2019-08-02 15:58:31 +02:00
password: {
2024-05-21 16:26:19 +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-21 16:26:19 +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-21 16:26:19 +02:00
"lengthMenu": "'.tr('Visualizza _MENU_ elementi').'",
2019-08-02 15:58:31 +02:00
"loadingRecords": " ",
2024-05-21 16:26:19 +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-21 16:26:19 +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-21 16:26:19 +02:00
rootdir: "'.base_path().'",
js: "'.$paths['js'].'",
css: "'.$paths['css'].'",
img: "'.$paths['img'].'",
2018-02-23 09:49:31 +01:00
2024-05-21 16:26:19 +02:00
id_module: "'.$id_module.'",
id_record: "'.$id_record.'",
2020-06-30 17:38:19 +02:00
2024-05-21 16:26:19 +02:00
is_mobile: '.isMobile().',
2018-02-23 09:49:31 +01:00
2024-05-21 16:26:19 +02:00
cifre_decimali: '.setting('Cifre decimali per importi').',
2018-02-23 09:49:31 +01:00
2024-05-21 16:26:19 +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-23 11:36:25 +02:00
locale: "'.explode('_', (string) $lang)[0].'",
2024-05-21 16:26:19 +02:00
full_locale: "'.$lang.'",
2018-02-23 09:49:31 +01:00
2024-05-21 16:26:19 +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-21 16:26:19 +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-06-11 16:58:27 +02:00
order_manager_id: "'.($dbo->isInstalled() ? Module::where('name', 'Stato dei servizi')->first()->id : '').'",
2024-05-21 16:26:19 +02:00
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-21 16:26:19 +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-21 16:26:19 +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-21 16:26:19 +02:00
timestamp_format: "'.formatter()->getTimestampPattern().'",
date_format: "'.formatter()->getDatePattern().'",
time_format: "'.formatter()->getTimePattern().'",
2019-08-02 15:58:31 +02:00
2024-05-23 11:36:25 +02:00
locale: "'.explode('_', (string) $lang)[0].'",
2024-05-21 16:26:19 +02:00
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-21 16:26:19 +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-21 16:26:19 +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-21 16:26:19 +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();
}
}
2024-05-17 12:11:00 +02:00
if ($theme == 'default') {
$theme = 'sidebar-dark-secondary';
} else {
$theme = 'bg-'.$theme;
}
$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-21 16:26:19 +02:00
<body class="sidebar-mini layout-fixed '.(!empty($hide_sidebar) ? ' sidebar-collapse' : '').(!Auth::check() ? ' hold-transition login-page' : '').'">
<div class="'.(!Auth::check() ? '' : 'wrapper').'">';
if (Auth::check()) {
2024-05-21 16:26:19 +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">
2024-05-21 16:26:19 +02:00
<a class="nav-link text-'.$calendar_color_label.'">
'.Translator::dateToLocale($_SESSION['period_start']).' - '.Translator::dateToLocale($_SESSION['period_end']).'
2024-05-17 00:32:46 +02:00
</a>
</li>
</ul>
2019-08-02 15:58:31 +02:00
2024-05-22 09:50:22 +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-22 09:50:22 +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>
2024-05-17 00:32:46 +02:00
</a>
2024-05-22 09:50:22 +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-22 09:50:22 +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-22 09:50:22 +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-22 09:50:22 +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-22 09:50:22 +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-22 09:50:22 +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 -->
2024-05-17 00:32:46 +02:00
2024-05-22 09:50:22 +02:00
<!-- Main Sidebar Container -->
<aside class="main-sidebar '.$theme.' 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>
2024-05-17 00:32:46 +02:00
2024-05-22 09:50:22 +02:00
<!-- Sidebar -->
<div class="sidebar">
2024-05-17 00:32:46 +02:00
2024-05-22 09:50:22 +02:00
<!-- Sidebar user panel (optional) -->
<div class="user-panel mt-3 pb-3 mb-3 d-flex">
<div class="image">';
2024-06-29 01:37:08 +02:00
$user_photo = $user->photo ?: $rootdir.'/assets/dist/img/user.png';
echo '
2024-06-29 01:37:08 +02:00
<img src="'.$user_photo.'" class="img-circle elevation-2" alt="'.$user['username'].'" />
2024-05-22 09:50:22 +02:00
</div>
2024-05-17 00:32:46 +02:00
2024-05-22 09:50:22 +02:00
<div class="info">
<a href="'.base_path().'/modules/utenti/info.php" class="d-block">
'.$user['username'].'
</a>
</div>
2024-05-22 09:50:22 +02:00
</div>
2024-05-17 00:32:46 +02:00
2024-05-22 09:50:22 +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').'">
<div class="input-group-append">
<button class="btn btn-sidebar">
<i class="fa fa-search fa-fw"></i>
</button>
</div>
</div>
2024-05-22 09:50:22 +02:00
</div>
2024-05-22 09:50:22 +02:00
<!-- Sidebar Menu -->
<nav class="mt-2">
2024-06-10 11:04:49 +02:00
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu">';
echo Modules::getMainMenu();
echo '
2024-06-10 11:04:49 +02:00
</ul>
</nav>
<!-- / Sidebar Menu -->
</div>
2024-05-22 09:50:22 +02:00
</aside>';
2024-06-04 17:07:25 +02:00
$in_editor = string_contains($_SERVER['SCRIPT_FILENAME'], 'editor.php');
$in_controller = string_contains($_SERVER['SCRIPT_FILENAME'], 'controller.php');
if ($in_editor || $in_controller) {
// Menu laterale per la visualizzazione dei plugin
echo '
2024-05-23 17:51:21 +02:00
<div class="control-sidebar-button"><i class="fa fa-chevron-left"></i></div>
<aside class="control-sidebar control-sidebar-light">
2024-05-21 16:26:19 +02:00
<h4><i class="fa fa-plug"></i> '.tr('Plugin').'</h4>
<ul class="nav nav-tabs nav-pills nav-stacked">
2024-06-04 17:07:25 +02:00
<li data-toggle="control-sidebar" class="active btn-default nav-item">
<a class="nav-link" data-toggle="tab" href="#tab_0">
'.$structure->getTranslation('title').'
</a>
</li>';
2024-05-17 00:32:46 +02:00
// Tab dei plugin
2024-06-04 17:07:25 +02:00
$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`='".($in_editor ? 'tab' : 'tab_main')."' 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((string) $plugin['options2'], true);
} elseif (!empty($plugin['options'])) {
$opt = json_decode((string) $plugin['options'], true);
2024-05-17 00:32:46 +02:00
}
2024-06-04 17:07:25 +02:00
if (!empty($opt)) {
$q = str_replace('|id_parent|', $id_record, $opt['main_query'][0]['query']);
$count = $dbo->fetchNum($q);
}
2024-05-17 00:32:46 +02:00
echo '
2024-06-04 17:07:25 +02:00
<li data-toggle="control-sidebar" class="btn-default nav-item" >
<a class="nav-link" data-toggle="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
}
2024-06-04 17:07:25 +02:00
// Tab per le note interne
if ($in_editor) {
if ($structure->permission != '-' && $structure->use_notes) {
$notes = $structure->recordNotes($id_record);
2024-05-23 11:36:25 +02:00
2024-06-04 17:07:25 +02:00
echo '
<li data-toggle="control-sidebar" class="btn-default nav-item">
<a class="bg-info nav-link" data-toggle="tab" href="#tab_note" id="link-tab_note">
'.tr('Note interne').'
<span class="badge pull-right">'.($notes->count() ?: '').'</span>
</a>
</li>';
}
2024-05-17 00:32:46 +02:00
2024-06-04 17:07:25 +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 '
<li data-toggle="control-sidebar" class="btn-default nav-item">
<a class="bg-info nav-link" data-toggle="tab" href="#tab_checks" id="link-tab_checks">
'.tr('Checklist')
.($checklists_total ? ' <span class="badge pull-right">'.$checklists_unchecked->count().tr(' / ').$checklists_total->count().'</span>' : '')
.'
</a>
</li>';
}
// Tab per le informazioni sulle operazioni
if (Auth::admin()) {
echo '
<li data-toggle="control-sidebar" class="btn-default nav-item">
<a class="bg-info nav-link" data-toggle="tab" href="#tab_info" id="link-tab_info">
'.tr('Info').'
</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-21 16:26:19 +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-21 16:26:19 +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-21 16:26:19 +02:00
<h4><i class="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-21 16:26:19 +02:00
<h4><i class="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-21 16:26:19 +02:00
<i class="fa fa-warning"></i> '.tr('Spazio in esaurimento').'
2020-11-24 18:30:52 +01:00
</h4>
2024-05-21 16:26:19 +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-21 16:26:19 +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>';
}