MastodonStartpage/web/admin/instances.php
pezcurrel 352466bba8 ...
2020-04-16 22:56:12 +02:00

1118 lines
37 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
require('include/glob.php');
require('include/muoribene.php');
require('include/sessionstart.php');
require('include/myconn.php');
require('include/getadmacc.php');
if ($account['Level']=='guest')
muoribene('Sorry, you are not authorized.',true);
require('include/menu.php');
$menu['istanze']['href']=null;
$menu['istanze']['selected']=true;
$menu['istanze']['submenu']['elenco']['href']=null;
$menu['istanze']['submenu']['elenco']['selected']=true;
buildmenu($menu);
$dbg='';
$dbg.='$account: <pre>'.print_r($account,1).'</pre>'.N;
use function mysqli_real_escape_string as myesc;
// praticamente una macro
function hspech($str) {
return(htmlspecialchars($str,ENT_QUOTES|ENT_HTML5,'UTF-8'));
}
require('include/columns.php');
$types=array('bool','int','time','text','join','joini');
$fieldselopts='';
$ordfieldselopts='';
foreach ($cols as $key=>$arr) {
if (!array_key_exists('search',$arr) || $arr['search']==true) {
if ($arr['type']=='joini') {
$fieldselopts.='<option value="'.$key.':'.$arr['type'].':'.$arr['subtype'].'">'.$arr['name'].'</option>';
} else {
$fieldselopts.='<option value="'.$key.':'.$arr['type'].':null">'.$arr['name'].'</option>';
}
}
if (!array_key_exists('ord',$arr) || $arr['ord']==true) {
if (!array_key_exists('ordname',$arr))
$name=$arr['name'];
else
$name=$arr['ordname'];
if ($arr['type']=='joini') {
$ordfieldselopts.='<option value="'.$key.':'.$arr['type'].':'.$arr['subtype'].'">'.$name.'</option>';
} else {
$ordfieldselopts.='<option value="'.$key.':'.$arr['type'].':null">'.$name.'</option>';
}
}
}
$dbg.='$_POST: <pre>'.print_r($_POST,1).'</pre>';
$page=$account['Page'];
if (array_key_exists('filt',$_POST) && $_POST['filt']=='filt') {
$page=0;
$blocks=0;
foreach ($_POST as $key=>$val)
if (preg_match('/^openpar-\d+$/',$key)===1)
$blocks++;
$fi=0;
$oi=0;
$admpresques=array('DELETE FROM PresFiltCondsAdm WHERE AdmID='.$account['ID'],'DELETE FROM PresOrdCondsAdm WHERE AdmID='.$account['ID']);
foreach ($_POST as $key=>$val) {
if (preg_match('/^openpar-\d+$/',$key)===1) {
$fi++;
$admpresque='INSERT INTO PresFiltCondsAdm SET AdmID='.$account['ID'].', ';
if (preg_match('/^\(+$/',$val)===1)
$admpresque.='OpenPar=\''.myesc($link,$val).'\', ';
else
$admpresque.='OpenPar=NULL, ';
}
if (preg_match('/^fieldsel-\d+$/',$key)===1 && preg_match('/^(.+):(.+):(.+)$/',$val,$buf)===1) {
$tagk=$buf[1];
$type=$buf[2];
$subtype=$buf[3];
if (array_key_exists($tagk,$cols) && in_array($type,$types)) {
$admpresque.='Field=\''.myesc($link,$val).'\', ';
} else {
muoribene($dbg.'<br>Dati POST corrotti.<br>Puoi <a href="instances.php">riprovare resettando i parametri</a> o <a href="index.php">tornare al login</a>.',true);
}
}
if (preg_match('/^condsel-\d+$/',$key)===1) {
$admpresque.='Cond=\''.myesc($link,$val).'\', ';
}
if (preg_match('/^valuesel-\d+$/',$key)===1) {
$admpresque.='ValueSel=\''.myesc($link,$val).'\', ';
}
if (preg_match('/^valueinp-\d+$/',$key)===1) {
$admpresque.='ValueInp=\''.myesc($link,$val).'\', ';
}
if (preg_match('/^closepar-\d+$/',$key)===1) {
if (preg_match('/^\)+$/',$val)===1)
$admpresque.='ClosePar=\''.myesc($link,$val).'\', ';
else
$admpresque.='ClosePar=NULL, ';
}
if (preg_match('/^andor-\d+$/',$key)===1 && preg_match('/^AND|OR$/',$val)===1) {
if ($fi<$blocks)
$admpresque.='AndOr=\''.myesc($link,$val).'\', ';
else
$admpresque.='AndOr=NULL, ';
$admpresque.='Pos='.$fi;
$admpresques[]=$admpresque;
}
if (preg_match('/^ordfieldsel-\d+$/',$key)===1 && preg_match('/^(.+):(.+):(.+)$/',$val,$buf)===1) {
$oi++;
$tagk=$buf[1];
$type=$buf[2];
$subtype=$buf[3];
if (array_key_exists($tagk,$cols) && in_array($type,$types)) {
$admpresque='INSERT INTO PresOrdCondsAdm SET AdmID='.$account['ID'].', Field=\''.myesc($link,$val).'\', ';
} else {
muoribene($dbg.'<br>Dati POST corrotti.<br>Puoi <a href="instances.php">riprovare resettando i parametri</a> o <a href="index.php">tornare al login</a>.',true);
}
}
if (preg_match('/^ascdesc-\d+$/',$key)===1 && preg_match('/^ASC|DESC$/',$val)===1) {
$admpresque.='Sort=\''.myesc($link,$val).'\', Pos='.$oi;
$admpresques[]=$admpresque;
}
}
$dbg.='$admpresques: <pre>'.print_r($admpresques,1).'</pre>'.N;
foreach ($admpresques as $que)
mysqli_query($link,$que)
or muoribene(__LINE__.': '.$dbg.'<br>'.N.mysqli_error($link),true);
} elseif (array_key_exists('pageselect',$_POST) && preg_match('/^[0-9]+$/',$_POST['pageselect'])===1) {
$page=$_POST['pageselect']+0;
mysqli_query($link,'UPDATE Admins SET Page='.$page.' WHERE ID='.$account['ID'])
or muoribene(__LINE__.': '.$dbg.'<br>'.N.mysqli_error($link),true);
}
$fi=0;
$ji=0;
$oi=0;
$filtordon=false;
$jsaddrows='';
$jssetrows='';
$jsordaddrows='';
$jsordsetrows='';
$sels=array();
$joins=array();
$havings=array();
$where='';
$order='';
$res=mysqli_query($link,'SELECT * FROM PresFiltCondsAdm WHERE AdmID='.$account['ID'].' ORDER BY Pos ASC')
or muoribene(__LINE__.': '.mysqli_error($link));
$blocks=mysqli_num_rows($res);
if ($blocks>0) $filtordon=true;
while ($row=mysqli_fetch_assoc($res)) {
$fi++;
if (preg_match('/^\(+$/',$row['OpenPar'])===1) {
$where.=$row['OpenPar'];
$jssetrows.='setrow('.$fi.','.json_encode($row['OpenPar']);
} else {
$jssetrows.='setrow('.$fi.',"null"';
}
$jsaddrows.='addrow('.$fi.',false);'.N;
preg_match('/^(.+):(.+):(.+)$/',$row['Field'],$buf);
$tagk=$buf[1];
$type=$buf[2];
$subtype=$buf[3];
if (array_key_exists($tagk,$cols) && in_array($type,$types)) {
($tagk=='Instances.AdmCreatedAt') ? $inpisdate=true : $inpisdate=false;
if (strpos($cols[$tagk]['field'],'%')!==false)
$ji++;
$where.=str_replace('%',$ji,$cols[$tagk]['field']);
if ($type=='join' || $type=='joini') {
foreach ($cols[$tagk]['join'] as $join) {
$join=str_replace('%',$ji,$join);
if (!in_array($join,$joins))
$joins[]=$join;
}
}
if (array_key_exists('havings',$cols[$tagk]) && !in_array($cols[$tagk]['havings'],$havings))
$havings[]=$cols[$tagk]['havings'];
if (array_key_exists('selmore',$cols[$tagk]) && !in_array($cols[$tagk]['selmore'],$sels))
$sels[]=$cols[$tagk]['selmore'];
$jssetrows.=','.json_encode($row['Field']);
}
$where.=' '.$row['Cond'].' ';
$cond=$row['Cond'];
$jssetrows.=','.json_encode($row['Cond']);
// nel caso qui sotto, valuesel e valueinp sono entrambi disabilitati (non ci sono in $_POST), quindi li riempio di introvabile e nulla
if (preg_match('/^IS NULL|IS NOT NULL$/',$row['Cond'])===1)
$jssetrows.=',"NOMMITROVI!",""';
if (!is_null($row['ValueSel'])) {
$where.=$row['ValueSel'];
$jssetrows.=','.json_encode($row['ValueSel']);
$jssetrows.=',""';
}
if (!is_null($row['ValueInp'])) {
if ($inpisdate && preg_match('/^([0-9]{1,2}) ([0-9]{1,2}) ([0-9]{4,5})$/',$row['ValueInp'],$buf)===1) {
$where.=mktime(0,0,0,$buf[2]+0,$buf[1]+0,$buf[3]+0);
} elseif (preg_match('/^LIKE|NOT LIKE$/',$cond)===1) {
$where.='\'%'.myesc($link,$row['ValueInp']).'%\'';
} else {
$where.='\''.myesc($link,$row['ValueInp']).'\'';
}
$jssetrows.=',"NOMMITROVI!"';
$jssetrows.=','.json_encode($row['ValueInp']);
}
if (preg_match('/^\)+$/',$row['ClosePar'])===1) {
$where.=$row['ClosePar'];
$jssetrows.=','.json_encode($row['ClosePar']);
} else {
$jssetrows.=',"null"';
}
if (preg_match('/^AND|OR$/',$row['AndOr'])===1) {
if ($fi<$blocks)
$where.=' '.$row['AndOr'].' ';
$jssetrows.=','.json_encode($row['AndOr']).');'.N;
} else {
$jssetrows.=',"AND");'.N;
}
}
$res=mysqli_query($link,'SELECT * FROM PresOrdCondsAdm WHERE AdmID='.$account['ID'].' ORDER BY Pos ASC')
or muoribene(__LINE__.': '.mysqli_error($link));
if (mysqli_num_rows($res)>0) $filtordon=true;
while ($row=mysqli_fetch_assoc($res)) {
preg_match('/^(.+):(.+):(.+)$/',$row['Field'],$buf);
$oi++;
$tagk=$buf[1];
$type=$buf[2];
$subtype=$buf[3];
if (array_key_exists($tagk,$cols) && in_array($type,$types)) {
if ($type=='join' || $type=='joini') {
if (!array_key_exists('ordjoin',$cols[$tagk])) {
foreach ($cols[$tagk]['join'] as $join)
if (!in_array($join,$joins))
$joins[]=$join;
} else {
foreach ($cols[$tagk]['ordjoin'] as $join)
if (!in_array($join,$joins))
$joins[]=$join;
}
}
if (!array_key_exists('ordby',$cols[$tagk])) {
$order.=$cols[$tagk]['field'];
} else {
if (!in_array($cols[$tagk]['ordselmore'],$sels))
$sels[]=$cols[$tagk]['ordselmore'];
$order.=$cols[$tagk]['ordby'];
}
if (array_key_exists('havings',$cols[$tagk]) && !in_array($cols[$tagk]['havings'],$havings))
$havings[]=$cols[$tagk]['havings'];
if (array_key_exists('selmore',$cols[$tagk]) && !in_array($cols[$tagk]['selmore'],$sels))
$sels[]=$cols[$tagk]['selmore'];
$jsordaddrows.='ordaddrow('.$oi.',false);'.N;
$jsordsetrows.='ordsetrow('.$oi.','.json_encode($row['Field']);
} else {
muoribene($dbg.'<br>Dati db corrotti.<br>Puoi <a href="instances.php">riprovare resettando i parametri</a> o <a href="index.php">tornare al login</a>.',true);
}
$order.=' '.$row['Sort'].', ';
$jsordsetrows.=','.json_encode($row['Sort']).');'.N;
}
if ($jsaddrows!='') {
$jsaddrows.='document.getElementById("filbut").value="Rimuovi tutti i criteri di ricerca";'.N;
$jsaddrows.='synctai();'.N;
}
if ($jsordaddrows!='') {
$jsordaddrows.='document.getElementById("ordbut").value="Rimuovi tutti i criteri di ordinamento";'.N;
$jsordaddrows.='synctoi();'.N;
}
if (count($sels)>0)
$sels=', '.implode(', ',$sels);
else
$sels='';
if ($where!='')
$where='WHERE '.$where;
if ($order!='')
$order='ORDER BY '.substr($order,0,-2);
$dbg.='ORDER: '.$order.'<br>';
if (count($joins)>0)
$joins='LEFT JOIN '.implode(' LEFT JOIN ',$joins);
else
$joins='';
if (count($havings)>0)
$havings='HAVING '.implode(' AND ',$havings);
else
$havings='';
$query='SELECT *, Instances.ID AS IID '.$sels.' FROM Instances '.$joins.' '.$where.' GROUP BY IID '.$havings.' '.$order;
$dbg.='QUERONA: '.$query.'<br>'.N;
$tini=microtime(true);
$res=mysqli_query($link,$query)
or muoribene($dbg.'<br>'.$query.': '.mysqli_error($link).'<br>'.'La query è fallita. <a href="instances.php">Resetta</a>.',true);
$dbg.='Durata esecuzione query: '.round(microtime(true)-$tini,4).' sec.<br>'.N;
$cinsts=mysqli_num_rows($res);
$iperp=25;
if ($page*$iperp>$cinsts)
$page=0;
$finst=$page*$iperp;
if (mysqli_num_rows($res)<1) {
$pgout='';
$out='<p>Nessuna istanza da mostrare.</p>'.N;
} else {
// $pgout='Pag. '.($page+1).'/'.(ceil($cinsts/$iperp)-1);
$pgout='<form method="post" id="pform">'.N;
$pgout.='<select id="pageselect" name="pageselect" onchange="document.getElementById(\'pform\').submit()">'.N;
$totp=ceil($cinsts/$iperp);
for ($i=0; $i<$totp; $i++) {
$lastpi=$i*$iperp+$iperp;
if ($lastpi>$cinsts) $lastpi=$cinsts;
($i!=$page) ? $selected='' : $selected=' selected';
$pgout.='<option value="'.$i.'"'.$selected.'>Pagina '.($i+1).'/'.$totp.' (Istanze '.($i*$iperp+1).'-'.$lastpi.'/'.$cinsts.')</option>'.N;
}
$pgout.='</select>'.N;
$pgout.='</form>';
// ---
mysqli_data_seek($res,$finst);
$out='';
$i=$finst;
$ii=0;
require('include/dispinst.php');
while ($row=mysqli_fetch_assoc($res)) {
$i++;
$ii++;
if ($ii>$iperp) break;
$out.=dispinst($row,$cols,$link,$dlang,true,$i,$cinsts);
}
$out.='<div class="bigtabfoot"></div>'.N;
}
$presid=0;
if (array_key_exists('presets',$_POST) && preg_match('/^[0-9]+$/',$_POST['presets'])===1)
$presid=$_POST['presets'];
$presopts='<option value="null"></option>'.N;
$res=mysqli_query($link,'SELECT * FROM Presets ORDER BY LENGTH(Name) ASC, Name ASC')
or muoribene(mysqli_error($link),true);
while ($row=mysqli_fetch_assoc($res)) {
if ($row['ID']!=$presid)
$presopts.='<option value="'.$row['ID'].'">'.hspech($row['Name']).'</option>'.N;
else
$presopts.='<option value="'.$row['ID'].'" selected>'.hspech($row['Name']).'</option>'.N;
}
$chunksize=20; // questo deve essere settato paro-paro in notifsh.php
$i=0;
$notifs='<div id="notifc">'.N;
$notifs.='<div id="notifs" onscroll="morenotifs();">'.N;
$unreadnotifs=false;
$res=mysqli_query($link,'SELECT * FROM Notifications ORDER BY Microtime DESC')
or muoribene(mysqli_error($link),true);
while ($row=mysqli_fetch_assoc($res)) {
if ($row['Seen']==0) {
$unreadnotifs=true;
$notifclass='notifunseen';
} else {
$notifclass='notifseen';
}
$i++;
if ($i<=$chunksize) {
if ($i==1) $fntime=$row['Microtime'];
$notifs.='<div id="notif-'.$row['ID'].'" class="'.$notifclass.'" onclick="markread(this)">'.strftime('%d/%m/%y %T',$row['Microtime']).': '.$row['Notification'].'</div>'.N;
}
}
$notifs.='</div>'.N;
$notifs.='<div id="notifa"><a href="notifs.php">Vedi tutte le notifiche</a></div>'.N;
$notifs.='</div>'.N;
if ($unreadnotifs) {
$notifimgoff='imgs/bell_act_off.svg';
$notifimgon='imgs/bell_act_on.svg';
} else {
$notifimgoff='imgs/bell_off.svg';
$notifimgon='imgs/bell_on.svg';
}
mysqli_close($link);
if ($filtordon) {
$filtordimgoff='imgs/cerca_act_off.svg';
$filtordimgon='imgs/cerca_act_on.svg';
} else {
$filtordimgoff='imgs/cerca_off.svg';
$filtordimgon='imgs/cerca_on.svg';
}
?>
<!DOCTYPE HTML>
<html lang="it">
<head>
<title>Mastodon Startpage Admin - Elenco istanze</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="description" content="Admin pages for Mastodon Startpage">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<link rel="icon" type="image/png" href="imgs/icona-32.png" sizes="32x32">
<link rel="icon" type="image/png" href="imgs/icona-192.png" sizes="192x192">
<link rel="icon" type="image/png" href="imgs/icona-512.png" sizes="512x512">
<link rel="apple-touch-icon-precomposed" href="imgs/icona-180.png">
<script language="JavaScript" src="js/menu.js?v=<?php echo($cjrand); ?>"></script>
<script language="JavaScript" src="js/confirma.js?v=<?php echo($cjrand); ?>"></script>
<script language="JavaScript" src="js/alerta.js?v=<?php echo($cjrand); ?>"></script>
<link rel="stylesheet" type="text/css" href="theme.css?v=<?php echo($cjrand); ?>">
<script language="JavaScript">
<!--
function shideplancia() {
var plancia=document.getElementById('plancia');
var plctrl=document.getElementById('lente');
if (plancia.style.display=='block') {
plancia.style.display='none';
plctrl.src='<?php echo($filtordimgoff); ?>';
plctrl.title='Mostra il pannello di ricerca e ordinamento';
} else {
plancia.style.display='block';
plctrl.src='<?php echo($filtordimgon); ?>';
plctrl.title='Nascondi il pannello di ricerca e ordinamento';
}
}
notifimgon='<?php echo($notifimgon); ?>';
notifimgoff='<?php echo($notifimgoff); ?>';
function shidenotifs() {
var notifc=document.getElementById('notifc');
var ctrli=document.getElementById('bell');
if (notifc.style.display=='block') {
notifc.style.display='none';
ctrli.src=notifimgoff;
ctrli.title='Mostra le notifiche';
} else {
notifc.style.display='block';
ctrli.src=notifimgon;
ctrli.title='Nascondi le notifiche';
}
}
function markread(notif) {
let xhr=new XMLHttpRequest();
xhr.open('GET','notifsh.php?act=markread&id='+notif.id.replace(/^notif-([0-9]+)$/,'$1'));
xhr.responseType='json';
xhr.send();
xhr.onload=function() {
notif.className='notifseen';
let jarr=xhr.response;
if (jarr['hmunseen']==0) {
notifimgon='imgs/bell_on.svg';
notifimgoff='imgs/bell_off.svg';
bell.src=notifimgon;
}
};
xhr.onerror=function() {
alert('La richiesta è fallita.');
};
}
lmt=<?php echo($fntime); ?>;
chunk=0;
end=false;
loading=false;
function morenotifs() {
if (!loading && !end && notifs.scrollHeight-notifs.clientHeight-notifs.scrollTop<20) {
loading=true;
chunk++;
let xhr=new XMLHttpRequest();
xhr.open('GET','notifsh.php?act=loadchunk&chunk='+chunk);
xhr.responseType='json';
xhr.send();
xhr.onload=function() {
let jarr=xhr.response;
//console.log(jarr);
let i=0, html='';
for (i=0; i<jarr.length; i++)
html+=jarr[i];
notifs.innerHTML+=html;
if (jarr.length<<?php echo($chunksize); ?>)
end=true;
loading=false;
};
xhr.onerror=function() {
alert('La richiesta è fallita.');
};
}
}
loadingupd=false;
function updnotifs() {
if (!loadingupd) {
loadingupd=true;
let xhr=new XMLHttpRequest();
xhr.open('GET','notifsh.php?act=loadnew&lmt='+lmt);
xhr.responseType='json';
xhr.send();
xhr.onload=function() {
let jarr=xhr.response;
//console.log(jarr);
let i=0, html='';
for (i=0; i<jarr['buf'].length; i++)
html+=jarr['buf'][i];
notifs.innerHTML=html+notifs.innerHTML;
lmt=jarr['newlmt'];
if (jarr['newunread']) {
notifimgoff='imgs/bell_act_on.svg';
notifimgon='imgs/bell_act_off.svg';
(notifc.style.display=='block') ? bell.src=notifimgoff : bell.src=notifimgon;
}
loadingupd=false;
};
xhr.onerror=function() {
alert('La richiesta è fallita.');
};
} else {
console.log('Già sto caricando...');
}
}
updint=setInterval(updnotifs,3000);
function hent(str) {
return str.replace(/&/g,'&amp;').replace(/>/g,'&gt;').replace(/</g,'&lt;').replace(/"/g,'&quot;');
}
function truncsel(el) {
var sel=document.getElementById(el);
sel.length=0;
}
function inpdisif(index) {
console.log('inpdisif index: '+index);
var source=document.getElementById('condsel-'+index);
var inp=document.getElementById('valueinp-'+index);
var sel=document.getElementById('valuesel-'+index);
var conds=['IS NULL','IS NOT NULL'];
if (conds.includes(source.value)) {
inp.disabled=true;
sel.disabled=true;
} else {
if (inp.style.display!='none') inp.disabled=false;
if (sel.style.display!='none') sel.disabled=false;
}
}
function popusels(index,valselval) {
console.log('popusels index: '+index);
var key=document.getElementById('fieldsel-'+index).value;
var type=key.replace(/^.*:(.*):.*$/,'$1');
var subtype=key.replace(/^.*:.*:(.*)$/,'$1');
key=key.replace(/^(.*):.*:.*$/,'$1');
var condsel=document.getElementById('condsel-'+index);
var valsel=document.getElementById('valuesel-'+index);
var valinp=document.getElementById('valueinp-'+index);
condsel.setAttribute('onchange','inpdisif('+index+');');
if (type=='joini')
type=subtype;
if (type=='bool') {
truncsel('condsel-'+index);
condsel.add(new Option('è','IS'));
truncsel('valuesel-'+index);
valsel.add(new Option('vero','TRUE'));
valsel.add(new Option('falso','FALSE'));
valsel.add(new Option('definit@','NOT NULL'));
valsel.add(new Option('non definit@','NULL'));
if (valselval!==false)
selind('valuesel-'+index,valselval);
valinp.style.display='none';
valinp.disabled=true;
valsel.style.display='block';
valsel.disabled=false;
} else if (type=='text') {
truncsel('condsel-'+index);
condsel.add(new Option('contiene','LIKE'));
condsel.add(new Option('non contiene','NOT LIKE'));
condsel.add(new Option('è uguale a','='));
condsel.add(new Option('è divers@ da','!='));
condsel.add(new Option('è maggiore o uguale a','>='));
condsel.add(new Option('è minore o uguale a','<='));
condsel.add(new Option('è maggiore di','>'));
condsel.add(new Option('è minore di','<'));
condsel.add(new Option('è definit@','IS NOT NULL'));
condsel.add(new Option('non è definit@','IS NULL'));
valsel.style.display='none';
valsel.disabled=true;
valinp.style.display='block';
valinp.disabled=false;
} else if (type=='int' || type=='time') {
truncsel('condsel-'+index);
condsel.add(new Option('è maggiore o uguale a','>='));
condsel.add(new Option('è minore o uguale a','<='));
condsel.add(new Option('è maggiore di','>'));
condsel.add(new Option('è minore di','<'));
condsel.add(new Option('è uguale a','='));
condsel.add(new Option('è divers@ da','!='));
condsel.add(new Option('è definit@','IS NOT NULL'));
condsel.add(new Option('non è definit@','IS NULL'));
valsel.style.display='none';
valsel.disabled=true;
valinp.style.display='block';
valinp.disabled=false;
} else if (type=='join') {
truncsel('condsel-'+index);
condsel.add(new Option('è uguale a','='));
condsel.add(new Option('è divers@ da','!='));
condsel.add(new Option('è definit@','IS NOT NULL'));
condsel.add(new Option('non è definit@','IS NULL'));
valsel.style.display='block';
valsel.disabled=false;
valinp.style.display='none';
valinp.disabled=true;
truncsel('valuesel-'+index);
pupwait(true);
let xhr=new XMLHttpRequest();
xhr.open('GET','instancesh.php?key='+key);
xhr.responseType='json';
xhr.send();
xhr.onload=function() {
let jarr=xhr.response;
for (i=0; i<jarr.length; i++)
valsel.add(new Option(jarr[i][1],jarr[i][0]));
console.log('valsel pronto!');
if (valselval!==false)
selind('valuesel-'+index,valselval);
pupwait(false);
};
xhr.onerror=function() {
pupwait(false);
alert('La richiesta è fallita.');
};
} else {
alert('Attenziò: non so che farmene del tipo "'+type+'": diglielo, al programmatore.');
}
}
function addrow(index,refresh) {
var table=document.getElementById('planciafil');
if (table.rows.length<9) {
var newrow=table.insertRow(index);
var newcell0=newrow.insertCell(0);
var newcell1=newrow.insertCell(1);
var newcell2=newrow.insertCell(2);
var newcell3=newrow.insertCell(3);
var newcell4=newrow.insertCell(4);
var newcell5=newrow.insertCell(5);
var newcell6=newrow.insertCell(6);
var newcell7=newrow.insertCell(7);
newcell0.innerHTML='<select class="openpar"><option value="null"></option><option value="(">(</option><option value="((">((</option><option value="(((">(((</option></select>';
newcell1.innerHTML='<select class="fieldsel"><?php echo($fieldselopts); ?></select>';
newcell2.innerHTML='<select class="condsel"></select>';
newcell3.innerHTML='<select class="valuesel" style="display:none;"></select><input type="text" class="valueinp" maxlength="256" style="display:none;">';
newcell4.innerHTML='<select class="closepar"><option value="null"></option><option value=")">)</option><option value="))">))</option><option value=")))">)))</option></select>';
newcell5.innerHTML='<select class="andor"><option value="AND">E</option><option value="OR">O</option></select>';
newcell6.innerHTML='<img class="plus" src="imgs/plus.svg" title="Aggiungi un criterio sotto questo">';
newcell6.style.width='22px';
newcell7.innerHTML='<img class="minus" src="imgs/minus.svg" title="Rimuovi questo criterio">';
newcell7.style.width='22px';
if (refresh) {
synctai();
popusels(index,false);
}
} else {
alerta('<p>Non è possibile impostare più di 8 criteri di ricerca.</p>',false);
}
}
function ordaddrow(index,refresh) {
var table=document.getElementById('planciaord');
if (table.rows.length<7) {
var newrow=table.insertRow(index);
var newcell0=newrow.insertCell(0);
var newcell1=newrow.insertCell(1);
var newcell2=newrow.insertCell(2);
var newcell3=newrow.insertCell(3);
newcell0.style.width='97%';
newcell1.style.width='1%';
newcell2.style.width='1%';
newcell3.style.width='1%';
newcell0.innerHTML='<select class="ordfieldsel"><?php echo($ordfieldselopts); ?></select>';
newcell1.innerHTML='<select class="ascdesc"><option value="ASC">Crescente</option><option value="DESC">Decrescente</option></select>';
newcell2.innerHTML='<img class="plus" src="imgs/plus.svg" title="Aggiungi un criterio sotto questo">';
newcell3.innerHTML='<img class="minus" src="imgs/minus.svg" title="Rimuovi questo criterio">';
if (refresh)
synctoi();
} else {
alerta('<p>Non è possibile impostare più di 6 criteri di ordinamento.</p>',false);
}
}
function synctai() {
var i=0;
var table=document.getElementById('planciafil');
var nodes=table.querySelectorAll('.minus');
var cnodes=nodes.length;
for (i=0; i<cnodes; i++)
// +1 sempre per via della row iniziale
nodes[i].setAttribute('onclick','remrow('+(i+1)+');');
nodes=table.querySelectorAll('.plus');
for (i=0; i<cnodes; i++)
// +2 perché la devi aggiungere dopo la corrente
nodes[i].setAttribute('onclick','addrow('+(i+2)+',true);');
// da qui in poi faccio a scendere per non avere mai id e nomi duplicati
cnodes--;
nodes=table.querySelectorAll('.openpar');
for (i=cnodes; i>-1; i--) {
nodes[i].setAttribute('id','openpar-'+(i+1));
nodes[i].setAttribute('name','openpar-'+(i+1));
}
nodes=table.querySelectorAll('.fieldsel');
for (i=cnodes; i>-1; i--) {
nodes[i].setAttribute('id','fieldsel-'+(i+1));
nodes[i].setAttribute('name','fieldsel-'+(i+1));
nodes[i].setAttribute('onchange','popusels('+(i+1)+',false);');
}
nodes=table.querySelectorAll('.condsel');
for (i=cnodes; i>-1; i--) {
nodes[i].setAttribute('id','condsel-'+(i+1));
nodes[i].setAttribute('name','condsel-'+(i+1));
nodes[i].setAttribute('onchange','inpdisif('+(i+1)+');');
}
nodes=table.querySelectorAll('.valuesel');
for (i=cnodes; i>-1; i--) {
nodes[i].setAttribute('id','valuesel-'+(i+1));
nodes[i].setAttribute('name','valuesel-'+(i+1));
}
nodes=table.querySelectorAll('.valueinp');
for (i=cnodes; i>-1; i--) {
nodes[i].setAttribute('id','valueinp-'+(i+1));
nodes[i].setAttribute('name','valueinp-'+(i+1));
}
nodes=table.querySelectorAll('.closepar');
for (i=cnodes; i>-1; i--) {
nodes[i].setAttribute('id','closepar-'+(i+1));
nodes[i].setAttribute('name','closepar-'+(i+1));
}
nodes=table.querySelectorAll('.andor');
for (i=cnodes; i>-1; i--) {
nodes[i].setAttribute('id','andor-'+(i+1));
nodes[i].setAttribute('name','andor-'+(i+1));
nodes[i].disabled=false;
}
if (cnodes>=0)
nodes[cnodes].disabled=true;
}
function synctoi() {
var i=0;
var table=document.getElementById('planciaord');
var nodes=table.querySelectorAll('.minus');
var cnodes=nodes.length;
for (i=0; i<cnodes; i++)
// +1 sempre per via della row iniziale
nodes[i].setAttribute('onclick','ordremrow('+(i+1)+');');
nodes=table.querySelectorAll('.plus');
for (i=0; i<cnodes; i++)
// +2 perché la devi aggiungere dopo la corrente
nodes[i].setAttribute('onclick','ordaddrow('+(i+2)+',true);');
// da qui in poi faccio a scendere per non avere mai id e nomi duplicati
cnodes--;
nodes=table.querySelectorAll('.ordfieldsel');
for (i=cnodes; i>-1; i--) {
nodes[i].setAttribute('id','ordfieldsel-'+(i+1));
nodes[i].setAttribute('name','ordfieldsel-'+(i+1));
}
nodes=table.querySelectorAll('.ascdesc');
for (i=cnodes; i>-1; i--) {
nodes[i].setAttribute('id','ascdesc-'+(i+1));
nodes[i].setAttribute('name','ascdesc-'+(i+1));
}
}
function selind(id,val) {
var el=document.getElementById(id), i=0, found=false;
while (!found && i<el.length) {
if (el[i].value==val) {
el.selectedIndex=i;
found=true;
}
i++;
}
if (!found)
console.log('"'+val+'" non è stato trovato in "'+id+'"');
}
function setrow(index,openparv,fieldselv,condselv,valueselv,valueinpv,closeparv,andorv) {
selind('openpar-'+index,openparv);
selind('fieldsel-'+index,fieldselv);
popusels(index,valueselv);
selind('condsel-'+index,condselv);
// selind('valuesel-'+index,valueselv);
document.getElementById('valueinp-'+index).value=valueinpv;
if (condselv=='IS NULL' || condselv=='IS NOT NULL') {
document.getElementById('valueinp-'+index).disabled=true;
document.getElementById('valuesel-'+index).disabled=true;
}
selind('closepar-'+index,closeparv);
selind('andor-'+index,andorv);
}
function ordsetrow(index,ordfieldselv,ascdescv) {
selind('ordfieldsel-'+index,ordfieldselv);
selind('ascdesc-'+index,ascdescv);
}
function remrow(index) {
var table=document.getElementById('planciafil');
table.deleteRow(index);
synctai();
if (table.rows.length<2)
document.getElementById('filbut').value='Aggiungi criteri di ricerca';
}
function ordremrow(index) {
var table=document.getElementById('planciaord');
table.deleteRow(index);
synctoi();
if (table.rows.length<2)
document.getElementById('ordbut').value='Aggiungi criteri di ordinamento';
}
function truncfil() {
var table=document.getElementById('planciafil');
while (table.rows.length>1)
remrow(1);
}
function truncord() {
var table=document.getElementById('planciaord');
while (table.rows.length>1)
ordremrow(1);
}
function manfil() {
var filbut=document.getElementById('filbut');
var table=document.getElementById('planciafil');
var crows=table.rows.length;
if (crows<2) {
addrow(1,true);
filbut.value='Rimuovi tutti i criteri di ricerca';
} else {
confirma('<p>Confermi di voler rimuovere tutti i criteri di ricerca?</p>','truncfil();filbut.value=\'Aggiungi criteri di ricerca\'');
}
}
function manord() {
var ordbut=document.getElementById('ordbut');
var table=document.getElementById('planciaord');
var crows=table.rows.length;
if (crows<2) {
ordaddrow(1,true);
ordbut.value='Rimuovi tutti i criteri di ordinamento';
} else {
confirma('<p>Confermi di voler rimuovere tutti i criteri di ordinamento?</p>','truncord();ordbut.value=\'Aggiungi criteri di ordinamento\'');
}
}
function ckpar() {
var i=0;
var table=document.getElementById('planciafil');
var nodes=table.querySelectorAll('.openpar');
var cnodes=nodes.length;
var opars=[];
var cpars=[];
for (i=0; i<cnodes; i++)
opars.push(nodes[i].value);
nodes=table.querySelectorAll('.closepar');
for (i=0; i<cnodes; i++)
cpars.push(nodes[i].value);
var spars='';
for (i=0; i<cnodes; i++) {
if (opars[i]!='null') spars+=opars[i];
if (cpars[i]!='null') spars+=cpars[i];
}
var opq=0, cpq=0, ok=true;
for (i=0; i<spars.length; i++) {
if (spars[i]=='(') {
opq++;
} else if (spars[i]==')') {
cpq++;
}
if (cpq>opq)
break;
}
if (opq!=cpq)
ok=false;
console.log(i+'/'+spars.length+': '+ok);
return ok;
}
function ckf() {
var emsg='';
if (!ckpar()) emsg+='Qualcosa non va con le parentesi!<br>\n';
// emsg+='Comunque NO!<br>\n';
if (emsg=='') {
var table=document.getElementById('planciafil');
var crows=table.rows.length;
if (crows>1)
document.getElementById('andor-'+(crows-1)).disabled=false;
document.getElementById('f').submit();
} else {
alerta('<p>'+emsg+'</p>',false);
return false;
}
}
function pupwait(on) {
var pup=document.getElementById('popup'), inpup=document.getElementById('inpopup');
if (on) {
if (pup.style.display!='table') {
inpup.innerHTML='<div class="waitbub"><img src="imgs/loading.gif"><br>&nbsp;<br>Caricamento in corso...</div>';
pup.style.display='table';
} else {
console.log('Sto già aspettando...');
}
} else {
inpup.innerHTML='<div id="popupcont">...</div>';
pup.style.display='none';
}
}
//function setrow(index,openparv,fieldselv,condselv,valueselv,valueinpv,closeparv,andorv)
function loadpres() {
let pres=document.getElementById('presets');
if (pres.value!='null') {
pupwait(true);
let formdata=new FormData();
formdata.append('act','load');
formdata.append('pid',pres.value);
let xhr=new XMLHttpRequest();
xhr.open('POST','loadsaverempres.php');
xhr.responseType='json';
xhr.send(formdata);
xhr.onload=function() {
let jarr=xhr.response;
truncfil();
for (i=0; i<jarr['f'].length; i++) {
console.log(jarr['f'][i]);
addrow(i+1,false);
}
synctai();
for (i=0; i<jarr['f'].length; i++) {
setrow(i+1, jarr['f'][i]['OpenPar'], jarr['f'][i]['Field'], jarr['f'][i]['Cond'], jarr['f'][i]['ValueSel'], jarr['f'][i]['ValueInp'], jarr['f'][i]['ClosePar'], jarr['f'][i]['AndOr']);
}
if (jarr['f'].length>0)
document.getElementById('filbut').value='Rimuovi tutti i criteri di ricerca';
truncord();
for (i=0; i<jarr['o'].length; i++) {
console.log(jarr['o'][i]);
ordaddrow(i+1,false);
}
synctoi();
for (i=0; i<jarr['o'].length; i++) {
ordsetrow(i+1, jarr['o'][i]['Field'], jarr['o'][i]['Sort']);
}
if (jarr['o'].length>0)
document.getElementById('ordbut').value='Rimuovi tutti i criteri di ordinamento';
pupwait(false);
};
xhr.onerror=function() {
pupwait(false);
alert('La richiesta è fallita.');
};
} else {
alerta('<p>Non hai selezionato alcun preset ;)</p>',false);
}
}
function rempres() {
pupwait(true);
let pres=document.getElementById('presets');
let formdata=new FormData(document.forms.f);
formdata.append('act','remove');
formdata.append('pid',pres.value);
let xhr=new XMLHttpRequest();
xhr.open('POST','loadsaverempres.php');
xhr.responseType='json';
xhr.send(formdata);
xhr.onload=function() {
console.log(xhr.response);
pres.remove(pres.selectedIndex);
pres.selectedIndex=0;
pupwait(false);
};
xhr.onerror=function() {
pupwait(false);
alert('La richiesta è fallita.');
};
}
function savepres(txt,asnew) {
pupwait(true);
let pres=document.getElementById('presets');
let formdata=new FormData(document.forms.f);
formdata.append('act','save');
formdata.append('txt',txt);
if (!asnew)
formdata.append('pid',pres.value);
let xhr=new XMLHttpRequest();
xhr.open('POST','loadsaverempres.php');
xhr.responseType='json';
xhr.send(formdata);
xhr.onload=function() {
console.log(xhr.response);
if (!asnew) {
pres.options[pres.selectedIndex].text=txt;
} else {
let jarr=xhr.response;
pres.add(new Option(txt,jarr['pid']));
pres.selectedIndex=pres.options.length-1;
}
pupwait(false);
};
xhr.onerror=function() {
pupwait(false);
alert('La richiesta è fallita.');
};
}
function pupsavepres(asnew) {
var pres=document.getElementById('presets');
if (pres.value!='null' || asnew) {
var pup=document.getElementById('popup'), inpup=document.getElementById('inpopup');
var prestext=pres.options[pres.selectedIndex].text;
var pre='<p>Se vuoi puoi modificare il nome del preset che stai per sovrascrivere</p>';
if (asnew) pre='<p>Dai un nuovo nome al nuovo preset che stai per salvare</p>';
inpup.innerHTML='<div class="loadsavepresbub">'+pre+'<input type="text" maxlength="256" value="'+hent(prestext)+'" id="presname"><input type="button" value="Salva" onClick="ckpresname('+asnew+');"><input type="button" value="Annulla" onClick="pupoff();"><div id="ckmsg"></div></div>';
pup.style.display='table';
} else {
alerta('<p>Non hai selezionato alcun preset ;)</p>',false);
}
}
function puprempres() {
var pres=document.getElementById('presets');
if (pres.value!='null') {
var prestext=pres.options[pres.selectedIndex].text;
confirma('<p>Confermi leliminazione del preset «'+hent(prestext)+'»?</p>','rempres()');
} else {
alerta('<p>Non hai selezionato alcun preset ;)</p>',false);
}
}
function ckpresname(asnew) {
var pres=document.getElementById('presets');
var presname=document.getElementById('presname').value;
var ckmsg=document.getElementById('ckmsg');
var ok=true;
var i;
if (presname.trim=='') {
presname='';
ok=false;
ckmsg.innerHTML='Non puoi salvare un preset senza nome';
}
if (!asnew) {
for (i=0; i<pres.options.length; i++) {
if (i!=pres.selectedIndex && presname==pres.options[i].text) {
ok=false;
ckmsg.innerHTML='<p>Esiste già un altro preset con questo nome</p>';
break;
}
}
} else {
for (i=0; i<pres.options.length; i++) {
if (presname==pres.options[i].text) {
ok=false;
ckmsg.innerHTML='<p>Esiste già un preset con questo nome</p>';
break;
}
}
}
if (ok) {
pupoff();
savepres(presname,asnew);
}
}
function pupoff() {
var pup=document.getElementById('popup'), inpup=document.getElementById('inpopup');
inpup.innerHTML='<div id="popupcont">...</div>';
pup.style.display='none';
}
//-->
</script>
</head>
<body>
<nav>
<div id="hmenu">
<ul>
<?php echo($menuout); ?>
</ul>
<div class="mtit">Elenco istanze</div>
<div id="rightdiv">
<img src="<?php echo($filtordimgoff); ?>" id="lente" class="rlinks" title="Mostra il pannello di ricerca e ordinamento" onclick="shideplancia();">
<img src="<?php echo($notifimgoff); ?>" id="bell" class="rlinks" title="Show notifications" onclick="shidenotifs();">
<img src="imgs/esci.svg" class="rlinks" title="Esci" onclick="document.location.href='logout.php';">
</div>
</div>
</nav>
<?php echo($notifs); ?>
<div id="popup">
<div id="inpopup">
<div id="popupcont">
...
</div>
</div>
</div>
<div id="footer">
<?php echo($pgout); ?>
</div>
<div id="debug">
<?php echo($dbg); ?>
</div>
<div id="plancia">
<form method="post" id="f" onsubmit="return ckf();">
<table id="planciafil" class="planciatab">
<tr><td colspan="8"><input type="button" id="filbut" value="Aggiungi criteri di ricerca" class="ctrlbut" onclick="manfil();"></td></tr>
</table>
<table id="planciaord" class="planciatab">
<tr><td colspan="4"><input type="button" id="ordbut" value="Aggiungi criteri di ordinamento" class="ctrlbut" onclick="manord();"></td></tr>
</table>
<table id="planciaothers" class="planciatab">
<tr><td><input type="button" id="subbut" value="Applica" class="ctrlbut" onclick="ckf();"></td></tr>
</table>
<table class="planciatab"><tr><td style="width:1%">Preset: </td><td style="width:95%"><select name="presets" id="presets" class="presets"><?php echo($presopts); ?></select></td><td style="width:1%"><img src="imgs/fresu.svg" class="lilbut" onclick="loadpres();" title="Carica i criteri dal preset selezionato"></td><td style="width:1%"><img src="imgs/fregiu.svg" class="lilbut" onclick="pupsavepres(false);" title="Salva i criteri impostati nel preset selezionato sovrascrivendolo (permette inoltre di rinominarlo) ..."></td><td style="width:1%"><img src="imgs/fregiuplus.svg" class="lilbut" onclick="pupsavepres(true);" title="Salva i criteri impostati come nuovo preset ..."></td><td style="width:1%"><img src="imgs/minus.svg" class="lilbut" onclick="puprempres();" title="Elimina il preset selezionato"></td></tr></table>
<input type="hidden" name="filt" id="filt" value="filt">
</form>
</div>
<script language="JavaScript">
<!--
<?php
echo($jsaddrows);
echo($jssetrows);
echo($jsordaddrows);
echo($jsordsetrows);
?>
//-->
</script>
<div id="fullscreen">
<div id="middlerow">
<?php echo($out); ?>
</div>
</div>
</body>
</html>