Skip to content
Snippets Groups Projects
Verified Commit 56b220e7 authored by Manuel Herrmann's avatar Manuel Herrmann
Browse files

Merge branch 'feature-refactor-meldeliste'

parents d7e65175 bfc1f781
No related branches found
Tags v0.5
1 merge request!20refactor warteliste: allows modification of list items like on meldeliste
......@@ -36,6 +36,10 @@ class AdminBase extends DefaultAdmin {
'infos' => 'Infos',
'admin' => 'SA*'
];
private static $PAGE_OVERRIDE = [
'wl' => ['list', ['waitlist' => 'true']],
'wl_al' => ['list', ['alumni' => 'true', 'waitlist' => 'true']],
];
private static $DEFAULT_PAGE = 'overview';
private static $SUPERADMIN_PAGES = ['admin'];
......@@ -146,7 +150,7 @@ class AdminBase extends DefaultAdmin {
protected function echoNavigation() {
if ($this->isLoggedIn()) {
echo $this->makeNavigationItems(array_flip(AdminBase::$PAGES));
echo $this->makeNavigationItems(AdminBase::$PAGES, AdminBase::$PAGE_OVERRIDE);
}
}
......@@ -328,4 +332,4 @@ abstract class AdminPage {
}
(new AdminBase())->exec();
\ No newline at end of file
(new AdminBase())->exec();
......@@ -4,14 +4,35 @@ class AdminListPage extends AdminPage {
public function __construct($base) {
parent::__construct($base);
$this->isWaitlist = isset($_GET['waitlist']) && $_GET['waitlist'] == 'true';
$this->isAlumniPage = isset($_GET['alumni']) && $_GET['alumni'] == 'true';
// moves entry to final list
if(isset($_REQUEST['move'])){
try {
$bachelor = Bachelor::makeFromDB($this->fahrt, $_REQUEST['move']);
if (empty($bachelor))
throw new Exception('Person nicht vorhanden.');
if ($this->isWaitlist) {
$transferResult = $bachelor->waitlistToRegistration();
} else {
$transferResult = $bachelor->registrationToWaitlist();
}
if ($transferResult == Bachelor::SAVE_SUCCESS) {
$this->message_succ = 'Person erfolgreich von '.($this->isWaitlist?"Warteliste":"Anmeldeliste").' auf '.($this->isWaitlist?"Anmeldeliste":"Warteliste").' übertragen.';
} else {
throw new Exception('Hat nicht geklappt. Fehlercode '.$transferResult);
}
} catch (Exception $e) {
$this->message_err = $e->getMessage();
}
}
if (isset($_REQUEST['change'])) {
try {
$bNew = Bachelor::makeFromForm(false, $this->fahrt, true, true);
$bNew->set(['bachelor_id' => $_REQUEST['change']]);
// print_r($bNew->getData());
$bOld = Bachelor::makeFromDB($this->fahrt, $_REQUEST['change']);
// print_r($bOld->getData());
$bOld->updateBachelor($bNew);
$saveResult = $bOld->save();
if ($saveResult !== Bachelor::SAVE_SUCCESS)
......@@ -117,6 +138,7 @@ class AdminListPage extends AdminPage {
}
public function getText() {
$extra_filters = ['fahrt_id' => $this->fahrt->getID()];
$cols = ['Anmelde-ID','Anmeldung', 'Name', 'Pseudo', 'Anreisetyp', 'Abreisetyp', 'Anreisetag','Abreisetag',
'Kommentar','Studityp','Essen', '18+', 'Orga', 'M.spiel', 'PaidReBack'];
$buttoncol = count($cols)-1;
......@@ -127,35 +149,58 @@ class AdminListPage extends AdminPage {
$thead .= '<th>'.$col.'</th>';
$toggle .= '<a class="toggle-vis" data-column="' . $tcnt . '">' . $col . '</a> - ';
}
$thead .= '<th>toWaitlist</th>';
$toggle .= '<a class="toggle-vis" data-column=\'15\'>toWaitlist</a> - ';
if ($this->isWaitlist) {
$thead .= '<th>Übertragen</th>';
$toggle .= '<a class="toggle-vis" data-column=\''.sizeof($cols).'\'>toWaitlist</a> - ';
$extra_filters['on_waitlist'] = 1;
$extra_filters['studityp'.($this->isAlumniPage ? '' : '[!]')] = 'ALUMN';
} else {
$extra_filters['on_waitlist'] = 0;
$thead .= '<th>toWaitlist</th>';
$toggle .= '<a class="toggle-vis" data-column=\''.sizeof($cols).'\'>toWaitlist</a> - ';
}
$people = $this->fahrt->getBachelors(['waiting'=>false], ['anm_time' => 'ASC']);
$tbody = '';
$people = $this->environment->database->select('bachelor', Bachelor::$ALLOWED_FIELDS,
['AND' => $extra_filters], ['anm_time' => 'ASC']);
foreach ($people as $b) {
$tbody .= '
$zurueckgetreten = $b['backstepped'] ? 1 : 0;
$anfahrtDatum = $this->mysql2german($b['anday']);
$abfahrtDatum = $this->mysql2german($b['abday']);
$anmelde_zeit = date('d.m.Y - G:i.s', $b['anm_time']);
$ueber18JaNein = $b['virgin'] == 1 ? 'Nein' : 'Ja';
$orgaJaNein = $b['isOrga'] == 1 ? 'Ja' : 'Nein';
$moerderSpielJaNein = $b['mGame'] == 1 ? 'Ja' : 'Nein';
$bezahltJaNein = $b['paid'] ? 1 : 0;
$zurueckgezahltJaNein = $b['repaid'] ? 1 : 0;
$kommentar = htmlspecialchars($b['comment'], ENT_QUOTES);
$waitlist_tf = $this->isWaitlist ? "true" : "false";
$alumni_tf = $this->isAlumniPage ? "true" : "false";
$transfer_text = $this->isWaitlist ? "Anmeldeliste" : "Warteliste";
$tbody .= <<<EOF
<tr>
<td><a href="#" class="edit_bachelor">'.$b['bachelor_id'].'</a></td>
<td>'.date('d.m.Y - G:i.s', $b['anm_time']).'</td>
<td><a href="mailto:'.$b['mehl'].'?subject=FS-Fahrt">' . $b['forname'] . ' ' . $b['sirname'] .'</a></td>
<td>'.$b['pseudo'].'</td>
<td>'.$b['antyp'].'</td>
<td>'.$b['abtyp'].'</td>
<td>'.$this->mysql2german($b['anday']).'</td>
<td>'.$this->mysql2german($b['abday']).'</td>
<td>'. htmlspecialchars($b['comment'], ENT_QUOTES).'</td>
<td>'.$b['studityp'].'</td>
<td>'.$b['essen'].'</td>
<td>'.($b['virgin']==0 ? 'Ja' : 'Nein').'</td>
<td>'.($b['isOrga']==1 ? 'Ja' : 'Nein').'</td>
<td>'.($b['mGame']==1 ? 'Ja' : 'Nein').'</td>
<td>'.($b['paid'] ? $b['paid'] : '0') . ',' . ($b['repaid'] ? $b['repaid'] : '0') . ',' . ($b['backstepped'] ? $b['backstepped'] : '0').'</td>
<td><a href="#" class="moveToWaitlist">&#8614; Warteliste</a></td>
<td>'.($b['backstepped'] ? 1 : '0').'</td>
</tr>';
<td><a href="#" class="edit_bachelor">${b['bachelor_id']}</a></td>
<td>$anmelde_zeit</td>
<td><a href="mailto:${b['mehl']}?subject=FS-Fahrt">${b['forname']} ${b['sirname']}</a></td>
<td>${b['pseudo']}</td>
<td>${b['antyp']}</td>
<td>${b['abtyp']}</td>
<td>$anfahrtDatum</td>
<td>$abfahrtDatum</td>
<td>$kommentar</td>
<td>${b['studityp']}</td>
<td>${b['essen']}</td>
<td>$ueber18JaNein</td>
<td>$orgaJaNein</td>
<td>$moerderSpielJaNein</td>
<td>$bezahltJaNein,$zurueckgezahltJaNein,$zurueckgetreten</td>
<td><a href="?page=list&waitlist=${waitlist_tf}&alumni=${alumni_tf}&move=${b['bachelor_id']}">&#8614; ${transfer_text}</a></td>
<td>$zurueckgetreten</td>
</tr>
EOF;
}
return '<h1>Meldeliste</h1>' .
return '<h1>' . ($this->isWaitlist ? 'Warteliste' : 'Meldeliste') . ($this->isAlumniPage ? ' für Alumnis' : '') . '</h1>' .
$this->getMessage().'<br />' .
$toggle.'<br />
<br />
......@@ -170,7 +215,6 @@ class AdminListPage extends AdminPage {
<p></p>
</div>
<script type="text/javascript">
deDateRegExp = new RegExp(".*([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4}).*");
jQuery.extend( jQuery.fn.dataTableExt.oSort, {
"link-pre": function ( a ) {
return a.match(/<a [^>]+>([^<]+)<\/a>/)[1];
......@@ -180,10 +224,9 @@ class AdminListPage extends AdminPage {
return ((tmp[0]==0) ? "0" : "1") + ((tmp[1]==0) ? "0" : "1") + ((tmp[2]==0) ? "0" : "1");
},
"dedate-pre": function( a ) {
var tmp = deDateRegExp.exec(a);
if(tmp) {
return (tmp[3]+tmp[2]+tmp[1]);
}
var tmp = a.split(".");
if(tmp.length>2)
return (tmp[2]+tmp[1]+tmp[0]);
return a;
}
});
......@@ -349,7 +392,7 @@ class AdminListPage extends AdminPage {
<b>Zurückgetreten:</b> ' . $this->nulltime2german($data['backstepped']) . '<br/>
<br />
<div id="stylized" class="myform">
<form id="form" name="form" method="post" action="?page=list">
<form id="form" name="form" method="post">
<input type="hidden" value="' . $bid . '" name="change" id="change" />
<input type="hidden" value="' . $fid . '" name="fahrt_id" id="fahrt_id" />' .
$this->getFormInput('Vorname', 'forname', $data['forname'], '') .
......
<?php
class AdminWlPage extends AdminPage {
public function __construct($base) {
parent::__construct($base);
$db = $this->environment->database;
$fid = $this->fahrt->getID();
// deletes the entry completely
if(isset($_REQUEST['delete'])){
$delResult = $db->delete('bachelor', ['AND' => ['bachelor_id' => $_REQUEST['delete'], 'fahrt_id' => $fid]]);
if (empty($delResult)) $this->message_err = 'Löschversuch versagt!';
else $this->message_succ = 'Löschung geglückt.';
}
// moves entry to final list
if(isset($_REQUEST['move'])){
try {
$bachelor = Bachelor::makeFromDB($this->fahrt, $_REQUEST['move']);
if (empty($bachelor))
throw new Exception('Person nicht vorhanden.');
$transferResult = $bachelor->waitlistToRegistration();
if ($transferResult == Bachelor::SAVE_SUCCESS) {
$this->message_succ = 'Person erfolgreich von Warteliste auf Anmeldeliste übertragen.';
} else {
throw new Exception('Hat nicht geklappt. Fehlercode '.$transferResult);
}
} catch (Exception $e) {
$this->message_err = $e->getMessage();
}
}
}
public function getHeaders() {
return '
<link rel="stylesheet" type="text/css" href="../view/css/DataTables/css/jquery.dataTables.min.css" />
<script type="text/javascript" src="../view/js/jquery-1.11.1.min.js"></script>
<script type="text/javascript" src="../view/js/jquery.dataTables.1.10.9.min.js"></script>';
}
public function getHeader() {
return '';
}
public function getFooter() {
return '';
}
public function getText() {
$people = $this->environment->database->select('bachelor',
Bachelor::$ALLOWED_FIELDS,
['AND'=> ['on_waitlist'=> 1, 'studityp[!]' => 'ALUMN', 'fahrt_id'=>$this->fahrt->getID()]]);
$columnFunctions = [
'Anmelde-ID' => function($person) { return $person['bachelor_id']; },
'Anmeldung' => function($person) { return date('d.m.Y', $person['anm_time']); },
'Name' => function($person) { return '<a href="mailto:'.$person['mehl'].'?subject=FS-Fahrt">'. $person['forname'].' '.$person['sirname'].' ('.$person['pseudo'].')</a>'; },
'Anreisetyp' => function($person) { return $person['antyp']; },
'Abreisetyp' => function($person) { return $person['abtyp']; },
'Anreisetag' => function($person) { return $this->base->mysql2german( $person['anday']); },
'Abreisetag' => function($person) { return $this->base->mysql2german( $person['abday']); },
'Kommentar' => function($person) { return $person['comment']; },
'StudiTyp' => function($person) { return $person['studityp']; },
'Essen' => function($person) { return $person['essen']; },
// 'Essen' => function($person) { global $config_essen_o; return array_search($person['essen'], $config_essen_o); },
'18+' => function($person) { return (($person['virgin']==0) ? 'Ja' : 'Nein'); },
'Orga' => function($person) { return (($person['isOrga']==1) ? 'Ja' : 'Nein'); },
// 'Mörderspiel' => function($person) { return (($person['mGame']==1) ? 'Ja' : 'Nein'); },
'Uebertragen' => function($person) {
if(!is_numeric($person['transferred']))
return '<a href="?page=wl&move='.$person['bachelor_id'].'">&#8614; übertragen</a>';
else
return date('d.m.Y - G:i.s', $person['transferred']);
}
];
$toggles = 'Toggle Column: ';
$thead = '';
foreach(array_keys($columnFunctions) as $tcnt => $key){
$toggles .= '<a class="toggle-vis" data-column="'.$tcnt.'">'.$key.'</a> - ';
$thead .= '<th>'.$key.'</th>';
}
$tbody = '';
foreach($people as $person) {
$tbody .= '<tr>';
foreach($columnFunctions as $key => $value){
$tbody .= '<td class="'.$key.((strpos($columnFunctions['Uebertragen']($person), "href")>0) ? '' : ' list-backstepped').'">'.$value($person).'</td>';
}
$tbody .= '</tr>';
}
return '<h1>Warteliste</h1>'.
$toggles.'<br />
<table id="mlist" class="compact hover">
<thead>
<tr>'.$thead.'</tr>
</thead>
<tbody>' .
$tbody .
'</tbody>
</table>
<script type="text/javascript">
jQuery.extend( jQuery.fn.dataTableExt.oSort, {
"link-pre": function ( a ) {
var tmp = a.match(/<a [^>]+>([^<]+)<\/a>/);
if(tmp) return a.match(/<a [^>]+>([^<]+)<\/a>/)[1];
else return a;
},
"dedate-pre": function(a){
var tmp = a.split(".");
console.log(tmp[2]+tmp[1]+tmp[0]);
if(tmp.length>2) return (tmp[2]+tmp[1]+tmp[0]);
return a;
}
});
var ltab;
$(document).ready(function(){
ltab = $("#mlist").DataTable({
"columnDefs": [
{ type: "dedate", targets: [1,5,6]},
{ type: "link", targets: [2, 11] }
],
"order": [[ 11, "desc" ], [1,"asc" ]],
"paging": false
});
$("a.toggle-vis").click( function (e) {
e.preventDefault();
// Get the column API object
var column = ltab.column( $(this).attr("data-column") );
// Toggle the visibility
column.visible( ! column.visible() );
} );
});
</script>';
}
public function getAjax() {
return '';
}
}
<?php
class AdminWl_alPage extends AdminPage {
public function __construct($base) {
parent::__construct($base);
$db = $this->environment->database;
$fid = $this->fahrt->getID();
// deletes the entry completely
if(isset($_REQUEST['delete'])){
$delResult = $db->delete('bachelor', ['AND' => ['bachelor_id' => $_REQUEST['delete'], 'fahrt_id' => $fid]]);
if (empty($delResult)) $this->message_err = 'Löschversuch versagt!';
else $this->message_succ = 'Löschung geglückt.';
}
// moves entry to final list
if(isset($_REQUEST['move'])){
try {
$bachelor = Bachelor::makeFromDB($this->fahrt, $_REQUEST['move']);
if (empty($bachelor))
throw new Exception('Person nicht vorhanden.');
$transferResult = $bachelor->waitlistToRegistration();
if ($transferResult == Bachelor::SAVE_SUCCESS) {
$this->message_succ = 'Person erfolgreich von Warteliste auf Anmeldeliste übertragen.';
} else {
throw new Exception('Hat nicht geklappt. Fehlercode '.$transferResult);
}
} catch (Exception $e) {
$this->message_err = $e->getMessage();
}
}
}
public function getHeaders() {
return '
<link rel="stylesheet" type="text/css" href="../view/css/DataTables/css/jquery.dataTables.min.css" />
<script type="text/javascript" src="../view/js/jquery-1.11.1.min.js"></script>
<script type="text/javascript" src="../view/js/jquery.dataTables.1.10.9.min.js"></script>';
}
public function getHeader() {
return '';
}
public function getFooter() {
return '';
}
public function getText() {
$people = $this->environment->database->select('bachelor',
Bachelor::$ALLOWED_FIELDS,
['AND'=> ['on_waitlist'=> 1, 'studityp' => 'ALUMN', 'fahrt_id'=>$this->fahrt->getID()]]);
$columnFunctions = [
'Anmelde-ID' => function($person) { return $person['bachelor_id']; },
'Anmeldung' => function($person) { return date('d.m.Y', $person['anm_time']); },
'Name' => function($person) { return '<a href="mailto:'.$person['mehl'].'?subject=FS-Fahrt">'. $person['forname'].' '.$person['sirname'].' ('.$person['pseudo'].')</a>'; },
'Anreisetyp' => function($person) { return $person['antyp']; },
'Abreisetyp' => function($person) { return $person['abtyp']; },
'Anreisetag' => function($person) { return $this->base->mysql2german( $person['anday']); },
'Abreisetag' => function($person) { return $this->base->mysql2german( $person['abday']); },
'Kommentar' => function($person) { return $person['comment']; },
'StudiTyp' => function($person) { return $person['studityp']; },
'Essen' => function($person) { return $person['essen']; },
// 'Essen' => function($person) { global $config_essen_o; return array_search($person['essen'], $config_essen_o); },
'18+' => function($person) { return (($person['virgin']==0) ? 'Ja' : 'Nein'); },
'Orga' => function($person) { return (($person['isOrga']==1) ? 'Ja' : 'Nein'); },
// 'Mörderspiel' => function($person) { return (($person['mGame']==1) ? 'Ja' : 'Nein'); },
'Uebertragen' => function($person) {
if(!is_numeric($person['transferred']))
return '<a href="?page=wl&move='.$person['bachelor_id'].'">&#8614; übertragen</a>';
else
return date('d.m.Y - G:i.s', $person['transferred']);
}
];
$toggles = 'Toggle Column: ';
$thead = '';
foreach(array_keys($columnFunctions) as $tcnt => $key){
$toggles .= '<a class="toggle-vis" data-column="'.$tcnt.'">'.$key.'</a> - ';
$thead .= '<th>'.$key.'</th>';
}
$tbody = '';
foreach($people as $person) {
$tbody .= '<tr>';
foreach($columnFunctions as $key => $value){
$tbody .= '<td class="'.$key.((strpos($columnFunctions['Uebertragen']($person), "href")>0) ? '' : ' list-backstepped').'">'.$value($person).'</td>';
}
$tbody .= '</tr>';
}
return '<h1>Warteliste für Alumnis</h1>'.
$toggles.'<br />
<table id="mlist" class="compact hover">
<thead>
<tr>'.$thead.'</tr>
</thead>
<tbody>' .
$tbody .
'</tbody>
</table>
<script type="text/javascript">
jQuery.extend( jQuery.fn.dataTableExt.oSort, {
"link-pre": function ( a ) {
var tmp = a.match(/<a [^>]+>([^<]+)<\/a>/);
if(tmp) return a.match(/<a [^>]+>([^<]+)<\/a>/)[1];
else return a;
},
"dedate-pre": function(a){
var tmp = a.split(".");
console.log(tmp[2]+tmp[1]+tmp[0]);
if(tmp.length>2) return (tmp[2]+tmp[1]+tmp[0]);
return a;
}
});
var ltab;
$(document).ready(function(){
ltab = $("#mlist").DataTable({
"columnDefs": [
{ type: "dedate", targets: [1,5,6]},
{ type: "link", targets: [2, 11] }
],
"order": [[ 11, "desc" ], [1,"asc" ]],
"paging": false
});
$("a.toggle-vis").click( function (e) {
e.preventDefault();
// Get the column API object
var column = ltab.column( $(this).attr("data-column") );
// Toggle the visibility
column.visible( ! column.visible() );
} );
});
</script>';
}
public function getAjax() {
return '';
}
}
......@@ -161,9 +161,8 @@ class Bachelor {
* @return int see SAVE_* constants
*/
public function waitlistToRegistration() {
if ($this->data['on_waitlist'] == 1 and
(!isset($this->data['transferred']) or is_null($this->data['transferred']))
) {
if ($this->data['on_waitlist'] == 1) {
$this->data['on_waitlist'] = 0;
$this->data['transferred'] = time();
$code = $this->save();
......
......@@ -49,10 +49,24 @@ abstract class DefaultAdmin {
</form>';
}
protected function makeNavigationItems($menu) {
protected function makeNavigationItems($menu, $overrides) {
$text = '';
foreach ($menu as $name => $page) {
$text .= '<a href="?page=' . $page . '">' . $name . '</a>';
foreach ($menu as $page => $name) {
$args = "";
if (isset($overrides[$page])) {
$override = $overrides[$page];
$page = $override[0];
$overrideLength = count($override[1]);
$args = [];
if ($overrideLength > 0) {
foreach ($override[1] as $key => $value) {
array_push($args, urlencode($key).'='.urlencode($value));
}
$args[0] = "&".$args[0];
}
$args = join("&", $args);
}
$text .= '<a href="?page=' . $page . $args . '">' . $name . '</a>';
}
return $text;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment