Compare commits

...
Author SHA1 Message Date
ma0048 0bc1a6b9d3 ku pruefungen
- min/max teilnehmer editierbar
- stornierte pruefungen vom kollisionscheck ausgeschlossen
- delete von GET auf POST umgestellt
- lektor kann studierende auch bei bestehender kollision zuweisen
2026-01-29 11:24:49 +01:00
Harald Bamberger f1aa5382cf check editZgv Permission for Stg and also check it in api function 2026-01-28 17:04:11 +01:00
Harald Bamberger 7fe36d59e3 apply edit Zgv permissions only to ZGV dropdowns 2026-01-28 11:32:03 +01:00
Harald Bamberger 3e46e94736 quick fix to prevent pruefunglist from being empty due to js error in combination with tabulator sort persistence 2026-01-27 11:07:46 +01:00
Harald Bamberger f867e60702 fix use of config FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE to override studiengang_kz in public.tbl_konto 2026-01-21 17:37:23 +01:00
13 changed files with 194 additions and 82 deletions
@@ -32,9 +32,9 @@ class Studentenverwaltung extends Auth_Controller
'student/keine_studstatuspruefung' => $this->permissionlib->isBerechtigt('student/keine_studstatuspruefung'),
'lehre/reihungstestAufsicht' => $this->permissionlib->isBerechtigt('lehre/reihungstestAufsicht'),
'system/change_outputformat' => $this->permissionlib->getOE_isEntitledFor('system/change_outputformat'),
'student/editBakkZgv' => $this->permissionlib->isBerechtigt('student/editBakkZgv'),
'student/editMakkZgv' => $this->permissionlib->isBerechtigt('student/editMakkZgv'),
'student/editDokZgv' => $this->permissionlib->isBerechtigt('student/editDokZgv'),
'student/editBakkZgv' => $this->permissionlib->getSTG_isEntitledFor('student/editBakkZgv') ?: array(),
'student/editMakkZgv' => $this->permissionlib->getSTG_isEntitledFor('student/editMakkZgv') ?: array(),
'student/editDokZgv' => $this->permissionlib->getSTG_isEntitledFor('student/editDokZgv') ?: array(),
'student/editBismelden' => $this->permissionlib->isBerechtigt('student/editBismelden')
],
'variables' => [
@@ -239,7 +239,7 @@ class Konto extends FHCAPI_Controller
$data[$field] = $this->input->post($field);
if (defined('FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE') && isset(unserialize(FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE)[$data['buchungstyp_kurzbz']])) {
$data['kostenstelle'] = unserialize(FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE)[$data['buchungstyp_kurzbz']];
$data['studiengang_kz'] = unserialize(FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE)[$data['buchungstyp_kurzbz']];
}
$result = [];
@@ -43,7 +43,7 @@ class Prestudent extends FHCAPI_Controller
// Load language phrases
$this->loadPhrases([
'ui', 'studierendenantrag', 'lehre'
'ui', 'studierendenantrag', 'lehre', 'global'
]);
}
@@ -98,11 +98,9 @@ class Prestudent extends FHCAPI_Controller
'person_id',
'berufstaetigkeit_code',
'ausbildungcode',
'zgv_code',
'zgvort',
'zgvdatum',
'zgvnation',
'zgvmas_code',
'zgvmaort',
'zgvmadatum',
'zgvmanation',
@@ -110,7 +108,6 @@ class Prestudent extends FHCAPI_Controller
'bismelden',
'anmerkung',
'dual',
'zgvdoktor_code',
'zgvdoktorort',
'zgvdoktordatum',
'zgvdoktornation',
@@ -125,6 +122,57 @@ class Prestudent extends FHCAPI_Controller
'standort_code'
];
// add zgv code fields only if user has permission
$this->load->library('PermissionLib');
$prestudentres = $this->PrestudentModel->load($prestudent_id);
if(!hasData($prestudentres))
{
$this->terminateWithError($this->p->t('ui', 'error_fieldNotFound', ['field' => 'Prestudent ' . $prestudent_id]));
}
$prestudent = (getData($prestudentres))[0];
$bakkZgvStg = $this->permissionlib->getSTG_isEntitledFor('student/editBakkZgv') ?: array();
$makkZgvStg = $this->permissionlib->getSTG_isEntitledFor('student/editMakkZgv') ?: array();
$dokZgvStg = $this->permissionlib->getSTG_isEntitledFor('student/editDokZgv') ?: array();
if(in_array($prestudent->studiengang_kz, $bakkZgvStg))
{
$array_allowed_props_prestudent[] = 'zgv_code';
}
else if(!is_null($this->input->post('zgv_code')))
{
$this->terminateWithError(
$this->p->t('global', 'zgv')
. ' - ' .
$this->p->t('ui', 'error_keineBerechtigungStg')
);
}
if(in_array($prestudent->studiengang_kz, $makkZgvStg))
{
$array_allowed_props_prestudent[] = 'zgvmas_code';
}
else if(!is_null($this->input->post('zgvmas_code')))
{
$this->terminateWithError(
$this->p->t('lehre', 'zgvMaster')
. ' - ' .
$this->p->t('ui', 'error_keineBerechtigungStg')
);
}
if(in_array($prestudent->studiengang_kz, $dokZgvStg))
{
$array_allowed_props_prestudent[] = 'zgvdoktor_code';
}
else if(!is_null($this->input->post('zgvdoktor_code')))
{
$this->terminateWithError(
$this->p->t('lehre', 'zgvDoktor')
. ' - ' .
$this->p->t('ui', 'error_keineBerechtigungStg')
);
}
// add UDFs
$result = $this->udflib->getDefinitionForModel($this->PrestudentModel);
+13 -2
View File
@@ -565,7 +565,7 @@ function openDialog(lehrveranstaltung_id, termin_id, lvBezeichnung, terminVon, t
* @param {type} termin_id ID des Prüfungstermines
* @returns {undefined}
*/
function saveAnmeldung(lehrveranstaltung_id, termin_id)
function saveAnmeldung(lehrveranstaltung_id, termin_id, force = false)
{
var uid = $("#anmeldung_hinzufuegen_uid").val();
if(lehrveranstaltung_id === undefined)
@@ -602,10 +602,21 @@ function saveAnmeldung(lehrveranstaltung_id, termin_id)
uid: uid,
studienverpflichtung_id: studienverpflichtung_id,
studiengang_kz: studiengang_kz,
ects: ects
ects: ects,
force: force
},
error: loadError,
success: function(data){
if (data?.confirm === 'true')
{
if (confirm(data.errormsg))
{
saveAnmeldung(lehrveranstaltung_id, termin_id, true);
}
return;
}
if(data.error === 'false')
{
messageBox("message", data.result, "green", "highlight", 10000);
@@ -394,7 +394,7 @@ function loadTermine()
*/
function saveAnmeldung($aktStudiensemester = null, $uid = null)
{
global $p;
global $p, $rechte;
$termin = new pruefungstermin($_REQUEST["termin_id"]);
$pruefung = new pruefung();
$lehrveranstaltung = new lehrveranstaltung($_REQUEST["lehrveranstaltung_id"]);
@@ -404,6 +404,7 @@ function saveAnmeldung($aktStudiensemester = null, $uid = null)
$studienverpflichtung_id = filter_input(INPUT_POST, "studienverpflichtung_id");
$studiengang_kz = filter_input(INPUT_POST, "studiengang_kz");
$ects = filter_input(INPUT_POST, "ects");
$force = filter_input(INPUT_POST, "force", FILTER_VALIDATE_BOOLEAN);
//Defaulteinstellung für Anzahlprüfungsversuche (wird durch Addon "ktu" überschrieben)
$maxAnzahlVersuche = 0;
@@ -557,11 +558,28 @@ function saveAnmeldung($aktStudiensemester = null, $uid = null)
$ects_verwendet += $lehrveranstaltung->ects;
$datum = new datum();
if(($datum->between($termin->von, $termin->bis, $temp->von)) || ($datum->between($termin->von, $termin->bis, $temp->bis)))
$kollision = ($datum->between($termin->von, $termin->bis, $temp->von)) || ($datum->between($termin->von, $termin->bis, $temp->bis));
if ($kollision)
{
$data['result'][$temp->pruefungstermin_id] = "true";
$data['error'] = 'true';
$data['errormsg'] = $p->t('pruefung/kollisionMitAndererAnmeldung');
$is_berechtigt = $rechte->isBerechtigt('lehre/pruefungsanmeldungAdmin');
if ($is_berechtigt)
{
if (!$force)
{
$data['result'][$temp->pruefungstermin_id] = "true";
$data['error'] = 'true';
$data['confirm'] = 'true';
$data['errormsg'] = $p->t('pruefung/kollisionMitAndererAnmeldungForce');
}
}
else
{
$data['result'][$temp->pruefungstermin_id] = "true";
$data['error'] = 'true';
$data['errormsg'] = $p->t('pruefung/kollisionMitAndererAnmeldung');
}
}
}
@@ -202,9 +202,9 @@ else if(isset($_GET["id"]) && $_GET["id"]!= null && isset($_GET["method"]) && $_
}
$method = $_GET["method"];
}
else if(isset($_GET["id"]) && $_GET["id"]!= null && isset($_GET["method"]) && $_GET["method"]=="delete")
else if(isset($_POST["delete"]))
{
$pruefungsfenster_id = $_GET["id"];
$pruefungsfenster_id = $_POST["delete"];
$pruefungsfenster = new pruefungsfenster();
$pruefungsfenster->load($pruefungsfenster_id);
@@ -226,7 +226,7 @@ else if(isset($_GET["id"]) && $_GET["id"]!= null && isset($_GET["method"]) && $_
{
echo $p->t('pruefung/pruefungsfensterKonnteNichtGeloeschtWerdenDaPruefungen');
}
$method = $_GET["method"];
$method = 'delete';
}
else
{
@@ -394,39 +394,41 @@ else
if(!empty($prfFenster->result)){
?>
<table class="tablesorter" id="prfTable">
<thead>
<tr>
<th><?php echo $p->t('global/studiensemester'); ?></th>
<th><?php echo $p->t('global/organisationseinheit'); ?></th>
<th><?php echo $p->t('pruefung/start'); ?></th>
<th><?php echo $p->t('pruefung/ende'); ?></th>
<th><?php echo $p->t('global/bearbeiten'); ?></th>
<th><?php echo $p->t('global/loeschen'); ?></th>
</tr>
</thead>
<tbody>
<?php
$organisationseinheit = new organisationseinheit();
foreach ($prfFenster->result as $result)
{
if(in_array($result->oe_kurzbz, $oe))
<form method="POST" action="pruefungsfenster_anlegen.php">
<table class="tablesorter" id="prfTable">
<thead>
<tr>
<th><?php echo $p->t('global/studiensemester'); ?></th>
<th><?php echo $p->t('global/organisationseinheit'); ?></th>
<th><?php echo $p->t('pruefung/start'); ?></th>
<th><?php echo $p->t('pruefung/ende'); ?></th>
<th><?php echo $p->t('global/bearbeiten'); ?></th>
<th><?php echo $p->t('global/loeschen'); ?></th>
</tr>
</thead>
<tbody>
<?php
$organisationseinheit = new organisationseinheit();
foreach ($prfFenster->result as $result)
{
$organisationseinheit->load($result->oe_kurzbz);
echo
'<tr>
<td>'.$result->studiensemester_kurzbz.'</td>
<td>'.$organisationseinheit->organisationseinheittyp_kurzbz." ".$organisationseinheit->bezeichnung.'</td>
<td>'.$result->start.'</td>
<td>'.$result->ende.'</td>
<td><a href="pruefungsfenster_anlegen.php?method=update&id='.$result->pruefungsfenster_id.'">'.$p->t('global/bearbeiten').'</a></td>
<td><a href="pruefungsfenster_anlegen.php?method=delete&id='.$result->pruefungsfenster_id.'">'. $p->t('global/loeschen').'</a></td>
</tr>';
if(in_array($result->oe_kurzbz, $oe))
{
$organisationseinheit->load($result->oe_kurzbz);
echo
'<tr>
<td>'.$result->studiensemester_kurzbz.'</td>
<td>'.$organisationseinheit->organisationseinheittyp_kurzbz." ".$organisationseinheit->bezeichnung.'</td>
<td>'.$result->start.'</td>
<td>'.$result->ende.'</td>
<td><a href="pruefungsfenster_anlegen.php?method=update&id='.$result->pruefungsfenster_id.'">'.$p->t('global/bearbeiten').'</a></td>
<td><button type="submit" name="delete" value="'. $result->pruefungsfenster_id .'">'. $p->t('global/loeschen') .'</button></td>
</tr>';
}
}
}
?>
</tbody>
</table>
?>
</tbody>
</table>
</form>
<?php
}
else
@@ -654,7 +654,7 @@ function checkCollision($uid, $beginn, $ende)
{
$collision = false;
$pruefung = new pruefungCis();
$pruefung->getAllPruefungen($uid);
$pruefung->getAllPruefungen($uid, false);
$datum = new datum();
foreach($pruefung->result as $prf)
{
@@ -56,18 +56,24 @@ $lehrveranstaltung->loadLVAfromMitarbeiter(0, $uid, $studiensemester->getaktorNe
if(empty($lehrveranstaltung->lehrveranstaltungen) && !$rechte->isBerechtigt('lehre/pruefungsterminAdmin'))
die('Sie haben keine Berechtigung für diese Seite');
if (!ctype_digit($_GET['termin_id']))
die('Wrong Parameter');
else
$termin_id = $_GET['termin_id'];
if (isset($_GET["speichern"]))
if (isset($_GET['termin_id']))
{
if (!ctype_digit($_GET['termin_id']))
die('Wrong Parameter');
$termin_id = $_GET['termin_id'];
}
else if (isset($_POST["speichern"]))
{
$termin_id = $_POST['termin_id'];
$prfgtermin = new pruefungstermin($termin_id);
$von = $_GET["datum"]." ".$_GET["vonzeit"];
$bis = $_GET["datum"]." ".$_GET["biszeit"];
$von = $_POST["datum"]." ".$_POST["vonzeit"];
$bis = $_POST["datum"]." ".$_POST["biszeit"];
$prfgtermin->von = $von;
$prfgtermin->bis = $bis;
$prfgtermin->teilnehmer_min = $_POST["terminmin"];
$prfgtermin->teilnehmer_max = $_POST["terminmax"];
$prfgtermin->save();
}
@@ -110,6 +116,8 @@ $datum = explode(" ", $prfgtermin->von)[0];
$vonzeit = substr(explode(" ", $prfgtermin->von)[1],0,5);
$biszeit = substr(explode(" ", $prfgtermin->bis)[1],0,5);
$pruefung_id = $prfgtermin->pruefung_id;
$teilnehmer_min = $prfgtermin->teilnehmer_min;
$teilnehmer_max = $prfgtermin->teilnehmer_max;
$pruefung = new pruefungCis($pruefung_id);
$pruefung->getLehrveranstaltungenByPruefung();
@@ -178,7 +186,7 @@ foreach ($anmeldungen as $row)
</head>
<body style="padding-top:20px">
<center>
<form name="change_termin" action="./pruefungstermin_aendern.php" method="GET">
<form name="change_termin" action="./pruefungstermin_aendern.php" method="POST">
<table>
<tr>
<td><?php echo $p->t('global/lehrveranstaltung'); ?></td>
@@ -196,6 +204,15 @@ foreach ($anmeldungen as $row)
<td><?php echo $p->t('global/bis'); ?></td>
<td><input type="text" name="biszeit" value="<?php echo $biszeit ?>" maxlength="5"></td>
</tr>
<tr>
<td><?php echo $p->t('pruefung/pruefungMinTeilnehmer'); ?></td>
<td>
<input type="number" name="terminmin" placeholder="0" min="0" value="<?php echo $teilnehmer_min; ?>"></td>
</tr>
<tr>
<td><?php echo $p->t('pruefung/pruefungMaxTeilnehmer'); ?></td>
<td><input type="number" name="terminmax" placeholder="0" min="0" value="<?php echo $teilnehmer_max; ?>"></td>
</tr>
<tr>
<td></td>
<td>
+13 -4
View File
@@ -525,7 +525,11 @@ class pruefungCis extends basis_db
return false;
}
$qry = 'UPDATE campus.tbl_pruefung SET storniert=true WHERE pruefung_id='.$this->db_add_param($pruefung_id).';';
$qry = 'UPDATE campus.tbl_pruefung
SET storniert=true,
updatevon='.$this->db_add_param($this->updatevon).',
updateamum= now()
WHERE pruefung_id='.$this->db_add_param($pruefung_id).';';
if(!$this->db_query($qry))
{
@@ -706,13 +710,18 @@ class pruefungCis extends basis_db
* @param String $mitarbeiter_uid UID des Mitarbeiters (optional)
* @return boolean
*/
public function getAllPruefungen($mitarbeiter_uid = NULL)
public function getAllPruefungen($mitarbeiter_uid = NULL, $storniert = null)
{
$qry = 'SELECT * FROM campus.tbl_pruefung';
$qry = 'SELECT * FROM campus.tbl_pruefung WHERE 1 = 1';
if(!is_null($mitarbeiter_uid))
{
$qry .= ' WHERE mitarbeiter_uid='.$this->db_add_param($mitarbeiter_uid);
$qry .= ' AND mitarbeiter_uid='.$this->db_add_param($mitarbeiter_uid);
}
if(!is_null($storniert))
{
$qry .= ' AND storniert = '.$this->db_add_param($storniert, FHC_BOOLEAN);
}
$qry .= ';';
+1
View File
@@ -124,6 +124,7 @@ $this->phrasen['pruefung/anmeldungenVerwalten'] = 'Anmeldungen Verwalten';
$this->phrasen['pruefung/anmeldungErfolgreich'] = 'Anmeldung erfolgreich!';
$this->phrasen['pruefung/zuWenigeCreditPoints'] = 'Credit-Points-Guthaben ist zu gering.';
$this->phrasen['pruefung/kollisionMitAndererAnmeldung'] = 'Kollision mit anderer Anmeldung.';
$this->phrasen['pruefung/kollisionMitAndererAnmeldungForce'] = 'Kollision mit anderer Anmeldung. Trotzdem fortfahren?';
$this->phrasen['pruefung/keineFreienPlaetzeVorhanden'] = 'Keine freien Plätze vorhanden.';
$this->phrasen['pruefung/anmeldungAufgrundVonSperreNichtMoeglich'] = 'Anmeldung auf Grund von Sperre nicht möglich.';
$this->phrasen['pruefung/prestudentNichtGefunden'] = 'Prestudent nicht gefunden.';
+1
View File
@@ -123,6 +123,7 @@ $this->phrasen['pruefung/anmeldungenVerwalten'] = 'Anmeldungen Verwalten';
$this->phrasen['pruefung/anmeldungErfolgreich'] = 'Registration successful.';
$this->phrasen['pruefung/zuWenigeCreditPoints'] = 'Credit-Points-Guthaben ist zu gering.';
$this->phrasen['pruefung/kollisionMitAndererAnmeldung'] = 'Kollision mit anderer Anmeldung.';
$this->phrasen['pruefung/kollisionMitAndererAnmeldungForce'] = 'Kollision mit anderer Anmeldung. Trotzdem fortfahren?';
$this->phrasen['pruefung/keineFreienPlaetzeVorhanden'] = 'Keine freien Plätze vorhanden.';
$this->phrasen['pruefung/anmeldungAufgrundVonSperreNichtMoeglich'] = 'Anmeldung auf Grund von Sperre nicht möglich.';
$this->phrasen['pruefung/prestudentNichtGefunden'] = 'Prestudent nicht gefunden.';
@@ -32,15 +32,15 @@ export default {
},
hasZGVBakkPermission: {
from: 'hasZGVBakkPermission',
default: false
default: []
},
hasZGVMasterPermission: {
from: 'hasZGVMasterPermission',
default: false
default: []
},
hasZGVDoctorPermission: {
from: 'hasZGVDoctorPermission',
default: false
default: []
},
hasBismeldenPermission: {
from: 'hasBismeldenPermission',
@@ -89,6 +89,15 @@ export default {
computed: {
deltaLength() {
return Object.keys(this.deltaArray).length;
},
disableZgvBakk: function() {
return !this.hasZGVBakkPermission.includes(this.modelValue.studiengang_kz.toString());
},
disableZgvMaster: function() {
return !this.hasZGVMasterPermission.includes(this.modelValue.studiengang_kz.toString());
},
disableZgvDoctor: function() {
return !this.hasZGVDoctorPermission.includes(this.modelValue.studiengang_kz.toString());
}
},
watch: {
@@ -289,7 +298,7 @@ export default {
dropdown
name="zgv_code"
@complete="filterZgvs"
:disabled="!hasZGVBakkPermission"
:disabled="disableZgvBakk"
>
<template #option="slotProps">
<div
@@ -308,7 +317,6 @@ export default {
type="text"
v-model="data.zgvort"
name="zgvort"
:disabled="!hasZGVBakkPermission"
>
</form-input>
<form-input
@@ -325,7 +333,6 @@ export default {
format="dd.MM.yyyy"
preview-format="dd.MM.yyyy"
:teleport="true"
:disabled="!hasZGVBakkPermission"
>
</form-input>
<form-input
@@ -335,7 +342,6 @@ export default {
type="select"
v-model="data.zgvnation"
name="zgvnation"
:disabled="!hasZGVBakkPermission"
>
<!-- TODO(chris): gesperrte nationen können nicht ausgewählt werden! Um das zu realisieren müsste man ein pseudo select machen -->
<option value="">&nbsp;</option>
@@ -356,7 +362,7 @@ export default {
dropdown
name="zgvmas_code"
@complete="filterMasterZgvs"
:disabled="!hasZGVMasterPermission"
:disabled="disableZgvMaster"
>
<template #option="slotProps">
<div
@@ -375,7 +381,6 @@ export default {
type="text"
v-model="data.zgvmaort"
name="zgvmaort"
:disabled="!hasZGVMasterPermission"
>
</form-input>
<form-input
@@ -392,7 +397,6 @@ export default {
format="dd.MM.yyyy"
preview-format="dd.MM.yyyy"
:teleport="true"
:disabled="!hasZGVMasterPermission"
>
</form-input>
<form-input
@@ -402,7 +406,6 @@ export default {
type="select"
v-model="data.zgvmanation"
name="zgvmanation"
:disabled="!hasZGVMasterPermission"
>
<!-- TODO(chris): gesperrte nationen können nicht ausgewählt werden! Um das zu realisieren müsste man ein pseudo select machen -->
<option value="">&nbsp;</option>
@@ -424,7 +427,7 @@ export default {
dropdown
name="zgvdoktor_code"
@complete="filterDoktorZgvs"
:disabled="!hasZGVDoctorPermission"
:disabled="disableZgvDoctor"
>
<template #option="slotProps">
<div
@@ -443,7 +446,6 @@ export default {
type="text"
v-model="data.zgvdoktorort"
name="zgvdoktorort"
:disabled="!hasZGVDoctorPermission"
>
</form-input>
<form-input
@@ -460,7 +462,6 @@ export default {
format="dd.MM.yyyy"
preview-format="dd.MM.yyyy"
:teleport="true"
:disabled="!hasZGVDoctorPermission"
>
</form-input>
<form-input
@@ -470,7 +471,6 @@ export default {
type="select"
v-model="data.zgvdoktornation"
name="zgvdoktornation"
:disabled="!hasZGVDoctorPermission"
>
<!-- TODO(chris): gesperrte nationen können nicht ausgewählt werden! Um das zu realisieren müsste man ein pseudo select machen -->
<option value="">&nbsp;</option>
@@ -487,7 +487,6 @@ export default {
type="checkbox"
v-model="data.zgv_erfuellt"
name="zgv_erfuellt"
:disabled="!hasZGVBakkPermission"
>
</form-input>
</div>
@@ -499,7 +498,6 @@ export default {
type="checkbox"
v-model="data.zgvmas_erfuellt"
name="zgvmas_erfuellt"
:disabled="!hasZGVMasterPermission"
>
</form-input>
</div>
@@ -511,7 +509,6 @@ export default {
type="checkbox"
v-model="data.zgvdoktor_erfuellt"
name="zgvdoktor_erfuellt"
:disabled="!hasZGVDoctorPermission"
>
</form-input>
</div>
@@ -91,7 +91,15 @@ export default{
layoutColumnsOnNewData: false,
height: 'auto',
index: 'pruefung_id',
persistenceID: 'stv-details-pruefung-list-2025112402'
persistenceID: 'stv-details-pruefung-list-2026012701',
persistence: {
sort: false,
columns: ["width", "visible", "frozen"],
filter: false,
headerFilter: false,
group: false,
page: false
}
},
tabulatorEvents: [
{