@@ -4,14 +4,14 @@ function kc_force_zuteilung_page() {
$prefix = $wpdb -> prefix ;
kc_admin_tabs ( 'kc_force_zuteilung' );
// Force-Zuteilung lö schen
// Force-Zuteilung l<EFBFBD> schen
if ( isset ( $_GET [ 'delete_force' ])) {
$fid = intval ( $_GET [ 'delete_force' ]);
$wpdb -> delete ( " { $prefix } kc_force_zuteilung " , [ 'id' => $fid ]);
echo '<div class="notice notice-success">Force-Zuteilung gelö scht!</div>' ;
echo '<div class="notice notice-success">Force-Zuteilung gel<EFBFBD> scht!</div>' ;
}
// Force speichern (neu/ä ndern)
// Force speichern (neu/<EFBFBD> ndern)
if ( isset ( $_POST [ 'kc_force_save' ])) {
$data = [
'teilnehmer_id' => intval ( $_POST [ 'teilnehmer_id' ]),
@@ -29,69 +29,143 @@ function kc_force_zuteilung_page() {
}
}
// Listen fü r Dropdowns
// Listen f<EFBFBD> r Dropdowns
$teilnehmer_liste = $wpdb -> get_results ( " SELECT * FROM { $prefix } kc_teilnehmer ORDER BY nachname, vorname " );
$workshop_liste = $wpdb -> get_results ( " SELECT * FROM { $prefix } kc_workshops ORDER BY name " );
$wahlen = $wpdb -> get_results ( " SELECT id, name FROM { $prefix } kc_wahlen WHERE deleted=0 ORDER BY name " );
$wahlen = $wpdb -> get_results ( " SELECT id, name, COALESCE(anzahl_einheiten,1) AS anzahl_einheiten FROM { $prefix } kc_wahlen WHERE deleted=0 ORDER BY name " );
// Bearbeiten
if ( isset ( $_GET [ 'edit_force' ])) {
$fid = intval ( $_GET [ 'edit_force' ]);
$fz = $wpdb -> get_row ( " SELECT * FROM { $prefix } kc_force_zuteilung WHERE id= $fid " );
echo '<div class="kc-admin-table-wrap">' ;
echo '<h2>Force-Zuteilung bearbeiten</h2>
<form method="post">
<input type="hidden" name="fid" value="' . intval ( $fz -> id ) . '">
<div class="kc-form-row">
<label>Teilnehmer <span class="kc-required">*</span></label>
<select name="teilnehmer_id" id="kc-force-teilnehmer-dropdown" style="width:100%">
<option value="">Teilnehmer auswählen…</option>' ;
foreach ( $teilnehmer_liste as $t ) {
echo '<option value="' . esc_attr ( $t -> id ) . '"' . ( $fz -> teilnehmer_id == $t -> id ? ' selected' : '' ) . '>'
. esc_html ( $t -> vorname . ' ' . $t -> nachname . ' (ID: ' . $t -> id . ') ' )
. ' </option>' ;
}
echo ' </select>
</div>
<div class="kc-form-row">
<label>Wahl <span class="kc-required">*</span></label>
<select name="wahl_id" id="kc-force-wahl-dropdown" style="width:100%">
<option value="">Wahl auswählen…</option >';
foreach ( $wahlen as $w ) {
echo '<option value="' . intval ( $w -> id ) . '"' . ( $fz -> wahl_id == $w -> id ? ' selected' : '' ) . '>'
. esc_html ( $w -> name . ' (ID ' . $w -> id . ')' ) . '</option >' ;
}
echo ' </ select>
</div>
<div class="kc-form-row">
<label>Phase</label>
<input type="number" name="phase" value="' . intval ( $fz -> phase ) . '" style="width:100%">
</div>
<div class="kc-form-row">
<label>Workshop <span class="kc-required">*</span></label>
<select name="workshop_id" id="kc-force-workshop-dropdown" style="width:100%">
<option value="">Workshop auswählen…</option >';
foreach ( $workshop_liste as $ws ) {
echo '<option value="' . esc_attr ( $ws -> id ) . '"' . ( $fz -> workshop_id == $ws -> id ? ' selected' : '' ) . '>'
. esc_htm l ( $ws -> name )
. '</option >' ;
}
echo ' </select>
</div>
<div class="kc-form-row">
<label>Kommentar </label>
<input type="text" name="kommentar" value="' . esc_attr ( $fz -> kommentar ) . ' " style="width:100%">
</div>
<button name="kc_force_save" class="kc-btn">Speichern</button>
<a href="?page=kc_force_zuteilung" class="kc-btn del" style="margin-left:24px;">Abbrechen</a>
</form>
<script>
jQuery(function($){
$("#kc-force-teilnehmer-dropdown").select2({placeholder:"Teilnehmer auswählen…",allowClear:true});
$("#kc-force-wahl-dropdown").select2({placeholder:"Wahl auswählen…",allowClear:true});
$("#kc-force-workshop-dropdown").select2({placeholder:"Workshop auswählen…",allowClear:true});
});
</script >';
echo '<h2>Force-Zuteilung bearbeiten</h2>' ;
echo '<div class="kc-form-container" style="max-width:880px;padding:18px 20px;border-radius:10px;background:#fff;border:1px solid #eef3f2;">' ;
echo '<form method="post">' ;
echo '<input type="hidden" name="fid" value="' . intval ( $fz -> id ) . '">' ;
echo '<div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;align-items:start">' ;
// Teilnehmer
echo '<div class="kc-form-row" style="min-width:0">' ;
echo '<label>Teilnehmer <span class="kc-required">*</span></label>' ;
echo '<select name="teilnehmer_id" id="kc-force-teilnehmer-dropdown" style="width:100%"> ';
echo '<option value="">Teilnehmer auswählen… </option>';
foreach ( $teilnehmer_liste as $t ) {
echo '<option value="' . esc_attr ( $t -> id ) . '"' . ( $fz -> teilnehmer_id == $t -> id ? ' selected' : '' ) . '>'
. esc_html ( $t -> vorname . ' ' . $t -> nachname . ' (ID: ' . $t -> id . ')' )
. '</option>' ;
}
echo '</select>' ;
echo '</div >';
// Wahl
echo '<div class="kc-form-row" style="min-width:0" >';
echo '<label>Wahl <span class="kc-required">*</span></label>' ;
echo '< select name="wahl_id" id="kc-force-wahl-dropdown" style="width:100%">' ;
echo '<option value="">Wahl auswählen…</option>' ;
foreach ( $wahlen as $w ) {
echo '<option value="' . intval ( $w -> id ) . '" data-einheiten="' . intval ( $w -> anzahl_einheiten ) . '"' . ( $fz -> wahl_id == $w -> id ? ' selected' : '' ) . '>' . esc_html ( $w -> name . ' (ID ' . $w -> id . ')' ) . '</option>' ;
}
echo '</select>' ;
echo '</div>' ;
// Phase (select so JS can populate based on Wahl)
echo '<div class="kc-form-row" style="min-width:0" >';
echo '<label>Phase</label>' ;
echo '<select name="phase" style="width:100%;padding:8px;border-radius:6px;border:1px solid #ddd">' ;
echo '<option value="' . intva l( $fz -> phase ) . '">' . intval ( $fz -> phase ) . '</option>' ;
echo '</select >';
echo '</div>' ;
// Workshop
echo ' <div class="kc-form-row" style="min-width:0">' ;
echo '<label>Workshop <span class="kc-required">*</span> </label>' ;
echo '<select name="workshop_id" id="kc-force-workshop-dropdown " style="width:100%">' ;
echo '<option value="">Workshop auswählen…</option>' ;
foreach ( $workshop_liste as $ws ) {
echo '<option value="' . esc_attr ( $ws -> id ) . '"' . ( $fz -> workshop_id == $ws -> id ? ' selected' : '' ) . '>'
. esc_html ( $ws -> name )
. '</option>' ;
}
echo '</select>' ;
echo '</div>' ;
// Kommentar (full width)
echo '<div style="grid-column:1/ -1" >';
echo '<div class="kc-form-row">' ;
echo '<label>Kommentar</label>' ;
echo '<input type="text" name="kommentar" value="' . esc_attr ( $fz -> kommentar ) . '" style="width:100%;padding:8px;border-radius:6px;border:1px solid #ddd">' ;
echo '</div>' ;
echo '</div>' ;
echo '</div>' ; // grid
echo '<div style="margin-top:12px;display:flex;gap:10px;justify-content:flex-start">' ;
echo '<button name="kc_force_save" class="kc-btn" style="padding:8px 16px;">Speichern</button>' ;
echo '<a href="?page=kc_force_zuteilung" class="kc-btn del" style="padding:8px 16px;">Abbrechen</a>' ;
echo '</div>' ;
echo '</form>' ;
echo '</div>' ;
// Prepare JS mapping of wahl_id -> number of phases
$wahl_phases = [];
foreach ( $wahlen as $w ) $wahl_phases [ intval ( $w -> id )] = intval ( $w -> anzahl_einheiten );
echo '<script>var kcWahlPhases = ' . wp_json_encode ( $wahl_phases ) . ';</script>' ;
echo <<< ' JS '
<script>
jQuery(function($){
$("#kc-force-teilnehmer-dropdown").select2({placeholder:"Teilnehmer auswählen…",allowClear:true});
$("#kc-force-wahl-dropdown").select2({placeholder:"Wahl auswählen…",allowClear:true});
$("#kc-force-workshop-dropdown").select2({placeholder:"Workshop auswählen…",allowClear:true});
function refreshPhaseSelect($wahlSelect, $phaseSelect, current) {
// prefer data attribute on the selected option; fall back to kcWahlPhases mapping
var selOpt = $wahlSelect.find('option:selected');
var max = parseInt(selOpt.data('einheiten') || kcWahlPhases[parseInt($wahlSelect.val(),10)] || 1, 10);
$phaseSelect.empty();
for(var i=1;i<=max;i++){
var opt = $("<option>").val(i).text(i + (i===1? " (Phase)":" (Phase)"));
$phaseSelect.append(opt);
}
if (current) {
$phaseSelect.val(current);
}
$phaseSelect.prop("disabled", false);
}
// Bind change for all existing wahl selects on the page
$(document).on("change", "#kc-force-wahl-dropdown", function(){
var $w = $(this);
var $phase = $w.closest("form").find("[name='phase']");
// try immediate refresh; if no data found, fallback to AJAX
var sel = $w.find('option:selected');
var einheiten = sel.data('einheiten') || kcWahlPhases[parseInt($w.val(),10)];
if (einheiten) {
refreshPhaseSelect($w, $phase);
} else {
// AJAX fallback to ask server for anzahl_einheiten
$.get(ajaxurl, {action: 'kc_get_wahl', id: $w.val()}).done(function(r){
if (r && r.success && r.data && r.data.anzahl_einheiten) {
// set data attribute so future reads find it
sel.data('einheiten', parseInt(r.data.anzahl_einheiten,10));
}
refreshPhaseSelect($w, $phase);
}).fail(function(){ refreshPhaseSelect($w, $phase); });
}
});
// Initialize existing phase selects based on their selected wahl
$("[name='phase']").each(function(){
var $phase = $(this);
var $form = $phase.closest("form");
var $wahl = $form.find("#kc-force-wahl-dropdown");
var current = $phase.val();
refreshPhaseSelect($wahl, $phase, current);
});
});
</script>
JS ;
echo '</div>' ;
return ;
}
@@ -99,63 +173,82 @@ function kc_force_zuteilung_page() {
// Neu anlegen
if ( isset ( $_GET [ 'new' ])) {
echo '<div class="kc-admin-table-wrap">' ;
echo '<h2>Neue Force-Zuteilung</h2>
<form method="post">
<div class="kc-form-row">
<label>Teilnehmer <span class="kc-required">*</span></label>
<select name="teilnehmer_id" id="kc-force-teilnehmer-dropdown" style="width:100%">
<option value="">Teilnehmer auswählen…</option>' ;
foreach ( $teilnehmer_liste as $t ) {
echo '<option value="' . esc_attr ( $t -> id ) . '">'
. esc_html ( $t -> vorname . ' ' . $t -> nachname . ' (ID: ' . $t -> id . ') ' )
. '</option >' ;
}
echo ' </select>
</div>
<div class="kc-form-row">
<label>Wahl <span class="kc-required">*</span></label>
<select name="wahl_id" id="kc-force-wahl-dropdown" style="width:100%">
<option value="">Wahl auswählen…</option>' ;
foreach ( $wahlen as $w ) {
echo '<option value="' . intval ( $w -> id ) . '">'
. esc_html ( $w -> name . ' (ID ' . $w -> id . ')' ) . '</option >' ;
}
echo ' </select>
</div>
<div class="kc-form-row">
<label>Phase</label>
<input type="number" name="phase" value="1" style="width:100%">
</div>
<div class="kc-form-row">
<label>Workshop <span class="kc-required">*</span></label>
<select name="workshop_id" id="kc-force-workshop-dropdown " style="width:100%">
<option value="">Workshop auswählen…</option >';
foreach ( $workshop_liste as $ws ) {
echo '<option value="' . esc_attr ( $ws -> id ) . '">'
. esc_html ( $ws -> name )
. '</option >' ;
}
echo ' </select>
</div>
<div class="kc-form-row">
<label>Kommentar</label>
<input type="text" name="kommentar" style="width:100%">
</div>
<button name="kc_force_save" class="kc-btn">Speichern</button>
<a href="?page=kc_force_zuteilung" class="kc-btn del" style="margin-left:24px;">Abbrechen</a>
</form>
<script>
echo '<h2>Neue Force-Zuteilung</h2>' ;
echo '<div class="kc-form-container" style="max-width:880px;padding:18px 20px;border-radius:10px;background:#fff;border:1px solid #eef3f2;">' ;
echo '<form method="post">' ;
echo '<div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;align-items:start">' ;
// Teilnehmer
echo '<div class="kc-form-row" style="min-width:0">' ;
echo '<label>Teilnehmer <span class="kc-required">*</span></label> ';
echo '<select name="teilnehmer_id" id="kc-force-teilnehmer-dropdown" style="width:100%" >';
echo '<option value="">Teilnehmer auswählen…</option>' ;
foreach ( $teilnehmer_liste as $t ) {
echo '<option value="' . esc_attr ( $t -> id ) . '">' . esc_html ( $t -> vorname . ' ' . $t -> nachname . ' (ID: ' . $t -> id . ')' ) . '</option>' ;
}
echo '</select>' ;
echo '</div>' ;
// Wahl
echo '<div class="kc-form-row" style="min-width:0">' ;
echo '<label>Wahl <span class="kc-required">*</span></label >';
echo '<select name="wahl_id" id="kc-force-wahl-dropdown" style="width:100%">' ;
echo '<option value="">Wahl auswählen…</option>' ;
foreach ( $wahlen as $w ) {
echo '<option value="' . intval ( $w -> id ) . '" data-einheiten="' . intval ( $w -> anzahl_einheiten ) . '">' . esc_html ( $w -> name . ' (ID ' . $w -> id . ')' ) . '</option>' ;
}
echo '</select>' ;
echo '</div>' ;
// Phase (select so JS can populate based on Wahl)
echo '<div class="kc-form-row " style="min- width:0">' ;
echo '<label>Phase</label >';
echo '<select name="phase" style="width:100%;padding:8px;border-radius:6px;border:1px solid #ddd">' ;
echo '<option value="1">1</option>' ;
echo '</select>' ;
echo '</div >';
// Workshop
echo '<div class="kc-form-row" style="min-width:0">' ;
echo '<label>Workshop <span class="kc-required">*</span></label>' ;
echo '<select name="workshop_id" id="kc-force-workshop-dropdown" style="width:100%">' ;
echo '<option value="">Workshop auswählen…</option>' ;
foreach ( $workshop_liste as $ws ) {
echo '<option value="' . esc_attr ( $ws -> id ) . '">' . esc_html ( $ws -> name ) . '</option>' ;
}
echo '</select>' ;
echo '</div>' ;
// Kommentar full width
echo '<div style="grid-column:1/ -1">' ;
echo '<div class="kc-form-row">' ;
echo '<label>Kommentar</label>' ;
echo '<input type="text" name="kommentar" style="width:100%;padding:8px;border-radius:6px;border:1px solid #ddd">' ;
echo '</div>' ;
echo '</div>' ;
echo '</div>' ; // grid
echo '<div style="margin-top:12px;display:flex;gap:10px;justify-content:flex-start">' ;
echo '<button name="kc_force_save" class="kc-btn" style="padding:8px 16px;">Speichern</button>' ;
echo '<a href="?page=kc_force_zuteilung" class="kc-btn del" style="padding:8px 16px;">Abbrechen</a>' ;
echo '</div>' ;
echo '</form>' ;
echo '</div>' ;
echo '<script>
jQuery(function($){
$("#kc-force-teilnehmer-dropdown").select2({placeholder:"Teilnehmer auswählen…",allowClear:true});
$("#kc-force-wahl-dropdown").select2({placeholder:"Wahl auswählen…",allowClear:true});
$("#kc-force-workshop-dropdown").select2({placeholder:"Workshop auswählen…",allowClear:true});
$("#kc-force-teilnehmer-dropdown").select2({placeholder:"Teilnehmer auswählen…",allowClear:true});
$("#kc-force-wahl-dropdown").select2({placeholder:"Wahl auswählen…",allowClear:true});
$("#kc-force-workshop-dropdown").select2({placeholder:"Workshop auswählen…",allowClear:true});
});
</script>' ;
echo '</div>' ;
return ;
}
// Ü bersicht
// <EFBFBD> bersicht
echo '<div class="kc-admin-table-wrap">' ;
echo '<h2 style="margin-top:0;">Alle Force-Zuteilungen</h2>' ;
echo '<a class="kc-btn" style="float:right;margin-bottom:12px;" href="?page=kc_force_zuteilung&new=1">+ Neue Force-Zuteilung</a>' ;
@@ -176,7 +269,7 @@ function kc_force_zuteilung_page() {
<td> " . esc_html ( $f -> kommentar ) . " </td>
<td class='kc-actions'>
<a class='kc-btn edit' href='?page=kc_force_zuteilung&edit_force= { $f -> id } '>Bearbeiten</a>
<a class='kc-btn del' href='?page=kc_force_zuteilung&delete_force= { $f -> id } ' onclick= \" return confirm('Wirklich loe schen?'); \" >Loe schen</a>
<a class='kc-btn del' href='?page=kc_force_zuteilung&delete_force= { $f -> id } ' onclick= \" return confirm('Wirklich lö schen?'); \" >lö schen</a>
</td>
</tr> " ;
}