Sync: Inhalte aus origin/main in develop übernommen; .gitea und .github unverändert belassen (falls vorhanden).
All checks were successful
Deploy Workshop-Wahlen (DEV / PROD) / deploy (push) Successful in 13s

This commit is contained in:
ProgrammGamer
2026-01-30 21:30:23 +01:00
parent 64546f3b62
commit 7fc12ba7bb
5 changed files with 84 additions and 99 deletions

View File

@@ -1,4 +1,4 @@
# Workshop-Wahlen Entwickler-Übersicht # Workshop-Wahlen
## Überblick ## Überblick

View File

@@ -14,10 +14,8 @@ function kc_teamer_page() {
delete_option('kc_teamer_password_hash'); delete_option('kc_teamer_password_hash');
echo '<div class="notice notice-success">Teamer-Passwort entfernt.</div>'; echo '<div class="notice notice-success">Teamer-Passwort entfernt.</div>';
} else { } else {
// Sichere Speicherung mit password_hash update_option('kc_teamer_password_hash', wp_hash_password($pw));
$hash = password_hash($pw, PASSWORD_DEFAULT); echo '<div class="notice notice-success">Teamer-Passwort gespeichert.</div>';
update_option('kc_teamer_password_hash', $hash);
echo '<div class="notice notice-success">Teamer-Passwort gespeichert.</div>';
} }
} }
} }

View File

@@ -309,7 +309,7 @@ function kc_teilnehmer_page() {
echo '</details>'; echo '</details>';
} }
// JS für Wahl- und Phasen-Filter // JS für Wahl- und Phasen-Filter
// CSS moved to admin-teilnehmer.css echo '<style>.kc-wahl-filter-btn.active{background:#4CAF50;color:#fff;} .kc-phase-filter-btn.active{background:#1976d2;color:#fff;}</style>';
echo '<script> echo '<script>
(function() { (function() {
var btns = Array.prototype.slice.call(document.querySelectorAll(".kc-wahl-filter-btn")); var btns = Array.prototype.slice.call(document.querySelectorAll(".kc-wahl-filter-btn"));

View File

@@ -8,12 +8,12 @@ function kc_install_tables() {
global $wpdb; global $wpdb;
$prefix = $wpdb->prefix; $prefix = $wpdb->prefix;
$charset_collate = $wpdb->get_charset_collate(); $charset_collate = $wpdb->get_charset_collate();
require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
// --- Tabellen-Definitionen --- // Tables definitions
$tables_sql = []; $tables_sql = [];
// Wahl-Tabelle
$tables_sql[] = "CREATE TABLE {$prefix}kc_wahlen ( $tables_sql[] = "CREATE TABLE {$prefix}kc_wahlen (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT, id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
name varchar(191) NOT NULL, name varchar(191) NOT NULL,
@@ -26,7 +26,6 @@ function kc_install_tables() {
PRIMARY KEY (id) PRIMARY KEY (id)
) $charset_collate"; ) $charset_collate";
// Workshop-Tabelle
$tables_sql[] = "CREATE TABLE {$prefix}kc_workshops ( $tables_sql[] = "CREATE TABLE {$prefix}kc_workshops (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT, id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
name varchar(191) NOT NULL, name varchar(191) NOT NULL,
@@ -36,7 +35,6 @@ function kc_install_tables() {
PRIMARY KEY (id) PRIMARY KEY (id)
) $charset_collate"; ) $charset_collate";
// Teamer-Tabelle
$tables_sql[] = "CREATE TABLE {$prefix}kc_teamer ( $tables_sql[] = "CREATE TABLE {$prefix}kc_teamer (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT, id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
vorname varchar(191) DEFAULT NULL, vorname varchar(191) DEFAULT NULL,
@@ -44,7 +42,6 @@ function kc_install_tables() {
PRIMARY KEY (id) PRIMARY KEY (id)
) $charset_collate"; ) $charset_collate";
// Teilnehmer-Tabelle
$tables_sql[] = "CREATE TABLE {$prefix}kc_teilnehmer ( $tables_sql[] = "CREATE TABLE {$prefix}kc_teilnehmer (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT, id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
vorname varchar(191) DEFAULT NULL, vorname varchar(191) DEFAULT NULL,
@@ -54,11 +51,10 @@ function kc_install_tables() {
wunsch1 bigint(20) unsigned DEFAULT NULL, wunsch1 bigint(20) unsigned DEFAULT NULL,
wunsch2 bigint(20) unsigned DEFAULT NULL, wunsch2 bigint(20) unsigned DEFAULT NULL,
wunsch3 bigint(20) unsigned DEFAULT NULL, wunsch3 bigint(20) unsigned DEFAULT NULL,
deleted tinyint(1) NOT NULL DEFAULT 0, deleted tinyint(1) NOT NULL DEFAULT 0,
PRIMARY KEY (id) PRIMARY KEY (id)
) $charset_collate"; ) $charset_collate";
// Zuordnungstabelle Wahl <-> Workshops
$tables_sql[] = "CREATE TABLE {$prefix}kc_wahl_workshops ( $tables_sql[] = "CREATE TABLE {$prefix}kc_wahl_workshops (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT, id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
wahl_id bigint(20) unsigned NOT NULL DEFAULT 0, wahl_id bigint(20) unsigned NOT NULL DEFAULT 0,
@@ -67,7 +63,6 @@ function kc_install_tables() {
PRIMARY KEY (id) PRIMARY KEY (id)
) $charset_collate"; ) $charset_collate";
// Manuelle (Force-)Zuteilungen
$tables_sql[] = "CREATE TABLE {$prefix}kc_force_zuteilung ( $tables_sql[] = "CREATE TABLE {$prefix}kc_force_zuteilung (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT, id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
teilnehmer_id bigint(20) unsigned NOT NULL DEFAULT 0, teilnehmer_id bigint(20) unsigned NOT NULL DEFAULT 0,
@@ -78,7 +73,6 @@ function kc_install_tables() {
PRIMARY KEY (id) PRIMARY KEY (id)
) $charset_collate"; ) $charset_collate";
// Ergebnis-Zuteilungen
$tables_sql[] = "CREATE TABLE {$prefix}kc_zuteilung ( $tables_sql[] = "CREATE TABLE {$prefix}kc_zuteilung (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT, id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
teilnehmer_id bigint(20) unsigned NOT NULL DEFAULT 0, teilnehmer_id bigint(20) unsigned NOT NULL DEFAULT 0,
@@ -90,27 +84,26 @@ function kc_install_tables() {
wunsch_rang tinyint DEFAULT NULL, wunsch_rang tinyint DEFAULT NULL,
PRIMARY KEY (id) PRIMARY KEY (id)
) $charset_collate"; ) $charset_collate";
$tables_sql[] = "CREATE TABLE {$prefix}kc_workshop_teamer (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
workshop_id bigint(20) unsigned DEFAULT NULL,
teamer_id bigint(20) unsigned DEFAULT NULL,
PRIMARY KEY (id)
) $charset_collate";
// Zuordnung Workshop <-> Teamer
$tables_sql[] = "CREATE TABLE {$prefix}kc_workshop_teamer (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
workshop_id bigint(20) unsigned DEFAULT NULL,
teamer_id bigint(20) unsigned DEFAULT NULL,
PRIMARY KEY (id)
) $charset_collate";
// Tabellen anlegen
foreach ($tables_sql as $sql) { foreach ($tables_sql as $sql) {
dbDelta($sql); dbDelta($sql);
} }
// Migration: min_teilnehmer nachziehen, falls bei Update nötig // Post-creation migration guard: ensure min_teilnehmer exists for older installs
$col = $wpdb->get_var($wpdb->prepare("SHOW COLUMNS FROM {$prefix}kc_workshops LIKE %s", 'min_teilnehmer')); $col = $wpdb->get_var($wpdb->prepare("SHOW COLUMNS FROM {$prefix}kc_workshops LIKE %s", 'min_teilnehmer'));
if (empty($col)) { if (empty($col)) {
// try to add the column (no-op on newer installs)
$wpdb->query("ALTER TABLE {$prefix}kc_workshops ADD COLUMN min_teilnehmer INT NOT NULL DEFAULT 0"); $wpdb->query("ALTER TABLE {$prefix}kc_workshops ADD COLUMN min_teilnehmer INT NOT NULL DEFAULT 0");
} }
// Plugin-Version speichern // Optionally store plugin version
add_option('kc_workshopwahl_db_version', '1.0'); add_option('kc_workshopwahl_db_version', '1.0');
} }

View File

@@ -1,74 +1,68 @@
<?php <?php
/** /**
* Plugin Name: Workshop-Wahlen * Plugin Name: Workshop-Wahlen
* Description: Workshop-Wahl-System für Konfi-Castle.com * Description: Workshop-Wahl-System für Konfi-Castle.com
* Version: 1.1 - dev * Version: 1.0
* Author: Linus Maximilian Nilson * Author: Linus Maximilian Nilson
*/ */
if (!defined('ABSPATH')) exit;
if (!defined('ABSPATH')) exit;
// Stylesheet einbinden
// Stylesheet einbinden add_action('admin_enqueue_scripts', function($hook) {
// Nur auf den Plugin-Seiten laden (optional: prüfe $hook!)
add_action('admin_enqueue_scripts', function($hook) { if (strpos($hook, 'kc_') !== false) {
// Nur auf den Plugin-Seiten laden (optional: prüfe $hook!) wp_enqueue_style(
if (strpos($hook, 'kc_') !== false) { 'kc-admin-style',
wp_enqueue_style( plugin_dir_url(__FILE__) . 'assets/kc-admin-style.css',
'kc-admin-style', [],
plugin_dir_url(__FILE__) . 'assets/kc-admin.css', filemtime(plugin_dir_path(__FILE__) . 'assets/kc-admin-style.css')
[], );
filemtime(plugin_dir_path(__FILE__) . 'assets/kc-admin.css') }
); });
}
});
add_action('admin_enqueue_scripts', function($hook) {
// Nur für unser Plugin-Menü!
add_action('admin_enqueue_scripts', function($hook) { if (strpos($hook, 'kc_') === false) return;
// Nur für unser Plugin-Menü! wp_enqueue_script('select2', 'https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js', ['jquery'], null, true);
if (strpos($hook, 'kc_') === false) return; wp_enqueue_style('select2', 'https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css');
wp_enqueue_script('select2', 'https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js', ['jquery'], null, true); });
wp_enqueue_style('select2', 'https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css');
});
add_action('wp_enqueue_scripts', function() {
wp_enqueue_style('kc-workshopwahl-form', plugins_url('assets/frontend-form.css', __FILE__));
});
add_action('wp_enqueue_scripts', function() { // Zentrale Admin-Menüstruktur
wp_enqueue_style('kc-workshopwahl-frontend', plugins_url('assets/frontend.css', __FILE__)); add_action('admin_menu', function() {
}); add_menu_page('Wahlen', 'Wahlen', 'manage_options', 'kc_wahlen', 'kc_wahlen_page');
add_submenu_page('kc_wahlen', 'Teamer', 'Teamer', 'manage_options', 'kc_teamer', 'kc_teamer_page');
// Zentrale Admin-Menüstruktur add_submenu_page('kc_wahlen', 'Workshops', 'Workshops', 'manage_options', 'kc_workshops', 'kc_workshops_page');
add_action('admin_menu', function() {
add_menu_page('Wahlen', 'Wahlen', 'manage_options', 'kc_wahlen', 'kc_wahlen_page'); add_submenu_page('kc_wahlen', 'Teilnehmer', 'Teilnehmer', 'manage_options', 'kc_teilnehmer', 'kc_teilnehmer_page');
add_submenu_page('kc_wahlen', 'Teamer', 'Teamer', 'manage_options', 'kc_teamer', 'kc_teamer_page'); add_submenu_page('kc_wahlen', 'Force-Zuteilung', 'Force-Zuteilung', 'manage_options', 'kc_force_zuteilung', 'kc_force_zuteilung_page');
add_submenu_page('kc_wahlen', 'Workshops', 'Workshops', 'manage_options', 'kc_workshops', 'kc_workshops_page'); add_submenu_page('kc_wahlen', 'Zuteilungen', 'Zuteilungen', 'manage_options', 'kc_zuteilungen', 'kc_zuteilungen_page');
add_submenu_page('kc_wahlen', 'Teilnehmer', 'Teilnehmer', 'manage_options', 'kc_teilnehmer', 'kc_teilnehmer_page'); // Data management (test data) - visible only to super-admin (we'll check inside page)
add_submenu_page('kc_wahlen', 'Datenverwaltung', 'Datenverwaltung', 'manage_options', 'kc_data', 'kc_data_page');
add_submenu_page('kc_wahlen', 'Force-Zuteilung', 'Force-Zuteilung', 'manage_options', 'kc_force_zuteilung', 'kc_force_zuteilung_page');
});
add_submenu_page('kc_wahlen', 'Zuteilungen', 'Zuteilungen', 'manage_options', 'kc_zuteilungen', 'kc_zuteilungen_page');
// Includes  jede Admin-Seite ruft oben kc_admin_tabs() auf!
// Data management (test data) - visible only to super-admin (we'll check inside page) require_once plugin_dir_path(__FILE__).'includes/admin-wahlen.php';
add_submenu_page('kc_wahlen', 'Datenverwaltung', 'Datenverwaltung', 'manage_options', 'kc_data', 'kc_data_page'); require_once plugin_dir_path(__FILE__).'includes/admin-workshops.php';
require_once plugin_dir_path(__FILE__).'includes/admin-teilnehmer.php';
}); require_once plugin_dir_path(__FILE__).'includes/admin-teamer.php';
require_once plugin_dir_path(__FILE__).'includes/force-zuteilung.php';
// Includes  jede Admin-Seite ruft oben kc_admin_tabs() auf! require_once plugin_dir_path(__FILE__).'includes/admin-zuteilungen.php';
require_once plugin_dir_path(__FILE__).'includes/admin-wahlen.php'; require_once plugin_dir_path(__FILE__).'includes/frontend-form.php';
require_once plugin_dir_path(__FILE__).'includes/admin-workshops.php'; require_once plugin_dir_path(__FILE__).'includes/frontend-ergebnis.php';
require_once plugin_dir_path(__FILE__).'includes/admin-teilnehmer.php'; require_once plugin_dir_path(__FILE__).'includes/zuteilungslogik.php';
require_once plugin_dir_path(__FILE__).'includes/admin-teamer.php'; require_once plugin_dir_path(__FILE__).'includes/admin-data.php';
require_once plugin_dir_path(__FILE__).'includes/force-zuteilung.php';
require_once plugin_dir_path(__FILE__).'includes/admin-zuteilungen.php';
require_once plugin_dir_path(__FILE__).'includes/frontend-form.php';
require_once plugin_dir_path(__FILE__).'includes/frontend-ergebnis.php';
require_once plugin_dir_path(__FILE__).'includes/zuteilungslogik.php';
require_once plugin_dir_path(__FILE__).'includes/admin-data.php';
require_once plugin_dir_path(__FILE__).'install.php'; require_once plugin_dir_path(__FILE__).'install.php';