Skip to content

Commit bf02e8f

Browse files
committed
refactor: miglioria permessi su Viste e Segmenti
1 parent 8d74821 commit bf02e8f

12 files changed

Lines changed: 782 additions & 148 deletions

File tree

modules/segmenti/actions.php

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
*/
2020

2121
include_once __DIR__.'/../../core.php';
22-
use Models\Group;
2322

2423
switch (post('op')) {
2524
case 'update':
@@ -101,16 +100,27 @@
101100
'id_lang' => Models\Locale::getDefault()->id,
102101
]);
103102

104-
// Aggiunta permessi segmento
105-
$gruppi = Group::get();
103+
// Aggiunta permessi segmento solo per i gruppi che hanno accesso al modulo
104+
$gruppi_con_accesso = $dbo->fetchArray('SELECT `idgruppo` FROM `zz_permissions` WHERE `idmodule` = '.prepare($module).' AND `permessi` IN (\'r\', \'rw\')');
105+
106+
// Assicurati che il gruppo Amministratori (ID 1) sia incluso
107+
$id_gruppo_admin = 1; // ID del gruppo Amministratori
108+
$gruppi_ids = array_column($gruppi_con_accesso, 'idgruppo');
109+
if (!in_array($id_gruppo_admin, $gruppi_ids)) {
110+
$gruppi_con_accesso[] = ['idgruppo' => $id_gruppo_admin];
111+
}
112+
106113
$array = [];
107-
foreach ($gruppi as $gruppo) {
114+
foreach ($gruppi_con_accesso as $gruppo) {
108115
$array[] = [
109-
'id_gruppo' => $gruppo->id,
116+
'id_gruppo' => $gruppo['idgruppo'],
110117
'id_segment' => $id_record,
111118
];
112119
}
113-
$dbo->insert('zz_group_segment', $array);
120+
121+
if (!empty($array)) {
122+
$dbo->insert('zz_group_segment', $array);
123+
}
114124

115125
flash()->info(tr('Nuovo segmento aggiunto'));
116126

modules/segmenti/bulk.php

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,41 @@
3434
break;
3535
}
3636

37+
// Convert to array and filter out empty values
38+
$records = array_filter((array) $id_records);
39+
40+
// Default query for when there are no valid records
41+
$query = "SELECT DISTINCT `zz_groups`.`id`, `title` AS descrizione FROM `zz_groups`
42+
LEFT JOIN `zz_groups_lang` ON (`zz_groups`.`id` = `zz_groups_lang`.`id_record`
43+
AND `zz_groups_lang`.`id_lang` = ".prepare(Models\Locale::getDefault()->id).")
44+
WHERE `zz_groups`.`id` = 1
45+
ORDER BY `zz_groups`.`id` ASC";
46+
47+
// If we have valid records, use the full query with IN clause
48+
if (!empty($records)) {
49+
$records_list = implode(',', $records);
50+
$query = "SELECT DISTINCT `zz_groups`.`id`, `title` AS descrizione FROM `zz_groups`
51+
LEFT JOIN `zz_groups_lang` ON (`zz_groups`.`id` = `zz_groups_lang`.`id_record`
52+
AND `zz_groups_lang`.`id_lang` = ".prepare(Models\Locale::getDefault()->id).")
53+
WHERE `zz_groups`.`id` = 1
54+
OR `zz_groups`.`id` IN (
55+
SELECT DISTINCT `idgruppo` FROM `zz_permissions`
56+
WHERE `permessi` IN ('r', 'rw')
57+
AND `idmodule` IN (
58+
SELECT DISTINCT `id_module` FROM `zz_segments`
59+
WHERE `id` IN (".$records_list.")
60+
)
61+
)
62+
ORDER BY `zz_groups`.`id` ASC";
63+
}
64+
65+
$msg = '{[ "type": "select", "multiple":"1", "label": "<small>'.tr('Seleziona i gruppi che avranno accesso ai segmenti selezionati:').'</small>", "values": "query='.$query.'", "name": "gruppi[]" ]}';
66+
3767
$operations['set_groups'] = [
3868
'text' => '<span><i class="fa fa-users"></i> '.tr('Imposta l\'accesso ai segmenti').'</span>',
3969
'data' => [
4070
'title' => tr('Imposta l\'accesso ai segmenti.'),
41-
'msg' => '{[ "type": "select", "multiple":"1", "label": "<small>'.tr('Seleziona i gruppi che avranno accesso ai segmenti selezionati:').'</small>", "values": "query=SELECT `zz_groups`.`id`, `title` AS descrizione FROM `zz_groups` LEFT JOIN `zz_groups_lang` ON (`zz_groups`.`id` = `zz_groups_lang`.`id_record` AND `zz_groups_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).') ORDER BY `zz_groups`.`id` ASC", "name": "gruppi[]" ]}',
71+
'msg' => $msg,
4272
'button' => tr('Procedi'),
4373
'class' => 'btn btn-lg btn-warning',
4474
'blank' => false,

modules/segmenti/edit.php

Lines changed: 113 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -28,43 +28,44 @@
2828
<!-- DATI SEGMENTO -->
2929
<div class="card card-primary">
3030
<div class="card-header">
31-
<h3 class="card-title"><?php echo tr('Segmento'); ?></h3>
31+
<h3 class="card-title"><i class="fa fa-filter"></i> <?php echo tr('Informazioni segmento'); ?></h3>
3232
</div>
3333

3434
<div class="card-body">
3535
<div class="row">
36-
37-
<div class="col-md-3">
38-
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "name", "required": 1, "value": "$title$" ]}
36+
<div class="col-md-6">
37+
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "name", "required": 1, "value": "$title$", "icon-before": "<i class='fa fa-tag'></i>" ]}
3938
</div>
4039

41-
<div class="col-md-3">
42-
{[ "type": "select", "label": "<?php echo tr('Modulo'); ?>", "name": "module", "required": 1, "values": "query=SELECT `zz_modules`.`id`, `title` AS descrizione FROM `zz_modules` LEFT JOIN `zz_modules_lang` ON(`zz_modules`.`id` = `zz_modules_lang`.`id_record` AND `zz_modules_lang`.`id_lang` = <?php echo Models\Locale::getDefault()->id; ?>) WHERE (`enabled` = 1 AND `options` != 'custom' ) OR `zz_modules`.`id` = <?php echo $record['id_module']; ?> ORDER BY `title` ASC", "value": "<?php echo $record['id_module']; ?>", "extra": "<?php echo ($record['predefined']) ? 'readonly' : ''; ?>" ]}
40+
<div class="col-md-6">
41+
{[ "type": "select", "label": "<?php echo tr('Modulo'); ?>", "name": "module", "required": 1, "values": "query=SELECT `zz_modules`.`id`, `title` AS descrizione FROM `zz_modules` LEFT JOIN `zz_modules_lang` ON(`zz_modules`.`id` = `zz_modules_lang`.`id_record` AND `zz_modules_lang`.`id_lang` = <?php echo Models\Locale::getDefault()->id; ?>) WHERE (`enabled` = 1 AND `options` != 'custom' ) OR `zz_modules`.`id` = <?php echo $record['id_module']; ?> ORDER BY `title` ASC", "value": "<?php echo $record['id_module']; ?>", "extra": "<?php echo ($record['predefined']) ? 'readonly' : ''; ?>", "icon-before": "<i class='fa fa-cube'></i>" ]}
4342
</div>
43+
</div>
4444

45-
<div class="col-md-2">
45+
<div class="row">
46+
<div class="col-md-4">
4647
{[ "type": "checkbox", "label": "<?php echo tr('Predefinito'); ?>", "name": "predefined", "value": "$predefined$", "help": "<?php echo tr('Seleziona per rendere il segmento predefinito.'); ?>", "placeholder": "<?php echo tr('Segmento predefinito'); ?>", "extra": "<?php echo $record['predefined'] || ($record['is_sezionale'] == 0) ? 'readonly' : ''; ?>" ]}
4748
</div>
4849

49-
<div class="col-md-2">
50+
<div class="col-md-4">
5051
{[ "type": "checkbox", "label": "<?php echo tr('Tipologia'); ?>", "help": "<?php echo tr('Se sezionale verrà utilizzato il contatore'); ?>", "name": "is_sezionale", "value": "$is_sezionale$", "extra": "readonly", "values": "Sezionale,Segmento" ]}
5152
</div>
5253

53-
<div class="col-md-2">
54-
{[ "type": "text", "label": "<?php echo tr('Maschera'); ?>", "name": "pattern", "value": "$pattern$", "maxlength": 25, "placeholder":"####/YYYY", "extra": "<?php echo ($tot > 0) ? 'readonly' : ''; ?>", "extra": "<?php echo (!$record['is_sezionale']) ? 'readonly' : ''; ?>" ]}
54+
<div class="col-md-4">
55+
{[ "type": "text", "label": "<?php echo tr('Maschera'); ?>", "name": "pattern", "value": "$pattern$", "maxlength": 25, "placeholder":"####/YYYY", "extra": "<?php echo ($tot > 0) ? 'readonly' : ''; ?>", "extra": "<?php echo (!$record['is_sezionale']) ? 'readonly' : ''; ?>", "icon-before": "<i class='fa fa-hashtag'></i>" ]}
5556
</div>
5657
</div>
5758

58-
<div class="row">
59+
<hr>
5960

61+
<div class="row">
6062
<div class="col-md-8">
61-
{[ "type": "textarea", "label": "<?php echo tr('Filtro'); ?>", "name": "clause", "required": 1, "value": "$clause$", "extra": "<?php echo ($record['is_sezionale']) ? 'readonly' : ''; ?>" ]}
63+
{[ "type": "textarea", "label": "<?php echo tr('Filtro'); ?>", "name": "clause", "required": 1, "value": "$clause$", "extra": "<?php echo ($record['is_sezionale']) ? 'readonly' : ''; ?>", "icon-before": "<i class='fa fa-code'></i>" ]}
6264
</div>
6365

6466
<div class="col-md-4">
65-
{[ "type": "select", "label": "<?php echo tr('Posizione'); ?>", "name": "position", "required": 1, "values":"list=\"WHR\": \"WHERE\", \"HVN\": \"HAVING\"", "value": "$position$", "extra": "<?php echo ($record['is_sezionale']) ? 'readonly' : ''; ?>" ]}
67+
{[ "type": "select", "label": "<?php echo tr('Posizione'); ?>", "name": "position", "required": 1, "values":"list=\"WHR\": \"WHERE\", \"HVN\": \"HAVING\"", "value": "$position$", "extra": "<?php echo ($record['is_sezionale']) ? 'readonly' : ''; ?>", "icon-before": "<i class='fa fa-map-marker'></i>" ]}
6668
</div>
67-
6869
</div>
6970
<?php
7071

@@ -75,19 +76,102 @@
7576

7677
$current_module = Module::find($record['id_module']);
7778
$total = Util\Query::readQuery($current_module);
78-
$module_query = Modules::replaceAdditionals($record['id_module'], $total['query']);
7979

80-
echo '
81-
<p><strong>'.tr('Query risultante').':</strong></p>
82-
<p>'.htmlentities((string) $module_query).'</p>';
80+
// Check if $total is an array and has the 'query' key
81+
if (is_array($total) && isset($total['query'])) {
82+
$module_query = Modules::replaceAdditionals($record['id_module'], $total['query']);
83+
84+
echo '
85+
<div class="card card-info mt-4">
86+
<div class="card-header">
87+
<h3 class="card-title"><i class="fa fa-database"></i> '.tr('Query risultante').'</h3>
88+
<div class="card-tools">
89+
<button type="button" class="btn btn-sm btn-light" id="format-query-btn" title="'.tr('Formatta query').'">
90+
<i class="fa fa-indent"></i> '.tr('Formatta').'
91+
</button>
92+
<button type="button" class="btn btn-sm btn-light ml-2" id="copy-query-btn" title="'.tr('Copia query').'">
93+
<i class="fa fa-copy"></i> '.tr('Copia').'
94+
</button>
95+
</div>
96+
</div>
97+
<div class="card-body p-0">
98+
<div class="sql-formatted" style="max-height: 200px; overflow: auto; padding: 10px; white-space: pre;">'.htmlentities((string) $module_query).'</div>
99+
<textarea id="query-to-copy" style="position: absolute; left: -9999px;">'.htmlentities((string) $module_query).'</textarea>
100+
</div>
101+
</div>
102+
103+
<script>
104+
$(document).ready(function() {
105+
// Event listener per il pulsante di copia
106+
$("#copy-query-btn").click(function() {
107+
var copyText = document.getElementById("query-to-copy");
108+
copyText.select();
109+
document.execCommand("copy");
110+
111+
// Mostra un messaggio di conferma
112+
swal("'.tr('Copiato').'", "'.tr('Query copiata negli appunti').'", "success");
113+
});
114+
115+
// Event listener per il pulsante di formattazione
116+
$("#format-query-btn").click(function() {
117+
var sqlFormattedDiv = $(".sql-formatted");
118+
119+
// Alterna tra la visualizzazione con e senza barre di scorrimento
120+
if (sqlFormattedDiv.hasClass("formatted")) {
121+
// Ripristina la visualizzazione originale con barre di scorrimento
122+
sqlFormattedDiv.removeClass("formatted");
123+
124+
// Ripristina lo stile originale
125+
sqlFormattedDiv.css({
126+
"max-height": "200px",
127+
"overflow": "auto",
128+
"white-space": "pre"
129+
});
130+
131+
// Cambia l\'icona e il testo del pulsante
132+
$("#format-query-btn i").removeClass("fa-compress").addClass("fa-indent");
133+
$("#format-query-btn").attr("title", "'.tr('Formatta query').'");
134+
$("#format-query-btn").html(\'<i class="fa fa-indent"></i> '.tr('Formatta').'\');
135+
} else {
136+
// Rimuovi le barre di scorrimento e adatta l\'altezza al contenuto
137+
sqlFormattedDiv.addClass("formatted");
138+
139+
// Modifica lo stile del contenitore
140+
sqlFormattedDiv.css({
141+
"max-height": "none",
142+
"overflow": "visible",
143+
"white-space": "pre-wrap"
144+
});
145+
146+
// Cambia l\'icona e il testo del pulsante
147+
$("#format-query-btn i").removeClass("fa-indent").addClass("fa-compress");
148+
$("#format-query-btn").attr("title", "'.tr('Comprimi query').'");
149+
$("#format-query-btn").html(\'<i class="fa fa-compress"></i> '.tr('Comprimi').'\');
150+
}
151+
});
152+
});
153+
</script>';
154+
} else {
155+
echo '
156+
<div class="card card-warning mt-4">
157+
<div class="card-header">
158+
<h3 class="card-title"><i class="fa fa-exclamation-triangle"></i> '.tr('Query risultante').'</h3>
159+
</div>
160+
<div class="card-body">
161+
<div class="alert alert-warning">
162+
<i class="fa fa-exclamation-circle"></i> '.tr('Impossibile generare la query').'
163+
</div>
164+
</div>
165+
</div>';
166+
}
83167

84168
$_SESSION['module_'.$id_module]['id_segment'] = $previous;
85169
$_SESSION['module_'.$record['id_module']]['id_segment'] = $previous_module;
86170

87171
?>
88172
<div class="row">
89173
<div class="col-md-12">
90-
{[ "type": "textarea", "label": "<?php echo tr('Note'); ?>", "name": "note", "value": "$note$" ]}
174+
{[ "type": "textarea", "label": "<?php echo tr('Note'); ?>", "name": "note", "value": "$note$", "icon-before": "<i class='fa fa-sticky-note'></i>" ]}
91175
</div>
92176
</div>
93177
<?php
@@ -101,14 +185,21 @@
101185
<?php
102186
}
103187
echo '
104-
<div class="row">
105-
<div class="col-md-12">
106-
{[ "type": "select", "label": "'.tr('Gruppi con accesso').'", "name": "gruppi[]", "multiple": "1", "values": "query=SELECT `zz_groups`.`id`, `title` AS descrizione FROM `zz_groups` LEFT JOIN `zz_groups_lang` ON (`zz_groups`.`id` = `zz_groups_lang`.`id_record` AND `zz_groups_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).') ORDER BY `zz_groups`.`id` ASC", "value": "';
188+
<div class="card card-success mt-4">
189+
<div class="card-header">
190+
<h3 class="card-title"><i class="fa fa-users"></i> '.tr('Permessi').'</h3>
191+
</div>
192+
<div class="card-body">
193+
<div class="row">
194+
<div class="col-md-12">
195+
{[ "type": "select", "label": "'.tr('Gruppi con accesso').'", "name": "gruppi[]", "multiple": "1", "icon-before": "<i class=\'fa fa-users\'></i>", "values": "query=SELECT DISTINCT `zz_groups`.`id`, `title` AS descrizione FROM `zz_groups` LEFT JOIN `zz_groups_lang` ON (`zz_groups`.`id` = `zz_groups_lang`.`id_record` AND `zz_groups_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).') WHERE `zz_groups`.`id` IN (SELECT `idgruppo` FROM `zz_permissions` WHERE `idmodule` = '.prepare($record['id_module']).' AND `permessi` IN (\'r\', \'rw\')) OR `zz_groups`.`id` IN (SELECT `id_gruppo` FROM `zz_group_segment` WHERE `id_segment` = '.prepare($id_record).') ORDER BY `zz_groups`.`id` ASC", "value": "';
107196
$results = $dbo->fetchArray('SELECT GROUP_CONCAT(DISTINCT `id_gruppo` SEPARATOR \',\') AS gruppi FROM `zz_group_segment` WHERE `id_segment`='.prepare($id_record));
108197

109198
echo $results[0]['gruppi'].'"';
110199

111200
echo ', "help": "'.tr('Gruppi di utenti in grado di visualizzare questo segmento').'" ]}
201+
</div>
202+
</div>
112203
</div>
113204
</div>';
114205
?>

modules/utenti/actions.php

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -276,23 +276,16 @@
276276
} else {
277277
$query = 'UPDATE zz_permissions SET permessi='.prepare($permessi).' WHERE id='.prepare($rs[0]['id']);
278278
}
279-
280-
// Aggiunta dei permessi relativi alle viste
281-
$count = $dbo->fetchNum('SELECT * FROM `zz_group_view` WHERE `id_gruppo` = '.prepare($id_record).' AND `id_vista` IN (SELECT `id` FROM `zz_views` WHERE `id_module`='.prepare($idmodulo).')');
282-
283-
if (empty($count)) {
284-
$results = $dbo->fetchArray('SELECT `id_vista` FROM `zz_group_view` WHERE `id_vista` IN (SELECT `id` FROM `zz_views` WHERE `id_module`='.prepare($idmodulo).')');
285-
286-
foreach ($results as $result) {
287-
$dbo->attach('zz_group_view', ['id_vista' => $result['id_vista']], ['id_gruppo' => $id_record]);
288-
}
289-
}
290279
} else {
291280
$query = 'DELETE FROM zz_permissions WHERE idgruppo='.prepare($id_record).' AND idmodule='.prepare($idmodulo);
292281
}
293282

294283
$dbo->query($query);
295284

285+
// Sincronizza i permessi delle viste e dei segmenti
286+
$group = Group::find($id_record);
287+
$group->syncModulePermissions($idmodulo, $permessi);
288+
296289
ob_end_clean();
297290
echo 'ok';
298291

modules/viste/actions.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,30 @@
447447
$array['order'] = orderValue('zz_views', 'id_module', $id_record);
448448
$dbo->insert('zz_views', $array);
449449
$id = $dbo->lastInsertedID();
450+
451+
// Se è una nuova vista, aggiungi automaticamente tutti i gruppi che hanno accesso al modulo
452+
if (empty(post('gruppi')[$c])) {
453+
// Ottieni tutti i gruppi che hanno accesso al modulo (permessi 'r' o 'rw')
454+
$gruppi_con_accesso = $dbo->fetchArray('SELECT `idgruppo` FROM `zz_permissions` WHERE `idmodule` = '.prepare($id_record).' AND `permessi` IN (\'r\', \'rw\')');
455+
456+
// Assicurati che il gruppo Amministratori (ID 1) sia incluso
457+
$id_gruppo_admin = 1; // ID del gruppo Amministratori
458+
$gruppi_ids = array_column($gruppi_con_accesso, 'idgruppo');
459+
if (!in_array($id_gruppo_admin, $gruppi_ids)) {
460+
$gruppi_con_accesso[] = ['idgruppo' => $id_gruppo_admin];
461+
}
462+
463+
// Aggiungi i permessi per tutti i gruppi con accesso
464+
foreach ($gruppi_con_accesso as $gruppo) {
465+
$dbo->insert('zz_group_view', [
466+
'id_vista' => $id,
467+
'id_gruppo' => $gruppo['idgruppo'],
468+
]);
469+
}
470+
471+
// Aggiorna l'array dei gruppi per la sincronizzazione successiva
472+
$_POST['gruppi'][$c] = array_column($gruppi_con_accesso, 'idgruppo');
473+
}
450474
}
451475

452476
// Aggiornamento traduzione nome campo

modules/viste/css/main.css

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,18 @@
88
max-height: 500px;
99
}
1010

11+
/* Stile per la modalità formattata */
12+
.sql-formatted.formatted {
13+
max-height: none;
14+
overflow: visible;
15+
}
16+
17+
.sql-formatted.formatted * {
18+
white-space: pre-wrap !important;
19+
word-wrap: break-word !important;
20+
word-break: break-word !important;
21+
}
22+
1123
.sql-formatted .keyword {
1224
color: #0033b3;
1325
font-weight: bold;

0 commit comments

Comments
 (0)