Feature-Toggles, Administration, wiederkehrende Events und Event-Serien
- Administration & Rollenmanagement: Neuer Admin-Bereich mit Feature-Toggles und Sichtbarkeitseinstellungen pro Rolle (11 Toggles, 24 Visibility-Settings) - AdministrationController mit eigenem Settings-Tab, aus SettingsController extrahiert - Feature-Toggle-Guards in Controllers (Invitation, File, ListGenerator, Comment) und Views (events/show, events/edit, events/create) - Setting::isFeatureEnabled() und isFeatureVisibleFor() Hilfsmethoden - Wiederkehrende Trainings: Täglich/Wöchentlich/2-Wöchentlich mit Ende per Datum oder Anzahl (max. 52), Vorschau im Formular - Event-Serien: Verknüpfung über event_series_id (UUID), Modal-Dialog beim Speichern und Löschen mit Optionen "nur dieses" / "alle folgenden" - Löschen-Button direkt in der Event-Bearbeitung mit Serien-Dialog - DemoDataSeeder: 4 Trainings als Serie mit gemeinsamer event_series_id - Übersetzungen in allen 6 Sprachen (de, en, pl, ru, ar, tr) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -223,6 +223,30 @@ HTML;
|
||||
]);
|
||||
}
|
||||
|
||||
// Globale Feature-Toggles (Master-Schalter)
|
||||
$featureToggles = [
|
||||
['key' => 'feature_statistics', 'label' => 'Feature: Statistiken'],
|
||||
['key' => 'feature_finances', 'label' => 'Feature: Finanzen'],
|
||||
['key' => 'feature_catering', 'label' => 'Feature: Catering'],
|
||||
['key' => 'feature_timekeepers', 'label' => 'Feature: Zeitnehmer'],
|
||||
['key' => 'feature_carpools', 'label' => 'Feature: Fahrgemeinschaften'],
|
||||
['key' => 'feature_comments', 'label' => 'Feature: Kommentare'],
|
||||
['key' => 'feature_files', 'label' => 'Feature: Dateien'],
|
||||
['key' => 'feature_faqs', 'label' => 'Feature: FAQs'],
|
||||
['key' => 'feature_list_generator', 'label' => 'Feature: Listenerstellung'],
|
||||
['key' => 'feature_invitations', 'label' => 'Feature: Einladungen'],
|
||||
['key' => 'feature_player_stats', 'label' => 'Feature: Spielerstatistiken'],
|
||||
];
|
||||
|
||||
foreach ($featureToggles as $toggle) {
|
||||
$existing = Setting::where('key', $toggle['key'])->first();
|
||||
if ($existing) {
|
||||
$existing->update(['label' => $toggle['label'], 'type' => 'number']);
|
||||
} else {
|
||||
$this->createSetting(array_merge($toggle, ['type' => 'number', 'value' => '1']));
|
||||
}
|
||||
}
|
||||
|
||||
// Sichtbarkeits-Einstellungen (pro Feature pro Rolle)
|
||||
$visibilitySettings = [
|
||||
['key' => 'visibility_statistics_coach', 'label' => 'Statistik: Trainer', 'type' => 'number', 'value' => '1'],
|
||||
@@ -231,6 +255,24 @@ HTML;
|
||||
['key' => 'visibility_finances_parent_rep', 'label' => 'Finanzen: Elternvertretung', 'type' => 'number', 'value' => '1'],
|
||||
['key' => 'visibility_catering_history_coach', 'label' => 'Catering-Verlauf: Trainer', 'type' => 'number', 'value' => '1'],
|
||||
['key' => 'visibility_catering_history_parent_rep', 'label' => 'Catering-Verlauf: Elternvertretung', 'type' => 'number', 'value' => '1'],
|
||||
['key' => 'visibility_catering_coach', 'label' => 'Catering: Trainer', 'type' => 'number', 'value' => '1'],
|
||||
['key' => 'visibility_catering_parent_rep', 'label' => 'Catering: Elternvertretung', 'type' => 'number', 'value' => '1'],
|
||||
['key' => 'visibility_timekeepers_coach', 'label' => 'Zeitnehmer: Trainer', 'type' => 'number', 'value' => '1'],
|
||||
['key' => 'visibility_timekeepers_parent_rep', 'label' => 'Zeitnehmer: Elternvertretung', 'type' => 'number', 'value' => '1'],
|
||||
['key' => 'visibility_carpools_coach', 'label' => 'Fahrgemeinschaften: Trainer', 'type' => 'number', 'value' => '1'],
|
||||
['key' => 'visibility_carpools_parent_rep', 'label' => 'Fahrgemeinschaften: Elternvertretung', 'type' => 'number', 'value' => '1'],
|
||||
['key' => 'visibility_comments_coach', 'label' => 'Kommentare: Trainer', 'type' => 'number', 'value' => '1'],
|
||||
['key' => 'visibility_comments_parent_rep', 'label' => 'Kommentare: Elternvertretung', 'type' => 'number', 'value' => '1'],
|
||||
['key' => 'visibility_files_coach', 'label' => 'Dateien: Trainer', 'type' => 'number', 'value' => '1'],
|
||||
['key' => 'visibility_files_parent_rep', 'label' => 'Dateien: Elternvertretung', 'type' => 'number', 'value' => '1'],
|
||||
['key' => 'visibility_faqs_coach', 'label' => 'FAQs: Trainer', 'type' => 'number', 'value' => '1'],
|
||||
['key' => 'visibility_faqs_parent_rep', 'label' => 'FAQs: Elternvertretung', 'type' => 'number', 'value' => '1'],
|
||||
['key' => 'visibility_list_generator_coach', 'label' => 'Listenerstellung: Trainer', 'type' => 'number', 'value' => '1'],
|
||||
['key' => 'visibility_list_generator_parent_rep', 'label' => 'Listenerstellung: Elternvertretung', 'type' => 'number', 'value' => '1'],
|
||||
['key' => 'visibility_invitations_coach', 'label' => 'Einladungen: Trainer', 'type' => 'number', 'value' => '1'],
|
||||
['key' => 'visibility_invitations_parent_rep', 'label' => 'Einladungen: Elternvertretung', 'type' => 'number', 'value' => '1'],
|
||||
['key' => 'visibility_player_stats_coach', 'label' => 'Spielerstatistiken: Trainer', 'type' => 'number', 'value' => '1'],
|
||||
['key' => 'visibility_player_stats_parent_rep', 'label' => 'Spielerstatistiken: Elternvertretung', 'type' => 'number', 'value' => '1'],
|
||||
];
|
||||
|
||||
foreach ($visibilitySettings as $setting) {
|
||||
|
||||
Reference in New Issue
Block a user