Merge branch 'master' of https://github.com/devcode-it/openstamanager
This commit is contained in:
commit
ebb1b5a791
32
lib/util.php
32
lib/util.php
|
@ -567,3 +567,35 @@ if (!function_exists('temp_file')) {
|
|||
return $file;
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('adjustBrightness')) {
|
||||
/**
|
||||
* Increases or decreases the brightness of a color by a percentage of the current brightness.
|
||||
*
|
||||
* @param string $hexCode Supported formats: `#FFF`, `#FFFFFF`, `FFF`, `FFFFFF`
|
||||
* @param float $adjustPercent A number between -1 and 1. E.g. 0.3 = 30% lighter; -0.4 = 40% darker.
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* @author maliayas
|
||||
*/
|
||||
function adjustBrightness($hexCode, $adjustPercent)
|
||||
{
|
||||
$hexCode = ltrim($hexCode, '#');
|
||||
|
||||
if (strlen($hexCode) == 3) {
|
||||
$hexCode = $hexCode[0].$hexCode[0].$hexCode[1].$hexCode[1].$hexCode[2].$hexCode[2];
|
||||
}
|
||||
|
||||
$hexCode = array_map('hexdec', str_split($hexCode, 2));
|
||||
|
||||
foreach ($hexCode as &$color) {
|
||||
$adjustableLimit = $adjustPercent < 0 ? $color : 255 - $color;
|
||||
$adjustAmount = ceil($adjustableLimit * $adjustPercent);
|
||||
|
||||
$color = str_pad(dechex($color + $adjustAmount), 2, '0', STR_PAD_LEFT);
|
||||
}
|
||||
|
||||
return '#'.implode($hexCode);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,101 +21,230 @@ include_once __DIR__.'/../../core.php';
|
|||
|
||||
use API\Services;
|
||||
use Models\Cache;
|
||||
use Models\Module;
|
||||
use Models\Plugin;
|
||||
use Util\FileSystem;
|
||||
|
||||
$id = post('id');
|
||||
|
||||
switch (filter('op')) {
|
||||
case 'uninstall':
|
||||
if (!empty($id)) {
|
||||
// Leggo l'id del modulo
|
||||
$rs = $dbo->fetchArray('SELECT id, name, directory FROM zz_modules WHERE id='.prepare($id).' AND `default`=0');
|
||||
$modulo = $rs[0]['title'];
|
||||
$module_dir = $rs[0]['directory'];
|
||||
case 'rimuovi-modulo':
|
||||
$id = filter('id');
|
||||
$is_plugin = filter('tipo') == 'plugin';
|
||||
if (empty($id)) {
|
||||
echo json_encode([]);
|
||||
}
|
||||
|
||||
if (count($rs) == 1) {
|
||||
// Elimino il modulo dal menu
|
||||
$dbo->query('DELETE FROM zz_modules WHERE id='.prepare($id).' OR parent='.prepare($id));
|
||||
// Ricerca del modulo/plugin tra quelli disponibili
|
||||
if (!$is_plugin) {
|
||||
$struttura = Module::where('default', '=', 0)->find($id);
|
||||
} else {
|
||||
$struttura = Plugin::where('default', '=', 0)->find($id);
|
||||
}
|
||||
|
||||
$uninstall_script = base_dir().'/modules/'.$module_dir.'/update/uninstall.php';
|
||||
// Modulo/plugin non trovato
|
||||
if (empty($struttura)) {
|
||||
echo json_encode([]);
|
||||
}
|
||||
|
||||
// Eliminazione del modulo/plugin dal sistema di navigazione
|
||||
$struttura->delete();
|
||||
|
||||
// Esecuzione dello script di disinstallazione (se presente)
|
||||
$uninstall_script = $struttura->path.'/update/uninstall.php';
|
||||
if (file_exists($uninstall_script)) {
|
||||
include_once $uninstall_script;
|
||||
}
|
||||
|
||||
delete(base_dir().'/modules/'.$module_dir.'/');
|
||||
// Eliminazione dei file del modulo/plugin
|
||||
delete($struttura->path);
|
||||
|
||||
flash()->info(tr('Modulo "_MODULE_" disinstallato!', [
|
||||
'_MODULE_' => $modulo,
|
||||
// Messaggio informativo
|
||||
if (!$is_plugin) {
|
||||
flash()->info(tr('Modulo "_NAME_" disinstallato!', [
|
||||
'_NAME_' => $struttura->title,
|
||||
]));
|
||||
} else {
|
||||
flash()->info(tr('Plugin "_NAME_" disinstallato!', [
|
||||
'_NAME_' => $struttura->title,
|
||||
]));
|
||||
}
|
||||
|
||||
echo json_encode([]);
|
||||
|
||||
break;
|
||||
|
||||
case 'disabilita-modulo':
|
||||
$id = filter('id');
|
||||
$is_plugin = filter('tipo') == 'plugin';
|
||||
|
||||
// Disabilitazione del modulo indicato
|
||||
$database->table($is_plugin ? 'zz_plugins' : 'zz_modules')
|
||||
->where('id', '=', $id)
|
||||
->update(['enabled' => 0]);
|
||||
|
||||
// Cascata in tutti i sotto-moduli
|
||||
if (!$is_plugin) {
|
||||
$moduli_interessati = collect([$id]);
|
||||
while (!$moduli_interessati->isEmpty()) {
|
||||
$id_modulo = $moduli_interessati->pop();
|
||||
|
||||
// Disabilitazione dei sotto-moduli
|
||||
$database->table('zz_modules')
|
||||
->where('parent', '=', $id_modulo)
|
||||
->update(['enabled' => 0]);
|
||||
|
||||
// Ricerca sotto-moduli
|
||||
$sotto_moduli = $database->table('zz_modules')
|
||||
->where('parent', '=', $id_modulo)
|
||||
->select('id')
|
||||
->get()->pluck('id');
|
||||
$moduli_interessati->concat($sotto_moduli);
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
// Disabilitazione modulo/plugin indicato
|
||||
$moduli_sempre_attivi = ['Utenti e permessi', 'Stato dei servizi'];
|
||||
$database->table('zz_modules')
|
||||
->whereIn('name', $moduli_sempre_attivi)
|
||||
->update(['enabled' => 1]);
|
||||
|
||||
case 'disable':
|
||||
$dbo->query('UPDATE `zz_modules` SET `enabled` = 0 WHERE (`id` = '.prepare($id).' OR `parent` = '.prepare($id).') AND `id` != '.prepare(Modules::get('Stato dei servizi')['id']));
|
||||
|
||||
flash()->info(tr('Modulo "_MODULE_" disabilitato!', [
|
||||
'_MODULE_' => Modules::get($id)['title'],
|
||||
// Messaggio informativo
|
||||
$struttura = $is_plugin ? Plugin::find($id) : Module::find($id);
|
||||
if (!$is_plugin) {
|
||||
flash()->info(tr('Modulo "_NAME_" disabilitato!', [
|
||||
'_NAME_' => $struttura->title,
|
||||
]));
|
||||
} else {
|
||||
flash()->info(tr('Plugin "_NAME_" disabilitato!', [
|
||||
'_NAME_' => $struttura->title,
|
||||
]));
|
||||
}
|
||||
|
||||
echo json_encode([]);
|
||||
|
||||
break;
|
||||
|
||||
case 'enable':
|
||||
$dbo->query('UPDATE `zz_modules` SET `enabled` = 1 WHERE `id` = '.prepare($id).' OR `parent` = '.prepare($id));
|
||||
case 'abilita-sotto-modulo':
|
||||
$id = filter('id');
|
||||
|
||||
flash()->info(tr('Modulo "_MODULE_" abilitato!', [
|
||||
'_MODULE_' => Modules::get($id)['title'],
|
||||
// Cascata in tutti i sotto-moduli
|
||||
$moduli_interessati = collect([$id]);
|
||||
while (!$moduli_interessati->isEmpty()) {
|
||||
$id_modulo = $moduli_interessati->pop();
|
||||
|
||||
// Disabilitazione dei sotto-moduli
|
||||
$database->table('zz_modules')
|
||||
->where('parent', '=', $id_modulo)
|
||||
->update(['enabled' => 1]);
|
||||
|
||||
// Ricerca sotto-moduli
|
||||
$sotto_moduli = $database->table('zz_modules')
|
||||
->where('parent', '=', $id_modulo)
|
||||
->select('id')
|
||||
->get()->pluck('id');
|
||||
$moduli_interessati->concat($sotto_moduli);
|
||||
}
|
||||
|
||||
// no break
|
||||
case 'abilita-modulo':
|
||||
$id = filter('id');
|
||||
$is_plugin = filter('tipo') == 'plugin';
|
||||
|
||||
// Abilitazione del modulo/plugin indicato
|
||||
$database->table($is_plugin ? 'zz_plugins' : 'zz_modules')
|
||||
->where('id', '=', $id)
|
||||
->update(['enabled' => 1]);
|
||||
|
||||
// Messaggio informativo
|
||||
$struttura = $is_plugin ? Plugin::find($id) : Module::find($id);
|
||||
if (!isset($moduli_interessati)) {
|
||||
if (!$is_plugin) {
|
||||
flash()->info(tr('Modulo "_NAME_" abilitato!', [
|
||||
'_NAME_' => $struttura->title,
|
||||
]));
|
||||
} else {
|
||||
flash()->info(tr('Plugin "_NAME_" abilitato!', [
|
||||
'_NAME_' => $struttura->title,
|
||||
]));
|
||||
}
|
||||
} else {
|
||||
$modulo = Modules::get($id);
|
||||
flash()->info(tr('Moduli sotto a "_NAME_" abilitati!', [
|
||||
'_NAME_' => $struttura->title,
|
||||
]));
|
||||
}
|
||||
|
||||
echo json_encode([]);
|
||||
|
||||
break;
|
||||
|
||||
case 'disable_widget':
|
||||
$dbo->query('UPDATE zz_widgets SET enabled = 0 WHERE id = '.prepare($id));
|
||||
case 'disabilita-widget':
|
||||
$id = filter('id');
|
||||
|
||||
$rs = $dbo->fetchArray('SELECT id, name FROM zz_widgets WHERE id='.prepare($id));
|
||||
$widget = $rs[0]['name'];
|
||||
// Abilitazione del widget indicato
|
||||
$database->table('zz_widgets')
|
||||
->where('id', '=', $id)
|
||||
->update(['enabled' => 0]);
|
||||
|
||||
flash()->info(tr('Widget "_WIDGET_" disabilitato!', [
|
||||
'_WIDGET_' => $widget,
|
||||
// Messaggio informativo
|
||||
$widget = $database->table('zz_widgets')
|
||||
->where('id', '=', $id)
|
||||
->first();
|
||||
flash()->info(tr('Widget "_NAME_" disabilitato!', [
|
||||
'_NAME_' => $widget->name,
|
||||
]));
|
||||
|
||||
echo json_encode([]);
|
||||
|
||||
break;
|
||||
|
||||
case 'enable_widget':
|
||||
$dbo->query('UPDATE zz_widgets SET enabled=1 WHERE id='.prepare($id));
|
||||
case 'abilita-widget':
|
||||
$id = filter('id');
|
||||
|
||||
$rs = $dbo->fetchArray('SELECT id, name FROM zz_widgets WHERE id='.prepare($id));
|
||||
$widget = $rs[0]['name'];
|
||||
// Abilitazione del widget indicato
|
||||
$database->table('zz_widgets')
|
||||
->where('id', '=', $id)
|
||||
->update(['enabled' => 1]);
|
||||
|
||||
flash()->info(tr('Widget "_WIDGET_" abilitato!', [
|
||||
'_WIDGET_' => $widget,
|
||||
// Messaggio informativo
|
||||
$widget = $database->table('zz_widgets')
|
||||
->where('id', '=', $id)
|
||||
->first();
|
||||
flash()->info(tr('Widget "_NAME_" abilitato!', [
|
||||
'_NAME_' => $widget->name,
|
||||
]));
|
||||
|
||||
echo json_encode([]);
|
||||
|
||||
break;
|
||||
|
||||
case 'change_position_widget_top':
|
||||
$dbo->query("UPDATE zz_widgets SET location='controller_top' WHERE id=".prepare($id));
|
||||
case 'sposta-widget':
|
||||
$id = filter('id');
|
||||
|
||||
$rs = $dbo->fetchArray('SELECT id, name FROM zz_widgets WHERE id='.prepare($id));
|
||||
$widget = $rs[0]['name'];
|
||||
// Individuazione widget
|
||||
$widget = $database->table('zz_widgets')
|
||||
->where('id', '=', $id)
|
||||
->first();
|
||||
if (empty($widget)) {
|
||||
echo json_encode([]);
|
||||
}
|
||||
|
||||
flash()->info(tr('Posizione del widget "_WIDGET_" aggiornata!', [
|
||||
'_WIDGET_' => $widget,
|
||||
// Individuazione dello spostamento da effettuare
|
||||
$pieces = explode('_', $widget->location);
|
||||
$location = $pieces[0].'_'.($pieces[1] == 'right' ? 'top' : 'right');
|
||||
|
||||
// Abilitazione del widget indicato
|
||||
$database->table('zz_widgets')
|
||||
->where('id', '=', $id)
|
||||
->update(['location' => $location]);
|
||||
|
||||
// Messaggio informativo
|
||||
flash()->info(tr('Posizione del widget "_NAME_" aggiornata!', [
|
||||
'_NAME_' => $widget->name,
|
||||
]));
|
||||
|
||||
break;
|
||||
|
||||
case 'change_position_widget_right':
|
||||
$dbo->query("UPDATE zz_widgets SET location='controller_right' WHERE id=".prepare($id));
|
||||
|
||||
$rs = $dbo->fetchArray('SELECT id, name FROM zz_widgets WHERE id='.prepare($id));
|
||||
$widget = $rs[0]['name'];
|
||||
|
||||
flash()->info(tr('Posizione del widget "_WIDGET_" aggiornata!', [
|
||||
'_WIDGET_' => $widget,
|
||||
]));
|
||||
echo json_encode([]);
|
||||
|
||||
break;
|
||||
|
||||
|
@ -178,14 +307,18 @@ switch (filter('op')) {
|
|||
|
||||
$informazioni = $info->content;
|
||||
|
||||
// Formattazione dei contenuti
|
||||
// Restrizione storico agli ultimi 3 anni
|
||||
$history = (array) $informazioni['history'];
|
||||
$history = array_slice($history, 0, 3);
|
||||
|
||||
// Formattazione dei contenuti dello storico
|
||||
foreach ($history as $key => $value) {
|
||||
$history[$key]['size'] = Filesystem::formatBytes($value['size']);
|
||||
$history[$key]['invoices_size'] = Filesystem::formatBytes($value['invoices_size']);
|
||||
$history[$key]['notifies_size'] = Filesystem::formatBytes($value['notifies_size']);
|
||||
}
|
||||
|
||||
// Formattazione dei contenuti generici
|
||||
echo json_encode([
|
||||
'invoice_number' => $informazioni['invoice_number'],
|
||||
'size' => Filesystem::formatBytes($informazioni['size']),
|
||||
|
|
|
@ -17,83 +17,119 @@
|
|||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
// Elenco moduli installati
|
||||
use API\Services;
|
||||
use Carbon\Carbon;
|
||||
use Models\Cache;
|
||||
use Modules\StatoServizi\ServicesHook;
|
||||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
// Informazioni sui servizi attivi
|
||||
echo '
|
||||
<div class="row">
|
||||
<div class="col-md-12 col-lg-6">
|
||||
<h3>'.tr('Moduli installati').'</h3>
|
||||
<table class="table table-hover table-bordered table-condensed">
|
||||
<tr>
|
||||
<th>'.tr('Nome').'</th>
|
||||
<th>'.tr('Versione').'</th>
|
||||
<th>'.tr('Stato').'</th>
|
||||
<th>'.tr('Compatibilità').'</th>
|
||||
<th>'.tr('Opzioni').'</th>
|
||||
</tr>';
|
||||
|
||||
$modules = Modules::getHierarchy();
|
||||
|
||||
$osm_version = Update::getVersion();
|
||||
|
||||
echo submodules($modules);
|
||||
|
||||
echo '
|
||||
</table>
|
||||
</div>';
|
||||
<div class="row">';
|
||||
|
||||
/**
|
||||
* Contenuto aggiornato e gestito dall'Hook ServicesHook.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
$response = Cache::pool('Informazioni su Services')->content;
|
||||
$limite_scadenze = (new Carbon())->addDays(60);
|
||||
if (Services::isEnabled()) {
|
||||
// Informazioni su Services
|
||||
$servizi = Cache::pool('Informazioni su Services')->content;
|
||||
|
||||
if (!empty($servizi)) {
|
||||
// Elaborazione dei servizi in scadenza
|
||||
$limite_scadenze = (new Carbon())->addDays(60);
|
||||
$servizi_in_scadenza = [];
|
||||
foreach ($servizi as $servizio) {
|
||||
// Gestione per data di scadenza
|
||||
$scadenza = new Carbon($servizio['expiration_at']);
|
||||
if (
|
||||
(isset($servizio['expiration_at']) && $scadenza->lessThan($limite_scadenze))
|
||||
) {
|
||||
$servizi_in_scadenza[] = $servizio['name'].' ('.$scadenza->diffForHumans().')';
|
||||
}
|
||||
// Gestione per crediti
|
||||
elseif (
|
||||
(isset($servizio['credits']) && $servizio['credits'] < 100)
|
||||
) {
|
||||
$servizi_in_scadenza[] = $servizio['name'].' ('.$servizio['credits'].' crediti)';
|
||||
}
|
||||
}
|
||||
|
||||
echo '
|
||||
<!-- Informazioni sui Servizi attivi -->
|
||||
<div class="col-md-12 col-lg-6">
|
||||
<div class="box box-info">
|
||||
<div class="box box-success">
|
||||
<div class="box-header">
|
||||
<h3 class="box-title">
|
||||
'.tr('Informazioni su Services').'
|
||||
'.tr('Servizi attivi').'
|
||||
</h3>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="box-body">';
|
||||
|
||||
if (empty($servizi_in_scadenza)) {
|
||||
$servizi = collect($response['servizi'])->flatten(1);
|
||||
if (!$servizi->isEmpty()) {
|
||||
echo '
|
||||
<p>'.tr('Nessun servizio in scadenza').'.</p>';
|
||||
<table class="table table-striped table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>'.tr('Tipo').'</th>
|
||||
<th>'.tr('Nome').'</th>
|
||||
<th>'.tr('Scadenza').'</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>';
|
||||
foreach ($servizi as $servizio) {
|
||||
$scadenza = Carbon::parse($servizio['data_conclusione']);
|
||||
|
||||
echo '
|
||||
<tr class="'.($scadenza->lessThan($limite_scadenze) ? 'info' : '').'">
|
||||
<td>'.$servizio['sottocategoria'].'</td>
|
||||
<td>'.$servizio['codice'].' - '.$servizio['nome'].'</td>
|
||||
<td>'.dateFormat($scadenza).' ('.$scadenza->diffForHumans().')</td>
|
||||
</tr>';
|
||||
}
|
||||
|
||||
echo '
|
||||
</tbody>
|
||||
</table>';
|
||||
} else {
|
||||
echo '
|
||||
<p>'.tr('I seguenti servizi sono in scadenza:').'</p>
|
||||
<ul>';
|
||||
foreach ($servizi_in_scadenza as $servizio) {
|
||||
echo '
|
||||
<li>'.$servizio.'</li>';
|
||||
<div class="alert alert-warning" role="alert">
|
||||
<i class="fa fa-warning"></i> '.tr('Nessun servizio abilitato al momento').'.
|
||||
</div>';
|
||||
}
|
||||
|
||||
echo '
|
||||
</ul>';
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Informazioni sulle Risorse API -->
|
||||
<div class="col-md-12 col-lg-6">
|
||||
<div class="box box-info">
|
||||
<div class="box-header">
|
||||
<h3 class="box-title">
|
||||
'.tr('Risorse Services').'
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div class="box-body">';
|
||||
|
||||
// Elaborazione delle risorse API in scadenza
|
||||
if (!empty($response['risorse-api'])) {
|
||||
$risorse_in_scadenza = ServicesHook::getRisorseInScadenza($response['risorse-api'], $limite_scadenze);
|
||||
if (!$risorse_in_scadenza->isEmpty()) {
|
||||
echo '
|
||||
<p>'.tr('Le seguenti risorse sono in scadenza:').'</p>
|
||||
<table class="table table-striped table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>'.tr('Nome').'</th>
|
||||
<th>'.tr('Crediti').'</th>
|
||||
<th>'.tr('Scadenza').'</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>';
|
||||
foreach ($risorse_in_scadenza as $servizio) {
|
||||
$scadenza = Carbon::parse($servizio['data_scadenza']);
|
||||
echo '
|
||||
<tr>
|
||||
<td>'.$servizio['nome'].'</td>
|
||||
<td>'.$servizio['crediti'].'</td>
|
||||
<td>'.dateFormat($scadenza).' ('.$scadenza->diffForHumans().')</td>
|
||||
</tr>';
|
||||
}
|
||||
|
||||
echo '
|
||||
</tbody>
|
||||
</table>';
|
||||
} else {
|
||||
echo '
|
||||
<p>'.tr('Nessuna risorsa in scadenza').'.</p>';
|
||||
}
|
||||
|
||||
echo '
|
||||
|
@ -105,13 +141,15 @@ if (Services::isEnabled()) {
|
|||
<thead>
|
||||
<tr>
|
||||
<th>'.tr('Anno').'</th>
|
||||
<th>'.tr('Documenti archiviati').'
|
||||
<th>
|
||||
'.tr('Documenti archiviati').'
|
||||
<span class="tip" title="'.tr('Fatture attive e relative ricevute, fatture passive').'.">
|
||||
<i class="fa fa-question-circle-o"></i>
|
||||
</span>
|
||||
</th>
|
||||
|
||||
<th>'.tr('Totale spazio occupato').'
|
||||
<th>
|
||||
'.tr('Totale spazio occupato').'
|
||||
<span class="tip" title="'.tr('Fatture attive con eventuali allegati e ricevute, fatture passive con eventuali allegati').'.">
|
||||
<i class="fa fa-question-circle-o"></i>
|
||||
</span>
|
||||
|
@ -127,11 +165,67 @@ if (Services::isEnabled()) {
|
|||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
$(document).ready(function (){
|
||||
aggiornaStatisticheFE();
|
||||
});
|
||||
</script>';
|
||||
} else {
|
||||
echo '
|
||||
<div class="alert alert-warning" role="alert">
|
||||
<i class="fa fa-warning"></i> '.tr('Nessuna risorsa Services abilitata').'.
|
||||
</div>';
|
||||
}
|
||||
|
||||
echo '
|
||||
|
||||
</div>
|
||||
</div>';
|
||||
} else {
|
||||
echo '
|
||||
<div class="col-md-12 col-lg-6">
|
||||
<div class="alert alert-warning" role="alert">
|
||||
<i class="fa fa-warning"></i> '.tr("Configurazione per l'accesso Services non completata correttamente").'. '.tr('Per abilitare i servizi, compilare l\'impostazione "OSMCloud Services API Token"').'.
|
||||
</div>
|
||||
</div>';
|
||||
}
|
||||
|
||||
echo '
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12 col-lg-6">
|
||||
<div class="box box-info">
|
||||
<div class="box-header">
|
||||
<h3 class="box-title">
|
||||
'.tr('Moduli disponibili').'
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div class="box-body" id="moduli">
|
||||
</div>
|
||||
</div>
|
||||
</div>';
|
||||
|
||||
// Widgets
|
||||
echo '
|
||||
<div class="col-md-12 col-lg-6">
|
||||
<div class="box box-info">
|
||||
<div class="box-header">
|
||||
<h3 class="box-title">
|
||||
'.tr('Widget disponibili').'
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div class="box-body" id="widget">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function aggiornaStatisticheFE(){
|
||||
$.ajax({
|
||||
url: globals.rootdir + "/actions.php",
|
||||
type: "GET",
|
||||
|
@ -157,82 +251,36 @@ if (Services::isEnabled()) {
|
|||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function caricaElencoModuli() {
|
||||
let container = $("#moduli");
|
||||
|
||||
localLoading(container, true);
|
||||
return $.get("'.$structure->fileurl('elenco-moduli.php').'?id_module='.$id_module.'", function(data) {
|
||||
container.html(data);
|
||||
localLoading(container, false);
|
||||
|
||||
init();
|
||||
});
|
||||
</script>';
|
||||
} else {
|
||||
echo '
|
||||
<div class="col-md-12 col-lg-6"><div class="alert alert-warning alert-dismissible" role="alert"><button class="close" type="button" data-dismiss="alert" aria-hidden="true"><span aria-hidden="true">×</span><span class="sr-only">'.tr('Chiudi').'</span></button><span><i class="fa fa-warning"></i> '.tr('Nessun servizio abilitato o "OSMCloud Services API Token" non valido').'.</span></div></div>';
|
||||
}
|
||||
}
|
||||
|
||||
// Widgets
|
||||
echo '
|
||||
<div class="col-md-12 col-lg-6">
|
||||
<h3>'.tr('Widgets').'</h3>
|
||||
<table class="table table-hover table-bordered table-condensed">
|
||||
<tr>
|
||||
<th>'.tr('Nome').'</th>
|
||||
<th>'.tr('Posizione').'</th>
|
||||
<th>'.tr('Stato').'</th>
|
||||
<th>'.tr('Posizione').'</th>
|
||||
</tr>';
|
||||
function caricaElencoWidget() {
|
||||
let container = $("#widget");
|
||||
|
||||
$widgets = $dbo->fetchArray('SELECT zz_widgets.id, zz_widgets.name AS widget_name, zz_modules.name AS module_name, zz_widgets.enabled AS enabled, location, help FROM zz_widgets INNER JOIN zz_modules ON zz_widgets.id_module=zz_modules.id ORDER BY `id_module` ASC, `zz_widgets`.`order` ASC');
|
||||
localLoading(container, true);
|
||||
return $.get("'.$structure->fileurl('elenco-widget.php').'?id_module='.$id_module.'", function(data) {
|
||||
container.html(data);
|
||||
localLoading(container, false);
|
||||
|
||||
$previous = '';
|
||||
|
||||
foreach ($widgets as $widget) {
|
||||
// Nome modulo come titolo sezione
|
||||
if ($widget['module_name'] != $previous) {
|
||||
echo '
|
||||
<tr>
|
||||
<th colspan="4">'.$widget['module_name'].'</th>
|
||||
</tr>';
|
||||
}
|
||||
|
||||
// STATO
|
||||
if ($widget['enabled']) {
|
||||
$stato = '<i class="fa fa-cog fa-spin text-success tip" title="'.tr('Abilitato').'. '.tr('Clicca per disabilitarlo').'..."></i>';
|
||||
$class = 'success';
|
||||
} else {
|
||||
$stato = '<i class="fa fa-cog text-warning tip" title="'.tr('Non abilitato').'"></i>';
|
||||
$class = 'warning';
|
||||
}
|
||||
|
||||
// Possibilità di disabilitare o abilitare i moduli tranne quello degli aggiornamenti
|
||||
if ($widget['enabled']) {
|
||||
$stato = "<a href='javascript:;' onclick=\"if( confirm('".tr('Disabilitare questo widget?')."') ){ $.post( '".base_path().'/actions.php?id_module='.$id_module."', { op: 'disable_widget', id: '".$widget['id']."' }, function(response){ location.href='".base_path().'/controller.php?id_module='.$id_module."'; }); }\">".$stato."</a>\n";
|
||||
} else {
|
||||
$stato = "<a href='javascript:;' onclick=\"if( confirm('".tr('Abilitare questo widget?')."') ){ $.post( '".base_path().'/actions.php?id_module='.$id_module."', { op: 'enable_widget', id: '".$widget['id']."' }, function(response){ location.href='".base_path().'/controller.php?id_module='.$id_module."'; }); }\"\">".$stato."</a>\n";
|
||||
}
|
||||
|
||||
// POSIZIONE
|
||||
if ($widget['location'] == 'controller_top') {
|
||||
$location = tr('Schermata modulo in alto');
|
||||
} elseif ($widget['location'] == 'controller_right') {
|
||||
$location = tr('Schermata modulo a destra');
|
||||
}
|
||||
|
||||
if ($widget['location'] == 'controller_right') {
|
||||
$posizione = "<i class='fa fa-arrow-up text-warning tip' title=\"".tr('Clicca per cambiare la posizione...')."\"></i> <i class='fa fa-arrow-right text-success' ></i>";
|
||||
$posizione = "<a href='javascript:;' onclick=\"if( confirm('".tr('Cambiare la posizione di questo widget?')."') ){ $.post( '".base_path().'/actions.php?id_module='.$id_module."', { op: 'change_position_widget_top', id: '".$widget['id']."' }, function(response){ location.href='".base_path().'/controller.php?id_module='.$id_module."'; }); }\"\">".$posizione."</a>\n";
|
||||
} elseif ($widget['location'] == 'controller_top') {
|
||||
$posizione = "<i class='fa fa-arrow-up text-success'></i> <i class='fa fa-arrow-right text-warning tip' title=\"".tr('Clicca per cambiare la posizione...').'"></i>';
|
||||
$posizione = "<a href='javascript:;' onclick=\"if( confirm('".tr('Cambiare la posizione di questo widget?')."') ){ $.post( '".base_path().'/actions.php?id_module='.$id_module."', { op: 'change_position_widget_right', id: '".$widget['id']."' }, function(response){ location.href='".base_path().'/controller.php?id_module='.$id_module."'; }); }\"\">".$posizione."</a>\n";
|
||||
}
|
||||
|
||||
echo '
|
||||
<tr class="'.$class.'">
|
||||
<td>'.$widget['widget_name'].((!empty($widget['help'])) ? ' <i class="tip fa fa-question-circle-o" title="'.$widget['help'].'"</i>' : '').'</td>
|
||||
<td align="left"><small>'.$location.'</small></td>
|
||||
<td align="center">'.$stato.'</td>
|
||||
<td align="center">'.$posizione.'</td>
|
||||
</tr>';
|
||||
|
||||
$previous = $widget['module_name'];
|
||||
init();
|
||||
});
|
||||
}
|
||||
|
||||
echo '
|
||||
</table>
|
||||
</div>
|
||||
</div>';
|
||||
$(document).ready(function() {
|
||||
caricaElencoModuli();
|
||||
caricaElencoWidget();
|
||||
|
||||
init();
|
||||
});
|
||||
</script>';
|
||||
|
|
|
@ -0,0 +1,388 @@
|
|||
<?php
|
||||
/*
|
||||
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
|
||||
* Copyright (C) DevCode s.r.l.
|
||||
*
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
echo '
|
||||
<table class="table table-hover table-bordered table-condensed">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>'.tr('Nome').'</th>
|
||||
<th class="text-center">'.tr('Versione').'</th>
|
||||
<th class="text-center">'.tr('Stato').'</th>
|
||||
<th class="text-center">#</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>';
|
||||
|
||||
$moduli = Modules::getHierarchy();
|
||||
echo renderElencoModuli($moduli);
|
||||
|
||||
echo '
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<script>
|
||||
function disabilitaModulo(button){
|
||||
const riga = $(button).closest("tr");
|
||||
const id = riga.data("id");
|
||||
|
||||
const nome = riga.data("nome");
|
||||
const tipo = riga.data("tipo");
|
||||
const nome_tipo = riga.data("nome_tipo");
|
||||
|
||||
swal({
|
||||
title: "'.tr('Disabilitare il _TYPE_?', [
|
||||
'_TYPE_' => '" + nome_tipo + "',
|
||||
]).'",
|
||||
html: "'.tr('Sei sicuro di voler disabilitare il _TYPE_ _NAME_?', [
|
||||
'_TYPE_' => '" + nome_tipo + "',
|
||||
'_NAME_' => '" + nome + "',
|
||||
]).'",
|
||||
type: "warning",
|
||||
showCancelButton: true,
|
||||
confirmButtonText: "'.tr('Continua').'"
|
||||
}).then(function (result) {
|
||||
let restore = buttonLoading(button);
|
||||
|
||||
$.ajax({
|
||||
url: globals.rootdir + "/actions.php",
|
||||
type: "POST",
|
||||
dataType: "JSON",
|
||||
data: {
|
||||
id_module: globals.id_module,
|
||||
op: "disabilita-modulo",
|
||||
tipo: tipo,
|
||||
id: id,
|
||||
},
|
||||
success: function (response) {
|
||||
caricaElencoModuli();
|
||||
renderMessages();
|
||||
},
|
||||
error: function() {
|
||||
buttonRestore(button, restore);
|
||||
|
||||
swal({
|
||||
type: "error",
|
||||
title: globals.translations.ajax.error.title,
|
||||
text: globals.translations.ajax.error.text,
|
||||
});
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
function abilitaModulo(button) {
|
||||
const riga = $(button).closest("tr");
|
||||
const id = riga.data("id");
|
||||
|
||||
const nome = riga.data("nome");
|
||||
const tipo = riga.data("tipo");
|
||||
const nome_tipo = riga.data("nome_tipo");
|
||||
|
||||
swal({
|
||||
title: "'.tr('Abilitare il _TYPE_?', [
|
||||
'_TYPE_' => '" + nome_tipo + "',
|
||||
]).'",
|
||||
html: "'.tr('Sei sicuro di voler abilitare il _TYPE_ _NAME_?', [
|
||||
'_TYPE_' => '" + nome_tipo + "',
|
||||
'_NAME_' => '" + nome + "',
|
||||
]).'",
|
||||
type: "warning",
|
||||
showCancelButton: true,
|
||||
confirmButtonText: "'.tr('Continua').'"
|
||||
}).then(function (result) {
|
||||
let restore = buttonLoading(button);
|
||||
|
||||
$.ajax({
|
||||
url: globals.rootdir + "/actions.php",
|
||||
type: "POST",
|
||||
dataType: "JSON",
|
||||
data: {
|
||||
id_module: globals.id_module,
|
||||
op: "abilita-modulo",
|
||||
tipo: tipo,
|
||||
id: id,
|
||||
},
|
||||
success: function (response) {
|
||||
caricaElencoModuli();
|
||||
renderMessages();
|
||||
},
|
||||
error: function() {
|
||||
buttonRestore(button, restore);
|
||||
|
||||
swal({
|
||||
type: "error",
|
||||
title: globals.translations.ajax.error.title,
|
||||
text: globals.translations.ajax.error.text,
|
||||
});
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
function abilitaSottoModuli(button) {
|
||||
const riga = $(button).closest("tr");
|
||||
const id = riga.data("id");
|
||||
|
||||
const nome = riga.data("nome");
|
||||
const tipo = riga.data("tipo");
|
||||
const nome_tipo = riga.data("nome_tipo");
|
||||
|
||||
swal({
|
||||
title: "'.tr('Abilitare tutti i sotto-moduli?').'",
|
||||
html: "'.tr('Sei sicuro di voler abilitare tutti i sotto-moduli del modulo _NAME_?', [
|
||||
'_NAME_' => '" + nome + "',
|
||||
]).'",
|
||||
type: "warning",
|
||||
showCancelButton: true,
|
||||
confirmButtonText: "'.tr('Continua').'"
|
||||
}).then(function (result) {
|
||||
let restore = buttonLoading(button);
|
||||
|
||||
$.ajax({
|
||||
url: globals.rootdir + "/actions.php",
|
||||
type: "POST",
|
||||
dataType: "JSON",
|
||||
data: {
|
||||
id_module: globals.id_module,
|
||||
op: "abilita-sotto-modulo",
|
||||
tipo: tipo,
|
||||
id: id,
|
||||
},
|
||||
success: function (response) {
|
||||
caricaElencoModuli();
|
||||
renderMessages();
|
||||
},
|
||||
error: function() {
|
||||
buttonRestore(button, restore);
|
||||
|
||||
swal({
|
||||
type: "error",
|
||||
title: globals.translations.ajax.error.title,
|
||||
text: globals.translations.ajax.error.text,
|
||||
});
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
function rimuoviModulo(button) {
|
||||
const riga = $(button).closest("tr");
|
||||
const id = riga.data("id");
|
||||
|
||||
const nome = riga.data("nome");
|
||||
const tipo = riga.data("tipo");
|
||||
const nome_tipo = riga.data("nome_tipo");
|
||||
|
||||
swal({
|
||||
title: "'.tr('Rimuovere il _TYPE_?', [
|
||||
'_TYPE_' => '" + nome_tipo + "',
|
||||
]).'",
|
||||
html: "'.tr('Sei sicuro di voler rimuovere il _TYPE_ _NAME_?', [
|
||||
'_TYPE_' => '" + nome_tipo + "',
|
||||
'_NAME_' => '" + nome + "',
|
||||
]).'<br>'.tr('Questa operazione è irreversibile e provocherà la potenziale perdita dei dati attualmente collegati al _TYPE_', [
|
||||
'_TYPE_' => '" + nome_tipo + "',
|
||||
]).'.",
|
||||
type: "warning",
|
||||
showCancelButton: true,
|
||||
confirmButtonText: "'.tr('Continua').'"
|
||||
}).then(function (result) {
|
||||
let restore = buttonLoading(button);
|
||||
|
||||
$.ajax({
|
||||
url: globals.rootdir + "/actions.php",
|
||||
type: "POST",
|
||||
dataType: "JSON",
|
||||
data: {
|
||||
id_module: globals.id_module,
|
||||
op: "rimuovi-modulo",
|
||||
tipo: tipo,
|
||||
id: id,
|
||||
},
|
||||
success: function (response) {
|
||||
caricaElencoModuli();
|
||||
renderMessages();
|
||||
},
|
||||
error: function() {
|
||||
buttonRestore(button, restore);
|
||||
|
||||
swal({
|
||||
type: "error",
|
||||
title: globals.translations.ajax.error.title,
|
||||
text: globals.translations.ajax.error.text,
|
||||
});
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.depth-0 {
|
||||
filter: brightness(1);
|
||||
}
|
||||
|
||||
.depth-1 {
|
||||
filter: brightness(1.05);
|
||||
}
|
||||
|
||||
.depth-2 {
|
||||
filter: brightness(1.1);
|
||||
}
|
||||
|
||||
.depth-3 {
|
||||
filter: brightness(1.15);
|
||||
}
|
||||
</style>';
|
||||
|
||||
function renderElencoModuli($elenco, $depth = 0)
|
||||
{
|
||||
$versione_gestionale = Update::getVersion();
|
||||
$moduli_sempre_attivi = ['Utenti e permessi', 'Stato dei servizi'];
|
||||
|
||||
$result = '';
|
||||
foreach ($elenco as $record) {
|
||||
$record_bloccato = in_array($record['name'], $moduli_sempre_attivi);
|
||||
|
||||
$is_plugin = !empty($record['idmodule_to']);
|
||||
$nome_tipo = string_lowercase($is_plugin ? tr('Plugin') : tr('Modulo'));
|
||||
|
||||
// Render per sotto-moduli
|
||||
$sotto_moduli = renderElencoModuli($record['all_children'], $depth + 1);
|
||||
|
||||
$elenco_plugin = null;
|
||||
if (empty($record['idmodule_to'])) {
|
||||
$plugins = database()->table('zz_plugins')
|
||||
->where('idmodule_to', '=', $record['id'])
|
||||
->get()->map(function ($i) {
|
||||
return (array) $i;
|
||||
})->toArray();
|
||||
|
||||
$elenco_plugin = renderElencoModuli($plugins, $depth + 1);
|
||||
}
|
||||
|
||||
// COMPATIBILITA'
|
||||
// Controllo per ogni versione se la regexp combacia per dire che è compatibile o meno
|
||||
$compatibile = false;
|
||||
$versioni_compatibili = explode(',', $record['compatibility']);
|
||||
foreach ($versioni_compatibili as $versione) {
|
||||
$compatibile = (preg_match('/'.$versione.'/', $versione_gestionale)) ? true : $compatibile;
|
||||
}
|
||||
|
||||
if ($compatibile) {
|
||||
$class = ($record['enabled']) ? 'success' : 'warning';
|
||||
} else {
|
||||
$class = 'danger';
|
||||
}
|
||||
|
||||
$result .= '
|
||||
<tr class="'.$class.' depth-'.$depth.'" data-id="'.$record['id'].'" data-nome='.json_encode($record['title']).' data-tipo="'.($is_plugin ? 'plugin' : 'module').'" data-nome_tipo='.json_encode($nome_tipo).'>
|
||||
<td>
|
||||
'.str_repeat(' ', $depth * 4).'- '.$record['title'].'
|
||||
'.($compatibile ? '' :
|
||||
'<div class="tip pull-right" data-toggle="tooltip" title="'.tr('Non compatibile!').' '.tr('Questo _TYPE_ è compatibile solo con le versioni: _LIST_', [
|
||||
'_TYPE_' => $nome_tipo,
|
||||
'_LIST_' => $record['compatibility'],
|
||||
]).'">
|
||||
<span class="label label-danger">
|
||||
<i class="fa fa-warning" title="'.tr('Non compatibile!').'"></i>
|
||||
</span>
|
||||
</div>'
|
||||
).'
|
||||
|
||||
'.($is_plugin ? '<span class="badge pull-right" style="margin-right: 5px">'.tr('Plugin').'</span>' : '').'
|
||||
</td>
|
||||
<td class="text-center">'.$record['version'].'</td>
|
||||
<td class="text-center">';
|
||||
|
||||
// Possibilità di disabilitare o abilitare il moduli/plugin
|
||||
if (!$record_bloccato) {
|
||||
if ($record['enabled']) {
|
||||
$result .= '
|
||||
<div class="tip" data-toggle="tooltip" title="'.tr('Questo _TYPE_ è abilitato: clicca qui per disabilitarlo', [
|
||||
'_TYPE_' => $nome_tipo,
|
||||
]).'">
|
||||
<button type="button" class="btn btn-warning btn-xs" onclick="disabilitaModulo(this)">
|
||||
<i class="fa fa-power-off" title="'.tr('Disabilita').'"></i>
|
||||
</button>
|
||||
</div>';
|
||||
|
||||
// Possibilità di abilitare tutti i sottomoduli
|
||||
$sotto_moduli_disabilitato = strpos($sotto_moduli, 'fa fa-plug') !== false;
|
||||
if ($sotto_moduli_disabilitato) {
|
||||
$result .= '
|
||||
<div class="tip" data-toggle="tooltip" title="'.tr('Abilita tutti i sotto-moduli').'">
|
||||
<button type="button" class="btn btn-success btn-xs" onclick="abilitaSottoModuli(this)">
|
||||
<i class="fa fa-recycle" title="'.tr('Abilita sotto-moduli').'"></i>
|
||||
</button>
|
||||
</div>';
|
||||
}
|
||||
} else {
|
||||
$result .= '
|
||||
<div class="tip" data-toggle="tooltip" title="'.tr('Questo _TYPE_ è disabilitato: clicca qui per abilitarlo', [
|
||||
'_TYPE_' => $nome_tipo,
|
||||
]).'">
|
||||
<button type="button" class="btn btn-success btn-xs" onclick="abilitaModulo(this)">
|
||||
<i class="fa fa-plug" title="'.tr('Abilita').'"></i>
|
||||
</button>
|
||||
</div>';
|
||||
}
|
||||
} else {
|
||||
$result .= '
|
||||
<div class="tip" data-toggle="tooltip" title="'.tr('Questo _TYPE_ non può essere disabilitato', [
|
||||
'_TYPE_' => $nome_tipo,
|
||||
]).'">
|
||||
<i class="fa fa-eye" title="'.tr('Modulo sempre abilitato').'"></i>
|
||||
</div>';
|
||||
}
|
||||
|
||||
$result .= '
|
||||
</td>
|
||||
<td class="text-center">';
|
||||
|
||||
// Possibilità di disinstallare solo se il modulo/plugin non è tra quelli predefiniti
|
||||
if (empty($record['default'])) {
|
||||
$result .= '
|
||||
<div class="tip" data-toggle="tooltip" title="'.tr('Puoi disintallare questo modulo: clicca qui per procedere').'">
|
||||
<button type="button" class="btn btn-danger btn-xs" onclick="rimuoviModulo(this)">
|
||||
<i class="fa fa-trash" title="'.tr('Disinstalla').'"></i>
|
||||
</button>
|
||||
</div>';
|
||||
} else {
|
||||
$result .= '
|
||||
<div class="tip" data-toggle="tooltip" title="'.tr('Questo _TYPE_ non può essere disinstallato', [
|
||||
'_TYPE_' => $nome_tipo,
|
||||
]).'">
|
||||
<i class="fa fa-trash text-muted" title="'.tr('Modulo non disinstallabile').'"></i>
|
||||
</div>';
|
||||
}
|
||||
|
||||
$result .= '
|
||||
</td>
|
||||
</tr>';
|
||||
|
||||
$result .= $elenco_plugin;
|
||||
$result .= $sotto_moduli;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
|
@ -0,0 +1,253 @@
|
|||
<?php
|
||||
/*
|
||||
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
|
||||
* Copyright (C) DevCode s.r.l.
|
||||
*
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
echo '
|
||||
<table class="table table-hover table-condensed">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>'.tr('Nome').'</th>
|
||||
<th>'.tr('Posizione').'</th>
|
||||
<th>'.tr('Stato').'</th>
|
||||
<th>'.tr('Posizione').'</th>
|
||||
</tr>
|
||||
</thead>';
|
||||
|
||||
$widgets = $dbo->fetchArray('SELECT zz_widgets.*, zz_modules.name AS modulo
|
||||
FROM zz_widgets
|
||||
INNER JOIN zz_modules ON zz_widgets.id_module = zz_modules.id
|
||||
ORDER BY `id_module` ASC, `zz_widgets`.`order` ASC');
|
||||
|
||||
$gruppi = collect($widgets)->groupBy('modulo');
|
||||
foreach ($gruppi as $modulo => $widgets) {
|
||||
echo '
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="4">'.$modulo.'</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>';
|
||||
|
||||
foreach ($widgets as $widget) {
|
||||
$class = $widget['enabled'] ? 'success' : 'warning';
|
||||
$nome_tipo = 'widget';
|
||||
|
||||
echo '
|
||||
<tr class="'.$class.'" data-id="'.$widget['id'].'" data-nome='.json_encode($widget['name']).'>
|
||||
<td>
|
||||
'.$widget['name'].(!empty($widget['help']) ? '
|
||||
<i class="tip fa fa-question-circle-o" title="'.$widget['help'].'"</i>' : '').'
|
||||
</td>
|
||||
<td><small>'.(
|
||||
string_starts_with($widget['location'], 'controller') ?
|
||||
tr('Schermata modulo') :
|
||||
tr('Schermata dettagli')
|
||||
).'</small></td>
|
||||
<td class="text-center">';
|
||||
|
||||
// Possibilità di disabilitare o abilitare il widget
|
||||
if ($widget['enabled']) {
|
||||
echo '
|
||||
<div class="tip" data-toggle="tooltip" title="'.tr('Questo _TYPE_ è abilitato: clicca qui per disabilitarlo', [
|
||||
'_TYPE_' => $nome_tipo,
|
||||
]).'">
|
||||
<button type="button" class="btn btn-warning btn-xs" onclick="disabilitaWidget(this)">
|
||||
<i class="fa fa-power-off" title="'.tr('Disabilita').'"></i>
|
||||
</button>
|
||||
</div>';
|
||||
} else {
|
||||
echo '
|
||||
<div class="tip" data-toggle="tooltip" title="'.tr('Questo _TYPE_ è disabilitato: clicca qui per abilitarlo', [
|
||||
'_TYPE_' => $nome_tipo,
|
||||
]).'">
|
||||
<button type="button" class="btn btn-success btn-xs" onclick="abilitaWidget(this)">
|
||||
<i class="fa fa-plug" title="'.tr('Abilita').'"></i>
|
||||
</button>
|
||||
</div>';
|
||||
}
|
||||
|
||||
echo '
|
||||
</td>
|
||||
<td class="text-center">';
|
||||
|
||||
// Possibilità di spostare il widget
|
||||
if (string_ends_with($widget['location'], 'top')) {
|
||||
echo '
|
||||
<div class="tip" data-toggle="tooltip" title="'.tr('Questo widget è posizionato nella parte superiore della pagina').'">
|
||||
<i class="fa fa-arrow-up" title="'.tr('Parte superiore').'"></i>
|
||||
</div>
|
||||
|
||||
<div class="tip" data-toggle="tooltip" title="'.tr('Clicca qui per spostare il widget nella parte laterale').'">
|
||||
<button type="button" class="btn btn-info btn-xs" onclick="spostaWidget(this)">
|
||||
<i class="fa fa-arrow-right" title="'.tr('Sposta').'"></i>
|
||||
</button>
|
||||
</div>';
|
||||
} else {
|
||||
echo '
|
||||
<div class="tip" data-toggle="tooltip" title="'.tr('Clicca qui per spostare il widget nella parte superiore').'">
|
||||
<button type="button" class="btn btn-info btn-xs" onclick="spostaWidget(this)">
|
||||
<i class="fa fa-arrow-up" title="'.tr('Sposta').'"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="tip" data-toggle="tooltip" title="'.tr('Questo widget è posizionato nella parte laterale della pagina').'">
|
||||
<i class="fa fa-arrow-right" title="'.tr('Parte laterale').'"></i>
|
||||
</div>';
|
||||
}
|
||||
|
||||
echo '
|
||||
</td>
|
||||
</tr>';
|
||||
}
|
||||
|
||||
echo '
|
||||
</tbody>';
|
||||
}
|
||||
|
||||
echo '
|
||||
</table>
|
||||
|
||||
<script>
|
||||
function disabilitaWidget(button){
|
||||
const riga = $(button).closest("tr");
|
||||
const id = riga.data("id");
|
||||
|
||||
const nome = riga.data("nome");
|
||||
const nome_tipo = "widget";
|
||||
|
||||
swal({
|
||||
title: "'.tr('Disabilitare il _TYPE_?', [
|
||||
'_TYPE_' => '" + nome_tipo + "',
|
||||
]).'",
|
||||
html: "'.tr('Sei sicuro di voler disabilitare il _TYPE_ _NAME_?', [
|
||||
'_TYPE_' => '" + nome_tipo + "',
|
||||
'_NAME_' => '" + nome + "',
|
||||
]).'",
|
||||
type: "warning",
|
||||
showCancelButton: true,
|
||||
confirmButtonText: "'.tr('Continua').'"
|
||||
}).then(function (result) {
|
||||
let restore = buttonLoading(button);
|
||||
|
||||
$.ajax({
|
||||
url: globals.rootdir + "/actions.php",
|
||||
type: "POST",
|
||||
dataType: "JSON",
|
||||
data: {
|
||||
id_module: globals.id_module,
|
||||
op: "disabilita-widget",
|
||||
id: id,
|
||||
},
|
||||
success: function (response) {
|
||||
caricaElencoWidget();
|
||||
renderMessages();
|
||||
},
|
||||
error: function() {
|
||||
buttonRestore(button, restore);
|
||||
|
||||
swal({
|
||||
type: "error",
|
||||
title: globals.translations.ajax.error.title,
|
||||
text: globals.translations.ajax.error.text,
|
||||
});
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
function abilitaWidget(button) {
|
||||
const riga = $(button).closest("tr");
|
||||
const id = riga.data("id");
|
||||
|
||||
const nome = riga.data("nome");
|
||||
const nome_tipo = "widget";
|
||||
|
||||
swal({
|
||||
title: "'.tr('Abilitare il _TYPE_?', [
|
||||
'_TYPE_' => '" + nome_tipo + "',
|
||||
]).'",
|
||||
html: "'.tr('Sei sicuro di voler abilitare il _TYPE_ _NAME_?', [
|
||||
'_TYPE_' => '" + nome_tipo + "',
|
||||
'_NAME_' => '" + nome + "',
|
||||
]).'",
|
||||
type: "warning",
|
||||
showCancelButton: true,
|
||||
confirmButtonText: "'.tr('Continua').'"
|
||||
}).then(function (result) {
|
||||
let restore = buttonLoading(button);
|
||||
|
||||
$.ajax({
|
||||
url: globals.rootdir + "/actions.php",
|
||||
type: "POST",
|
||||
dataType: "JSON",
|
||||
data: {
|
||||
id_module: globals.id_module,
|
||||
op: "abilita-widget",
|
||||
id: id,
|
||||
},
|
||||
success: function (response) {
|
||||
caricaElencoWidget();
|
||||
renderMessages();
|
||||
},
|
||||
error: function() {
|
||||
buttonRestore(button, restore);
|
||||
|
||||
swal({
|
||||
type: "error",
|
||||
title: globals.translations.ajax.error.title,
|
||||
text: globals.translations.ajax.error.text,
|
||||
});
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
function spostaWidget(button) {
|
||||
const riga = $(button).closest("tr");
|
||||
const id = riga.data("id");
|
||||
|
||||
let restore = buttonLoading(button);
|
||||
|
||||
$.ajax({
|
||||
url: globals.rootdir + "/actions.php",
|
||||
type: "POST",
|
||||
dataType: "JSON",
|
||||
data: {
|
||||
id_module: globals.id_module,
|
||||
op: "sposta-widget",
|
||||
id: id,
|
||||
},
|
||||
success: function (response) {
|
||||
caricaElencoWidget();
|
||||
renderMessages();
|
||||
},
|
||||
error: function() {
|
||||
buttonRestore(button, restore);
|
||||
|
||||
swal({
|
||||
type: "error",
|
||||
title: globals.translations.ajax.error.title,
|
||||
text: globals.translations.ajax.error.text,
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>';
|
|
@ -1,98 +0,0 @@
|
|||
<?php
|
||||
/*
|
||||
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
|
||||
* Copyright (C) DevCode s.r.l.
|
||||
*
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
function submodules($list, $depth = 0)
|
||||
{
|
||||
$osm_version = Update::getVersion();
|
||||
|
||||
$id_module = Modules::getCurrent()['id'];
|
||||
|
||||
$result = '';
|
||||
|
||||
foreach ($list as $sub) {
|
||||
$locked = in_array($sub['name'], ['Utenti e permessi', 'Stato dei servizi']);
|
||||
|
||||
// STATO
|
||||
if (!empty($sub['enabled'])) {
|
||||
$text = tr('Abilitato');
|
||||
$text .= !$locked ? '. '.tr('Clicca per disabilitarlo').'...' : '';
|
||||
$stato = '<i class="fa fa-cog fa-spin text-success tip" title="'.$text.'"></i>';
|
||||
} else {
|
||||
$stato = '<i class="fa fa-cog text-warning tip" title="'.tr('Non abilitato').'"></i>';
|
||||
$class = 'warning';
|
||||
}
|
||||
|
||||
// Possibilità di disabilitare o abilitare i moduli tranne quello degli aggiornamenti
|
||||
if (!$locked) {
|
||||
if ($sub['enabled']) {
|
||||
$stato = "<a href='javascript:;' onclick=\"if( confirm('".tr('Disabilitare questo modulo?')."') ){ $.post( '".base_path().'/actions.php?id_module='.$id_module."', { op: 'disable', id: '".$sub['id']."' }, function(response){ location.href='".base_path().'/controller.php?id_module='.$id_module."'; }); }\">".$stato."</a>\n";
|
||||
} else {
|
||||
$stato = "<a href='javascript:;' onclick=\"if( confirm('".tr('Abilitare questo modulo?')."') ){ $.post( '".base_path().'/actions.php?id_module='.$id_module."', { op: 'enable', id: '".$sub['id']."' }, function(response){ location.href='".base_path().'/controller.php?id_module='.$id_module."'; }); }\"\">".$stato."</a>\n";
|
||||
}
|
||||
}
|
||||
|
||||
// COMPATIBILITA'
|
||||
// Controllo per ogni versione se la regexp combacia per dire che è compatibile o meno
|
||||
$compatibilities = explode(',', $sub['compatibility']);
|
||||
|
||||
$comp = false;
|
||||
foreach ($compatibilities as $compatibility) {
|
||||
$comp = (preg_match('/'.$compatibility.'/', $osm_version)) ? true : $comp;
|
||||
}
|
||||
|
||||
if ($comp) {
|
||||
$compatible = '<i class="fa fa-check-circle text-success tip" title="'.tr('Compatibile').'"></i>';
|
||||
($sub['enabled']) ? $class = 'success' : $class = 'warning';
|
||||
} else {
|
||||
$compatible = '<i class="fa fa-warning text-danger tip" title="'.tr('Non compatibile!').' '.tr('Questo modulo è compatibile solo con le versioni').': '.$sub['compatibility'].'"></i>';
|
||||
$class = 'danger';
|
||||
}
|
||||
|
||||
$result .= '
|
||||
<tr class="'.$class.'">
|
||||
<td><small>'.str_repeat(' ', $depth * 4).'- '.$sub['title'].'</small></td>
|
||||
<td align="left">'.$sub['version'].'</td>
|
||||
<td align="center">'.$stato.'</td>
|
||||
<td align="center">'.$compatible.'</td>';
|
||||
|
||||
$result .= '
|
||||
<td align="center">';
|
||||
|
||||
// Possibilità di disinstallare solo se il modulo non è tra quelli predefiniti
|
||||
if (empty($sub['default'])) {
|
||||
$result .= '
|
||||
<a href="javascript:;" class="tip" title="'.tr('Disinstalla')."...\" onclick=\"if( confirm('".tr('Vuoi disinstallare questo modulo?').' '.tr('Tutti i dati salvati andranno persi!')."') ){ if( confirm('".tr('Sei veramente sicuro?')."') ){ $.post( '".base_path().'/actions.php?id_module='.$id_module."', { op: 'uninstall', id: '".$sub['id']."' }, function(response){ location.href='".base_path().'/controller.php?id_module='.$id_module."'; }); } }\">
|
||||
<i class='fa fa-trash'></i>
|
||||
</a>";
|
||||
} else {
|
||||
$result .= "
|
||||
<a class='disabled text-muted'>
|
||||
<i class='fa fa-trash'></i>
|
||||
</a>";
|
||||
}
|
||||
|
||||
$result .= '
|
||||
</td>
|
||||
</tr>';
|
||||
|
||||
$result .= submodules($sub['all_children'], $depth + 1);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
|
@ -32,44 +32,50 @@ class ServicesHook extends CachedManager
|
|||
|
||||
public function cacheData()
|
||||
{
|
||||
$response = Services::request('POST', 'informazioni_servizi');
|
||||
$body = Services::responseBody($response);
|
||||
$response = Services::request('GET', 'info');
|
||||
|
||||
return $body['services'];
|
||||
return Services::responseBody($response);
|
||||
}
|
||||
|
||||
public function response()
|
||||
{
|
||||
$servizi = $this->getCache()->content;
|
||||
$limite_scadenze = (new Carbon())->addDays(60);
|
||||
|
||||
// Elaborazione dei servizi in scadenza
|
||||
$limite_scadenze = (new Carbon())->addDays(60);
|
||||
$servizi_in_scadenza = [];
|
||||
foreach ($servizi as $servizio) {
|
||||
// Gestione per data di scadenza
|
||||
$scadenza = new Carbon($servizio['expiration_at']);
|
||||
if (
|
||||
(isset($servizio['expiration_at']) && $scadenza->lessThan($limite_scadenze))
|
||||
) {
|
||||
$servizi_in_scadenza[] = $servizio['name'].' ('.$scadenza->diffForHumans().')';
|
||||
}
|
||||
|
||||
// Gestione per crediti
|
||||
elseif (
|
||||
(isset($servizio['credits']) && $servizio['credits'] < 100)
|
||||
) {
|
||||
$servizi_in_scadenza[] = $servizio['name'].' ('.$servizio['credits'].' crediti)';
|
||||
}
|
||||
}
|
||||
$risorse_in_scadenza = self::getRisorseInScadenza($servizi['risorse-api'], $limite_scadenze);
|
||||
|
||||
$message = tr('I seguenti servizi sono in scadenza: _LIST_', [
|
||||
'_LIST_' => implode(', ', $servizi_in_scadenza),
|
||||
'_LIST_' => implode(', ', $risorse_in_scadenza->pluck('nome')->all()),
|
||||
]);
|
||||
|
||||
return [
|
||||
'icon' => 'fa fa-refresh text-warning',
|
||||
'message' => $message,
|
||||
'show' => !empty($servizi_in_scadenza),
|
||||
'show' => !$risorse_in_scadenza->isEmpty(),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce l'elenco delle risorse API in scadenza, causa data oppure crediti.
|
||||
*
|
||||
* @param $servizi
|
||||
*/
|
||||
public static function getRisorseInScadenza($risorse, $limite_scadenze)
|
||||
{
|
||||
// Elaborazione dei servizi in scadenza
|
||||
$risorse_in_scadenza = collect($risorse)
|
||||
->filter(function ($item) use ($limite_scadenze) {
|
||||
return (isset($item['expiration_at']) && Carbon::parse($item['expiration_at'])->lessThan($limite_scadenze))
|
||||
|| (isset($item['credits']) && $item['credits'] < 100);
|
||||
});
|
||||
|
||||
return $risorse_in_scadenza->transform(function ($item, $key) {
|
||||
return [
|
||||
'nome' => $item['name'],
|
||||
'data_scadenza' => $item['expiration_at'],
|
||||
'crediti' => $item['credits'],
|
||||
];
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -83,3 +83,9 @@ INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `slow`,
|
|||
|
||||
-- Rimosso reversed sulle note di debito
|
||||
UPDATE `co_tipidocumento` SET `reversed` = '0' WHERE `co_tipidocumento`.`descrizione` = 'Nota di debito';
|
||||
|
||||
-- Fix recupero informazioni sui servizi attivi
|
||||
UPDATE `zz_cache` SET `expire_at` = NULL WHERE `zz_cache`.`name` = 'Informazioni su Services';
|
||||
|
||||
-- Fix flag default per i plugin
|
||||
UPDATE `zz_plugins` SET `default` = 1, `version` = '' WHERE `zz_plugins`.`name` IN ('Impianti del cliente', 'Impianti', 'Referenti', 'Sedi', 'Statistiche', 'Interventi svolti', 'Componenti ini', 'Movimenti', 'Serial', 'Consuntivo', 'Consuntivo', 'Pianificazione interventi', 'Ddt del cliente', 'Fatturazione Elettronica', 'Fatturazione Elettronica', 'Revisioni', 'Ricevute FE', 'Giacenze', 'Rinnovi', 'Statistiche', 'Dichiarazioni d''Intento', 'Pianificazione fatturazione', 'Listino Clienti', 'Storico attività', 'Consuntivo', 'Allegati', 'Componenti', 'Listino Fornitori', 'Piani di sconto/maggiorazione', 'Varianti Articolo')
|
||||
|
|
Loading…
Reference in New Issue