diff --git a/README.md b/README.md index 55dce89..6bd8d5e 100755 --- a/README.md +++ b/README.md @@ -1,6 +1,12 @@ -# Handball Team Manager +

+ VereinsOS Logo +

-**Open-Source-Webanwendung zur Verwaltung von Handball-Jugendmannschaften** +

VereinsOS

+ +

+ Open-Source-Webanwendung zur Verwaltung von Handball-Jugendmannschaften +

Eine moderne, mehrsprachige Web-App für Trainer, Elternvertreter und Familien, um Termine, Spieler, Fahrgemeinschaften, Statistiken und Vereinsorganisation an einem Ort zu bündeln. Optimiert für Shared Hosting (kein SSH nötig) und als Progressive Web App (PWA) auf dem Smartphone nutzbar. diff --git a/app/Http/Controllers/Admin/SettingsController.php b/app/Http/Controllers/Admin/SettingsController.php index 7ce02b0..e08aaf3 100755 --- a/app/Http/Controllers/Admin/SettingsController.php +++ b/app/Http/Controllers/Admin/SettingsController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Models\ActivityLog; use App\Models\FileCategory; +use App\Models\Season; use App\Models\Setting; use App\Services\HtmlSanitizerService; use App\Services\SupportApiService; @@ -78,10 +79,12 @@ class SettingsController extends Controller 'from_name' => config('mail.from.name'), ]; + $seasons = Season::orderByDesc('start_date')->get(); + return view('admin.settings.edit', compact( 'settings', 'eventDefaults', 'fileCategories', 'visibilitySettings', 'isRegistered', 'installationId', 'updateInfo', - 'availableLocales', 'localeSettings', 'mailConfig' + 'availableLocales', 'localeSettings', 'mailConfig', 'seasons' )); } diff --git a/database/seeders/SettingsSeeder.php b/database/seeders/SettingsSeeder.php index 4ca9152..db78555 100755 --- a/database/seeders/SettingsSeeder.php +++ b/database/seeders/SettingsSeeder.php @@ -227,6 +227,8 @@ HTML; $visibilitySettings = [ ['key' => 'visibility_statistics_coach', 'label' => 'Statistik: Trainer', 'type' => 'number', 'value' => '1'], ['key' => 'visibility_statistics_parent_rep', 'label' => 'Statistik: Elternvertretung', 'type' => 'number', 'value' => '1'], + ['key' => 'visibility_finances_coach', 'label' => 'Finanzen: Trainer', 'type' => 'number', 'value' => '1'], + ['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'], ]; diff --git a/lang/ar/ui.php b/lang/ar/ui.php index 06fe6b3..dbe017a 100755 --- a/lang/ar/ui.php +++ b/lang/ar/ui.php @@ -100,6 +100,22 @@ return [ 'rueckraum_rechts' => 'ظي', 'kreislaeufer' => 'دو', ], + 'finance_type' => [ + 'income' => 'إيراد', + 'expense' => 'مصروف', + ], + 'finance_category' => [ + 'catering' => 'تقديم الطعام', + 'sponsoring' => 'رعاية', + 'membership' => 'رسوم العضوية', + 'tournament_fees' => 'رسوم البطولات', + 'equipment' => 'معدات', + 'transport' => 'نقل', + 'venue_rental' => 'إيجار القاعة', + 'training_material' => 'مواد التدريب', + 'events' => 'فعاليات', + 'other' => 'أخرى', + ], ], 'locales' => [ 'de' => 'Deutsch', diff --git a/lang/de/ui.php b/lang/de/ui.php index e0437d2..2b5e124 100755 --- a/lang/de/ui.php +++ b/lang/de/ui.php @@ -115,6 +115,22 @@ return [ 'rueckraum_rechts' => 'RR', 'kreislaeufer' => 'KL', ], + 'finance_type' => [ + 'income' => 'Einnahme', + 'expense' => 'Ausgabe', + ], + 'finance_category' => [ + 'catering' => 'Catering', + 'sponsoring' => 'Sponsoring', + 'membership' => 'Mitgliedsbeiträge', + 'tournament_fees' => 'Turniergebühren', + 'equipment' => 'Ausrüstung', + 'transport' => 'Transport/Fahrtkosten', + 'venue_rental' => 'Hallenmiete', + 'training_material' => 'Trainingsmaterial', + 'events' => 'Veranstaltungen', + 'other' => 'Sonstiges', + ], ], // Sprachen diff --git a/lang/en/ui.php b/lang/en/ui.php index 213e394..2370645 100755 --- a/lang/en/ui.php +++ b/lang/en/ui.php @@ -99,6 +99,22 @@ return [ 'rueckraum_rechts' => 'RB', 'kreislaeufer' => 'PV', ], + 'finance_type' => [ + 'income' => 'Income', + 'expense' => 'Expense', + ], + 'finance_category' => [ + 'catering' => 'Catering', + 'sponsoring' => 'Sponsoring', + 'membership' => 'Membership Fees', + 'tournament_fees' => 'Tournament Fees', + 'equipment' => 'Equipment', + 'transport' => 'Transport', + 'venue_rental' => 'Venue Rental', + 'training_material' => 'Training Material', + 'events' => 'Events', + 'other' => 'Other', + ], ], 'locales' => [ 'de' => 'Deutsch', diff --git a/lang/pl/ui.php b/lang/pl/ui.php index ad4ed38..eba4929 100755 --- a/lang/pl/ui.php +++ b/lang/pl/ui.php @@ -100,6 +100,22 @@ return [ 'rueckraum_rechts' => 'PR', 'kreislaeufer' => 'KO', ], + 'finance_type' => [ + 'income' => 'Przychód', + 'expense' => 'Wydatek', + ], + 'finance_category' => [ + 'catering' => 'Catering', + 'sponsoring' => 'Sponsoring', + 'membership' => 'Składki członkowskie', + 'tournament_fees' => 'Opłaty turniejowe', + 'equipment' => 'Sprzęt', + 'transport' => 'Transport', + 'venue_rental' => 'Wynajem hali', + 'training_material' => 'Materiały treningowe', + 'events' => 'Imprezy', + 'other' => 'Inne', + ], ], 'locales' => [ 'de' => 'Deutsch', diff --git a/lang/ru/ui.php b/lang/ru/ui.php index 9a31d1d..efe5c62 100755 --- a/lang/ru/ui.php +++ b/lang/ru/ui.php @@ -100,6 +100,22 @@ return [ 'rueckraum_rechts' => 'ПП', 'kreislaeufer' => 'ЛН', ], + 'finance_type' => [ + 'income' => 'Доход', + 'expense' => 'Расход', + ], + 'finance_category' => [ + 'catering' => 'Кейтеринг', + 'sponsoring' => 'Спонсорство', + 'membership' => 'Членские взносы', + 'tournament_fees' => 'Турнирные сборы', + 'equipment' => 'Оборудование', + 'transport' => 'Транспорт', + 'venue_rental' => 'Аренда зала', + 'training_material' => 'Тренировочный инвентарь', + 'events' => 'Мероприятия', + 'other' => 'Прочее', + ], ], 'locales' => [ 'de' => 'Deutsch', diff --git a/lang/tr/ui.php b/lang/tr/ui.php index 4f92bad..20ef9ec 100755 --- a/lang/tr/ui.php +++ b/lang/tr/ui.php @@ -100,6 +100,22 @@ return [ 'rueckraum_rechts' => 'SĞÇ', 'kreislaeufer' => 'PV', ], + 'finance_type' => [ + 'income' => 'Gelir', + 'expense' => 'Gider', + ], + 'finance_category' => [ + 'catering' => 'Catering', + 'sponsoring' => 'Sponsorluk', + 'membership' => 'Üyelik Aidatları', + 'tournament_fees' => 'Turnuva Ücretleri', + 'equipment' => 'Ekipman', + 'transport' => 'Ulaşım', + 'venue_rental' => 'Salon Kirası', + 'training_material' => 'Antrenman Malzemeleri', + 'events' => 'Etkinlikler', + 'other' => 'Diğer', + ], ], 'locales' => [ 'de' => 'Deutsch', diff --git a/public/images/apple-touch-icon.png b/public/images/apple-touch-icon.png index 3fa57a6..d7c001b 100644 Binary files a/public/images/apple-touch-icon.png and b/public/images/apple-touch-icon.png differ diff --git a/public/images/icon-192x192.png b/public/images/icon-192x192.png index 56290eb..515bb61 100644 Binary files a/public/images/icon-192x192.png and b/public/images/icon-192x192.png differ diff --git a/public/images/icon-512x512.png b/public/images/icon-512x512.png index 6ffc903..5dee83f 100644 Binary files a/public/images/icon-512x512.png and b/public/images/icon-512x512.png differ diff --git a/public/images/icon-maskable-192x192.png b/public/images/icon-maskable-192x192.png index 46e075f..515bb61 100644 Binary files a/public/images/icon-maskable-192x192.png and b/public/images/icon-maskable-192x192.png differ diff --git a/public/images/icon-maskable-512x512.png b/public/images/icon-maskable-512x512.png index b194f69..5dee83f 100644 Binary files a/public/images/icon-maskable-512x512.png and b/public/images/icon-maskable-512x512.png differ diff --git a/public/images/vereinos_logo.png b/public/images/vereinos_logo.png new file mode 100644 index 0000000..2bc18c2 Binary files /dev/null and b/public/images/vereinos_logo.png differ diff --git a/public/images/vereinos_logo_white.png b/public/images/vereinos_logo_white.png new file mode 100644 index 0000000..b88e685 Binary files /dev/null and b/public/images/vereinos_logo_white.png differ diff --git a/public/index.php b/public/index.php index a3e28f8..a5cf580 100755 --- a/public/index.php +++ b/public/index.php @@ -128,13 +128,16 @@ if (!file_exists($basePath . '/storage/installed')) { Installation — Systemcheck +
- Logo + VereinsOS

Installation

diff --git a/public/manifest.json b/public/manifest.json index 062f239..2bb31be 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -1,7 +1,7 @@ { - "name": "SG Wölfe Handball", - "short_name": "SG Wölfe", - "description": "Spieltermine und Teamorganisation", + "name": "VereinsOS", + "short_name": "VereinsOS", + "description": "Vereinsorganisation und Teamverwaltung", "start_url": "/dashboard", "display": "standalone", "orientation": "portrait-primary", diff --git a/public/sw.js b/public/sw.js index c44df55..4fdfceb 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1,9 +1,9 @@ // ============================================================ -// Service Worker – SG Wölfe Handball WebApp +// Service Worker – VereinsOS // Strategie: Lokale Assets cachen, HTML Network-First // ============================================================ -const CACHE_NAME = 'handball-v3'; +const CACHE_NAME = 'vereinos-v1'; const OFFLINE_URL = '/offline'; // Lokale Assets, die beim Install gecached werden @@ -14,7 +14,7 @@ const PRECACHE_ASSETS = [ '/images/icon-192x192.png', '/images/icon-512x512.png', '/manifest.json', - '/images/logo_woelfe.png' + '/images/vereinos_logo.png' ]; // ---- INSTALL ---- diff --git a/resources/views/admin/events/index.blade.php b/resources/views/admin/events/index.blade.php index 902cc84..2acca47 100755 --- a/resources/views/admin/events/index.blade.php +++ b/resources/views/admin/events/index.blade.php @@ -7,7 +7,7 @@
{{-- Filter --}} -
+ + @if ($seasons->isNotEmpty()) + + @endif
{{-- Event-Karten --}} diff --git a/resources/views/admin/list-generator/document.blade.php b/resources/views/admin/list-generator/document.blade.php index 2091770..b6277e9 100644 --- a/resources/views/admin/list-generator/document.blade.php +++ b/resources/views/admin/list-generator/document.blade.php @@ -84,7 +84,7 @@ color: #d1d5db; } .link { - color: #2563eb; + color: #4a5e7a; text-decoration: none; } diff --git a/resources/views/admin/settings/edit.blade.php b/resources/views/admin/settings/edit.blade.php index 82b871f..af484c3 100755 --- a/resources/views/admin/settings/edit.blade.php +++ b/resources/views/admin/settings/edit.blade.php @@ -31,6 +31,11 @@ {{ __('admin.settings_tab_categories') }} @if (auth()->user()->isAdmin()) + + + + + @endif + {{-- Tab: Sichtbarkeit (nur Admin) --}} @if (auth()->user()->isAdmin())
@@ -447,6 +565,7 @@ @php $features = [ 'statistics' => __('admin.visibility_feature_statistics'), + 'finances' => __('admin.visibility_feature_finances'), 'catering_history' => __('admin.visibility_feature_catering_history'), ]; $roles = [ @@ -756,10 +875,13 @@ ], init() { - const validTabs = ['general', 'mail', 'legal', 'defaults', 'categories', 'visibility', 'license', 'maintenance']; + const validTabs = ['general', 'mail', 'legal', 'defaults', 'categories', 'seasons', 'visibility', 'license', 'maintenance']; + const urlTab = new URLSearchParams(window.location.search).get('tab'); const hash = window.location.hash.replace('#', ''); const stored = sessionStorage.getItem('settings_tab'); - if (validTabs.includes(hash)) { + if (validTabs.includes(urlTab)) { + this.tab = urlTab; + } else if (validTabs.includes(hash)) { this.tab = hash; } else if (validTabs.includes(stored)) { this.tab = stored; diff --git a/resources/views/components/layouts/admin.blade.php b/resources/views/components/layouts/admin.blade.php index 5d95d22..32aab70 100755 --- a/resources/views/components/layouts/admin.blade.php +++ b/resources/views/components/layouts/admin.blade.php @@ -6,6 +6,7 @@ {{ __('ui.admin') }} - {{ $title ?? \App\Models\Setting::get('app_name', config('app.name')) }} + @include('components.tailwind-config') @php $favicon = \App\Models\Setting::get('app_favicon'); @endphp @if ($favicon) @@ -18,7 +19,7 @@ - + @stack('styles') @@ -29,7 +30,8 @@
- Logo + @php $logoApp = \App\Models\Setting::get('app_logo_app'); @endphp + Logo {{ __('ui.admin') }} {{-- Desktop nav links (ab lg sichtbar) --}} @@ -38,6 +40,9 @@ @if (\App\Models\Setting::isFeatureVisibleFor('statistics', auth()->user())) {{ __('admin.nav_statistics') }} @endif + @if (\App\Models\Setting::isFeatureVisibleFor('finances', auth()->user())) + {{ __('admin.nav_finances') }} + @endif @if (auth()->user()->isStaff()) {{ __('admin.nav_teams') }} {{ __('admin.nav_players') }} @@ -104,6 +109,9 @@ @if (\App\Models\Setting::isFeatureVisibleFor('statistics', auth()->user())) {{ __('admin.nav_statistics') }} @endif + @if (\App\Models\Setting::isFeatureVisibleFor('finances', auth()->user())) + {{ __('admin.nav_finances') }} + @endif @if (auth()->user()->isStaff()) {{ __('admin.nav_teams') }} {{ __('admin.nav_players') }} diff --git a/resources/views/components/layouts/app.blade.php b/resources/views/components/layouts/app.blade.php index 5e85824..54346a5 100755 --- a/resources/views/components/layouts/app.blade.php +++ b/resources/views/components/layouts/app.blade.php @@ -6,6 +6,7 @@ {{ $title ?? \App\Models\Setting::get('app_name', config('app.name')) }} + @include('components.tailwind-config') @php $favicon = \App\Models\Setting::get('app_favicon'); @endphp @if ($favicon) @@ -18,7 +19,7 @@ - + @stack('styles') @@ -30,7 +31,7 @@
@php $logoApp = \App\Models\Setting::get('app_logo_app'); @endphp - Logo + Logo {{ \App\Models\Setting::get('app_name', config('app.name')) }}
diff --git a/resources/views/components/tailwind-config.blade.php b/resources/views/components/tailwind-config.blade.php new file mode 100644 index 0000000..a4b4a97 --- /dev/null +++ b/resources/views/components/tailwind-config.blade.php @@ -0,0 +1,115 @@ +{{-- Zentrale Tailwind-Farbkonfiguration – VereinsOS --}} + diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php index 845fce3..d1970f6 100755 --- a/resources/views/dashboard.blade.php +++ b/resources/views/dashboard.blade.php @@ -1,5 +1,13 @@ -

{{ __('events.hello_user', ['name' => auth()->user()->name]) }}

+
+

{{ __('events.hello_user', ['name' => auth()->user()->name]) }}

+ @if (auth()->user()->isStaff()) + + + {{ __('admin.new_event') }} + + @endif +
{{-- Kalender --}}
diff --git a/resources/views/installer/steps/mail.blade.php b/resources/views/installer/steps/mail.blade.php index 392d900..d6a1bf3 100644 --- a/resources/views/installer/steps/mail.blade.php +++ b/resources/views/installer/steps/mail.blade.php @@ -119,7 +119,7 @@
diff --git a/resources/views/offline.blade.php b/resources/views/offline.blade.php index 2fe472c..e305729 100644 --- a/resources/views/offline.blade.php +++ b/resources/views/offline.blade.php @@ -3,7 +3,7 @@ - Offline – SG Wölfe Handball + Offline – VereinsOS @@ -40,7 +40,7 @@
- +

Keine Internetverbindung

Die Seite kann gerade nicht geladen werden.