payment plans wip

This commit is contained in:
salam committed 2025-09-28 09:11:26 +02:00
1 parent 3a74e45a3a
commit 61594777d7
15 files changed
+560 -158

No files matched your search

+2 -2
View File
@@ -4,9 +4,9 @@ APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
APP_LOCALE=en
APP_LOCALE=de
APP_FALLBACK_LOCALE=en
APP_FAKER_LOCALE=en_US
APP_FAKER_LOCALE=de_AT
APP_MAINTENANCE_DRIVER=file
# APP_MAINTENANCE_STORE=database
+8 -12
View File
@@ -8,34 +8,30 @@ use Filament\Support\Contracts\HasLabel;
enum ProjektStatus: string implements HasColor, HasIcon, HasLabel
{
case TEST = 'test';
case ENTWURF = 'entwurf';
case ENFASSUNG = 'endfassung';
case Entwurf = 'entwurf';
case Endfassung = 'endfassung';
public function getLabel(): ?string
{
return match ($this) {
self::TEST => 'Test',
self::ENTWURF => 'Entwurf',
self::ENFASSUNG => 'Endfassung',
self::Entwurf => 'Entwurf',
self::Endfassung => 'Endfassung',
};
}
public function getColor(): string|array|null
{
return match ($this) {
self::TEST => 'gray',
self::ENTWURF => 'primary',
self::ENFASSUNG => 'success',
self::Entwurf => 'primary',
self::Endfassung => 'success',
};
}
public function getIcon(): ?string
{
return match ($this) {
self::TEST => 'lucide-file-cog',
self::ENTWURF => 'lucide-file-pen',
self::ENFASSUNG => 'lucide-file-check',
self::Entwurf => 'lucide-file-pen',
self::Endfassung => 'lucide-file-check',
};
}
}
+60
View File
@@ -0,0 +1,60 @@
<?php
namespace App\Enums;
use Filament\Support\Contracts\HasDescription;
use Filament\Support\Contracts\HasIcon;
use Filament\Support\Contracts\HasLabel;
use ToneGabes\BetterOptions\Contracts\HasExtraText;
enum Zahlungen: string implements HasDescription, HasExtraText, HasIcon, HasLabel
{
case gutachten = 'gutachten';
case monat = 'monat';
case jahr = 'jahr';
public function getIcon(): string
{
return match ($this) {
self::gutachten => 'licude-credit-card',
self::monat => 'licude-credit-card',
self::jahr => 'licude-credit-card',
};
}
public function getLabel(): ?string
{
return match ($this) {
self::gutachten => 'Zahlung pro Gutachten',
self::monat => 'Zahlung Monatlich',
self::jahr => 'Zahlung Jährlich',
};
}
public function getExtraText(): string
{
return match ($this) {
self::gutachten => 'Zahlung pro Gutachten',
self::monat => 'Zahlung Monatlich',
self::jahr => 'Zahlung Jährlich',
};
}
public function getDescription(): ?string
{
return match ($this) {
self::gutachten => 'Zahlungen können für jedes Gutachten einzeln getätigt werden',
self::monat => 'Zahlung erfolgt monatlich, ohne Begrenzung für die erstellten Gutachten',
self::jahr => 'Zahlung erfolgt jährlich, ohne Begrenzung für die erstellten Gutachten, Gutachter oder Auftraggeber',
};
}
public function getIcons(): ?string
{
return match ($this) {
self::gutachten => 'licude-battery-low',
self::monat => 'licude-battery-medium',
self::jahr => 'licude-battery-full',
};
}
}
+1 -1
View File
@@ -148,7 +148,7 @@ class Register extends BaseRegister
size="sm"
wire:submit="register"
>
Register
Registrieren
</x-filament::button>
BLADE))),
@@ -5,8 +5,12 @@ namespace App\Filament\Resources\Kontos\Schemas;
use App\Models\Konto;
use Danielebarbaro\LaravelVatEuValidator\Rules\VatNumber;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;
use ToneGabes\BetterOptions\Forms\Components\RadioCards;
use ToneGabes\Filament\Icons\Enums\Phosphor;
use Ysfkaya\FilamentPhoneInput\Forms\PhoneInput;
class KontoForm
@@ -15,47 +19,68 @@ class KontoForm
{
return $schema
->components([
TextInput::make('company')
->label('Firma')
->required(),
TextInput::make('email')
->label('E-Mail')
->unique(table: Konto::class)
->required(),
TextInput::make('address')
->label('Adresse')
->required(),
TextInput::make('location')
->label('Ort')
->required(),
TextInput::make('plz')
->label('Postleitzahl')
->required(),
PhoneInput::make('phone')
->label('Telefon')
->defaultCountry('AT'),
TextInput::make('country')
->label('Land')
->default('Österreich')
->required(),
TextInput::make('uid_number')
->label('UID Nummer')
->rules([new VatNumber])
->required(),
TextInput::make('title')
->label('Title')
->required(),
Select::make('gender')
->label('Geschlecht')
RadioCards::make('plan_id')
->label('Zahlungsplan')
->columns(3)
->options([
'Herr' => 'Herr',
'Frau' => 'Frau',
'Non-binary' => 'Non-binary',
1 => 'Einsteiger ',
2 => 'Gelegentlich',
3 => 'Viel in Verwendung',
])
->required(),
TextInput::make('name')
->label('Name')
->required(),
->descriptions([
1 => 'Bezahlung bei der Erstellung eines Gutachtens.',
2 => 'Zahlung Monatlich ohne Begrenzung der Gutachten.',
3 => 'Zahlung Jährlich, ohne Begrenzung der Mitarbeiter, Gutachter und Auftraggeber.',
])
->icons([
1 => Phosphor::Airplane->thin(),
2 => Phosphor::AirplaneTakeoff->thin(),
3 => Phosphor::AirplaneInFlight->thin(),
])->columnSpanFull(),
Section::make('Firma')
->inlineLabel()
->schema([
TextInput::make('company')
->label('Firma')
->required(),
TextInput::make('uid_number')
->label('UID Nummer')
->rules([new VatNumber])
->required(),
Textarea::make('address')
->label('Adresse')
->required(),
TextInput::make('country')
->label('Land')
->default('Österreich')
->required(),
])->columnSpanFull(),
Section::make('Kontaktperson')
->inlineLabel()
->schema([
TextInput::make('title')
->label('Title')
->required(),
Select::make('gender')
->label('Geschlecht')
->options([
'Herr' => 'Herr',
'Frau' => 'Frau',
'Non-binary' => 'Non-binary',
])
->required(),
TextInput::make('name')
->label('Name')
->required(),
TextInput::make('email')
->label('E-Mail')
->unique(table: Konto::class)
->required(),
PhoneInput::make('phone')
->label('Telefon')
->defaultCountry('AT'),
])->columnSpanFull(),
]);
}
}
@@ -8,12 +8,8 @@ use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\TextInput;
use Filament\Support\Enums\FontWeight;
use Filament\Support\Enums\TextSize;
use Filament\Support\Icons\Heroicon;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Illuminate\Support\Facades\Mail;
use Ysfkaya\FilamentPhoneInput\PhoneInputNumberType;
use Ysfkaya\FilamentPhoneInput\Tables\PhoneColumn;
class KontosTable
{
@@ -21,30 +17,12 @@ class KontosTable
{
return $table
->columns([
// TextColumn::make('id'),
// TextColumn::make('gender')->label('Geschlecht'),
// TextColumn::make('title')->label('Title'),
// TextColumn::make('first_name')->label('Vorname'),
// PhoneColumn::make('phone')
// ->label('Telefon')
// ->displayFormat(PhoneInputNumberType::INTERNATIONAL),
// TextColumn::make('email')
// ->copyable()
// ->copyMessage('E-Mail wurde kopiert')
// ->copyMessageDuration(1500)
// ->label('E-mail'),
TextColumn::make('company')->label('Firma')
->description(fn ($record): string => $record->address),
TextColumn::make('plan.name')
->icon(Heroicon::CurrencyEuro)
// ->iconColor('success')
// ->badge()
->label('Plan')
->description(fn ($record): string => $record->plan->payment)
->wrap(),
->label('Zahlungs Plan')
->description(fn ($record): string => $record->plan->payment),
TextColumn::make('guthaben')
->size(TextSize::Large)
@@ -63,11 +41,9 @@ class KontosTable
])
->recordActions([
EditAction::make()->label(''),
EditAction::make(),
Action::make('Laden')
->label('')
->icon('heroicon-o-credit-card')
->color('danger')
->schema([
TextInput::make('subject')->required(),
RichEditor::make('body')->required(),
+1
View File
@@ -21,6 +21,7 @@
"mallardduck/blade-lucide-icons": "^1.23",
"spatie/laravel-login-link": "^1.6",
"swisnl/filament-backgrounds": "^2.0",
"tonegabes/filament-better-options": "^1.2",
"ysfkaya/filament-phone-input": "^4.0"
},
"require-dev": {
Generated
+268 -68
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "e843dbb981a84e2803fa4c750466dd27",
"content-hash": "295b192545f1bb63f1c99e66b0c6d815",
"packages": [
{
"name": "agencetwogether/hookshelper",
@@ -828,6 +828,77 @@
],
"time": "2024-07-16T11:13:48+00:00"
},
{
"name": "codeat3/blade-phosphor-icons",
"version": "2.3.0",
"source": {
"type": "git",
"url": "https://github.com/codeat3/blade-phosphor-icons.git",
"reference": "2812a27ec642359344429d344c7f7bbdfad489ce"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/codeat3/blade-phosphor-icons/zipball/2812a27ec642359344429d344c7f7bbdfad489ce",
"reference": "2812a27ec642359344429d344c7f7bbdfad489ce",
"shasum": ""
},
"require": {
"blade-ui-kit/blade-icons": "^1.1",
"illuminate/support": "^8.0|^9.0|^10.0|^11.0|^12.0",
"php": "^7.4|^8.0"
},
"require-dev": {
"codeat3/blade-icon-generation-helpers": "^0.10",
"codeat3/phpcs-styles": "^1.0",
"orchestra/testbench": "^6.0|^7.0|^8.0|^9.0|^10.0",
"phpunit/phpunit": "^9.0|^10.5|^11.0"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Codeat3\\BladePhosphorIcons\\BladePhosphorIconsServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Codeat3\\BladePhosphorIcons\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Swapnil Sarwe",
"homepage": "https://swapnilsarwe.com"
},
{
"name": "Dries Vints",
"homepage": "https://driesvints.com"
}
],
"description": "A package to easily make use of \"Phosphor Icons\" in your Laravel Blade views.",
"homepage": "https://github.com/codeat3/blade-phosphor-icons",
"keywords": [
"blade",
"laravel",
"phosphor-icons"
],
"support": {
"issues": "https://github.com/codeat3/blade-phosphor-icons/issues",
"source": "https://github.com/codeat3/blade-phosphor-icons/tree/2.3.0"
},
"funding": [
{
"url": "https://github.com/swapnilsarwe",
"type": "github"
}
],
"time": "2025-02-25T06:29:09+00:00"
},
{
"name": "danharrin/date-format-converter",
"version": "v0.3.1",
@@ -6251,16 +6322,16 @@
},
{
"name": "symfony/console",
"version": "v7.3.3",
"version": "v7.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7"
"reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7",
"reference": "cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7",
"url": "https://api.github.com/repos/symfony/console/zipball/2b9c5fafbac0399a20a2e82429e2bd735dcfb7db",
"reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db",
"shasum": ""
},
"require": {
@@ -6325,7 +6396,7 @@
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v7.3.3"
"source": "https://github.com/symfony/console/tree/v7.3.4"
},
"funding": [
{
@@ -6345,7 +6416,7 @@
"type": "tidelift"
}
],
"time": "2025-08-25T06:35:40+00:00"
"time": "2025-09-22T15:31:00+00:00"
},
{
"name": "symfony/css-selector",
@@ -6481,16 +6552,16 @@
},
{
"name": "symfony/error-handler",
"version": "v7.3.2",
"version": "v7.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/error-handler.git",
"reference": "0b31a944fcd8759ae294da4d2808cbc53aebd0c3"
"reference": "99f81bc944ab8e5dae4f21b4ca9972698bbad0e4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/error-handler/zipball/0b31a944fcd8759ae294da4d2808cbc53aebd0c3",
"reference": "0b31a944fcd8759ae294da4d2808cbc53aebd0c3",
"url": "https://api.github.com/repos/symfony/error-handler/zipball/99f81bc944ab8e5dae4f21b4ca9972698bbad0e4",
"reference": "99f81bc944ab8e5dae4f21b4ca9972698bbad0e4",
"shasum": ""
},
"require": {
@@ -6538,7 +6609,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/error-handler/tree/v7.3.2"
"source": "https://github.com/symfony/error-handler/tree/v7.3.4"
},
"funding": [
{
@@ -6558,7 +6629,7 @@
"type": "tidelift"
}
],
"time": "2025-07-07T08:17:57+00:00"
"time": "2025-09-11T10:12:26+00:00"
},
{
"name": "symfony/event-dispatcher",
@@ -6863,16 +6934,16 @@
},
{
"name": "symfony/http-foundation",
"version": "v7.3.3",
"version": "v7.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
"reference": "7475561ec27020196c49bb7c4f178d33d7d3dc00"
"reference": "c061c7c18918b1b64268771aad04b40be41dd2e6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/7475561ec27020196c49bb7c4f178d33d7d3dc00",
"reference": "7475561ec27020196c49bb7c4f178d33d7d3dc00",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/c061c7c18918b1b64268771aad04b40be41dd2e6",
"reference": "c061c7c18918b1b64268771aad04b40be41dd2e6",
"shasum": ""
},
"require": {
@@ -6922,7 +6993,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/http-foundation/tree/v7.3.3"
"source": "https://github.com/symfony/http-foundation/tree/v7.3.4"
},
"funding": [
{
@@ -6942,20 +7013,20 @@
"type": "tidelift"
}
],
"time": "2025-08-20T08:04:18+00:00"
"time": "2025-09-16T08:38:17+00:00"
},
{
"name": "symfony/http-kernel",
"version": "v7.3.3",
"version": "v7.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
"reference": "72c304de37e1a1cec6d5d12b81187ebd4850a17b"
"reference": "b796dffea7821f035047235e076b60ca2446e3cf"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/72c304de37e1a1cec6d5d12b81187ebd4850a17b",
"reference": "72c304de37e1a1cec6d5d12b81187ebd4850a17b",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/b796dffea7821f035047235e076b60ca2446e3cf",
"reference": "b796dffea7821f035047235e076b60ca2446e3cf",
"shasum": ""
},
"require": {
@@ -7040,7 +7111,7 @@
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/http-kernel/tree/v7.3.3"
"source": "https://github.com/symfony/http-kernel/tree/v7.3.4"
},
"funding": [
{
@@ -7060,20 +7131,20 @@
"type": "tidelift"
}
],
"time": "2025-08-29T08:23:45+00:00"
"time": "2025-09-27T12:32:17+00:00"
},
{
"name": "symfony/mailer",
"version": "v7.3.3",
"version": "v7.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/mailer.git",
"reference": "a32f3f45f1990db8c4341d5122a7d3a381c7e575"
"reference": "ab97ef2f7acf0216955f5845484235113047a31d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/mailer/zipball/a32f3f45f1990db8c4341d5122a7d3a381c7e575",
"reference": "a32f3f45f1990db8c4341d5122a7d3a381c7e575",
"url": "https://api.github.com/repos/symfony/mailer/zipball/ab97ef2f7acf0216955f5845484235113047a31d",
"reference": "ab97ef2f7acf0216955f5845484235113047a31d",
"shasum": ""
},
"require": {
@@ -7124,7 +7195,7 @@
"description": "Helps sending emails",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/mailer/tree/v7.3.3"
"source": "https://github.com/symfony/mailer/tree/v7.3.4"
},
"funding": [
{
@@ -7144,20 +7215,20 @@
"type": "tidelift"
}
],
"time": "2025-08-13T11:49:31+00:00"
"time": "2025-09-17T05:51:54+00:00"
},
{
"name": "symfony/mime",
"version": "v7.3.2",
"version": "v7.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/mime.git",
"reference": "e0a0f859148daf1edf6c60b398eb40bfc96697d1"
"reference": "b1b828f69cbaf887fa835a091869e55df91d0e35"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/mime/zipball/e0a0f859148daf1edf6c60b398eb40bfc96697d1",
"reference": "e0a0f859148daf1edf6c60b398eb40bfc96697d1",
"url": "https://api.github.com/repos/symfony/mime/zipball/b1b828f69cbaf887fa835a091869e55df91d0e35",
"reference": "b1b828f69cbaf887fa835a091869e55df91d0e35",
"shasum": ""
},
"require": {
@@ -7212,7 +7283,7 @@
"mime-type"
],
"support": {
"source": "https://github.com/symfony/mime/tree/v7.3.2"
"source": "https://github.com/symfony/mime/tree/v7.3.4"
},
"funding": [
{
@@ -7232,7 +7303,7 @@
"type": "tidelift"
}
],
"time": "2025-07-15T13:41:35+00:00"
"time": "2025-09-16T08:38:17+00:00"
},
{
"name": "symfony/polyfill-ctype",
@@ -8065,16 +8136,16 @@
},
{
"name": "symfony/process",
"version": "v7.3.3",
"version": "v7.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
"reference": "32241012d521e2e8a9d713adb0812bb773b907f1"
"reference": "f24f8f316367b30810810d4eb30c543d7003ff3b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/process/zipball/32241012d521e2e8a9d713adb0812bb773b907f1",
"reference": "32241012d521e2e8a9d713adb0812bb773b907f1",
"url": "https://api.github.com/repos/symfony/process/zipball/f24f8f316367b30810810d4eb30c543d7003ff3b",
"reference": "f24f8f316367b30810810d4eb30c543d7003ff3b",
"shasum": ""
},
"require": {
@@ -8106,7 +8177,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/process/tree/v7.3.3"
"source": "https://github.com/symfony/process/tree/v7.3.4"
},
"funding": [
{
@@ -8126,20 +8197,20 @@
"type": "tidelift"
}
],
"time": "2025-08-18T09:42:54+00:00"
"time": "2025-09-11T10:12:26+00:00"
},
{
"name": "symfony/routing",
"version": "v7.3.2",
"version": "v7.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/routing.git",
"reference": "7614b8ca5fa89b9cd233e21b627bfc5774f586e4"
"reference": "8dc648e159e9bac02b703b9fbd937f19ba13d07c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/routing/zipball/7614b8ca5fa89b9cd233e21b627bfc5774f586e4",
"reference": "7614b8ca5fa89b9cd233e21b627bfc5774f586e4",
"url": "https://api.github.com/repos/symfony/routing/zipball/8dc648e159e9bac02b703b9fbd937f19ba13d07c",
"reference": "8dc648e159e9bac02b703b9fbd937f19ba13d07c",
"shasum": ""
},
"require": {
@@ -8191,7 +8262,7 @@
"url"
],
"support": {
"source": "https://github.com/symfony/routing/tree/v7.3.2"
"source": "https://github.com/symfony/routing/tree/v7.3.4"
},
"funding": [
{
@@ -8211,7 +8282,7 @@
"type": "tidelift"
}
],
"time": "2025-07-15T11:36:08+00:00"
"time": "2025-09-11T10:12:26+00:00"
},
{
"name": "symfony/service-contracts",
@@ -8298,16 +8369,16 @@
},
{
"name": "symfony/string",
"version": "v7.3.3",
"version": "v7.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
"reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c"
"reference": "f96476035142921000338bad71e5247fbc138872"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/17a426cce5fd1f0901fefa9b2a490d0038fd3c9c",
"reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c",
"url": "https://api.github.com/repos/symfony/string/zipball/f96476035142921000338bad71e5247fbc138872",
"reference": "f96476035142921000338bad71e5247fbc138872",
"shasum": ""
},
"require": {
@@ -8322,7 +8393,6 @@
},
"require-dev": {
"symfony/emoji": "^7.1",
"symfony/error-handler": "^6.4|^7.0",
"symfony/http-client": "^6.4|^7.0",
"symfony/intl": "^6.4|^7.0",
"symfony/translation-contracts": "^2.5|^3.0",
@@ -8365,7 +8435,7 @@
"utf8"
],
"support": {
"source": "https://github.com/symfony/string/tree/v7.3.3"
"source": "https://github.com/symfony/string/tree/v7.3.4"
},
"funding": [
{
@@ -8385,20 +8455,20 @@
"type": "tidelift"
}
],
"time": "2025-08-25T06:35:40+00:00"
"time": "2025-09-11T14:36:48+00:00"
},
{
"name": "symfony/translation",
"version": "v7.3.3",
"version": "v7.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
"reference": "e0837b4cbcef63c754d89a4806575cada743a38d"
"reference": "ec25870502d0c7072d086e8ffba1420c85965174"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/translation/zipball/e0837b4cbcef63c754d89a4806575cada743a38d",
"reference": "e0837b4cbcef63c754d89a4806575cada743a38d",
"url": "https://api.github.com/repos/symfony/translation/zipball/ec25870502d0c7072d086e8ffba1420c85965174",
"reference": "ec25870502d0c7072d086e8ffba1420c85965174",
"shasum": ""
},
"require": {
@@ -8465,7 +8535,7 @@
"description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/translation/tree/v7.3.3"
"source": "https://github.com/symfony/translation/tree/v7.3.4"
},
"funding": [
{
@@ -8485,7 +8555,7 @@
"type": "tidelift"
}
],
"time": "2025-08-01T21:02:37+00:00"
"time": "2025-09-07T11:39:36+00:00"
},
{
"name": "symfony/translation-contracts",
@@ -8641,16 +8711,16 @@
},
{
"name": "symfony/var-dumper",
"version": "v7.3.3",
"version": "v7.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
"reference": "34d8d4c4b9597347306d1ec8eb4e1319b1e6986f"
"reference": "b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/34d8d4c4b9597347306d1ec8eb4e1319b1e6986f",
"reference": "34d8d4c4b9597347306d1ec8eb4e1319b1e6986f",
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb",
"reference": "b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb",
"shasum": ""
},
"require": {
@@ -8704,7 +8774,7 @@
"dump"
],
"support": {
"source": "https://github.com/symfony/var-dumper/tree/v7.3.3"
"source": "https://github.com/symfony/var-dumper/tree/v7.3.4"
},
"funding": [
{
@@ -8724,7 +8794,7 @@
"type": "tidelift"
}
],
"time": "2025-08-13T11:49:31+00:00"
"time": "2025-09-11T10:12:26+00:00"
},
{
"name": "tijsverkoyen/css-to-inline-styles",
@@ -8781,6 +8851,136 @@
},
"time": "2024-12-21T16:25:41+00:00"
},
{
"name": "tonegabes/filament-better-options",
"version": "1.2.1",
"source": {
"type": "git",
"url": "https://github.com/tonegabes/filament-better-options.git",
"reference": "20f267fe817f9b80bcdcee27c072f47f88499c21"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/tonegabes/filament-better-options/zipball/20f267fe817f9b80bcdcee27c072f47f88499c21",
"reference": "20f267fe817f9b80bcdcee27c072f47f88499c21",
"shasum": ""
},
"require": {
"filament/forms": "^4.0",
"php": "^8.3",
"spatie/laravel-package-tools": "^1.15.0",
"tonegabes/filament-phosphor-icons": "^1.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.86",
"larastan/larastan": "^3.0",
"laravel/pint": "^1.0",
"phpstan/phpstan-deprecation-rules": "^2.0"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"ToneGabes\\BetterOptions\\BetterOptionsServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"ToneGabes\\BetterOptions\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Tone Gabes",
"email": "tonegabes@gmail.com",
"homepage": "https://tonegabes.com",
"role": "Developer"
}
],
"description": "Filament form components for better radio and checkbox options.",
"homepage": "https://github.com/tonegabes/filament-better-options",
"keywords": [
"Forms",
"checkbox",
"filament",
"laravel",
"php",
"plugin",
"tonegabes"
],
"support": {
"issues": "https://github.com/tonegabes/filament-better-options/issues",
"source": "https://github.com/tonegabes/filament-better-options"
},
"time": "2025-09-25T17:26:15+00:00"
},
{
"name": "tonegabes/filament-phosphor-icons",
"version": "1.2.1",
"source": {
"type": "git",
"url": "https://github.com/tonegabes/filament-phosphor-icons.git",
"reference": "f654722dee534ccddd005e667a73e8e64cb412cc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/tonegabes/filament-phosphor-icons/zipball/f654722dee534ccddd005e667a73e8e64cb412cc",
"reference": "f654722dee534ccddd005e667a73e8e64cb412cc",
"shasum": ""
},
"require": {
"codeat3/blade-phosphor-icons": "^2.3",
"filament/filament": "^4.0",
"php": "^8.1"
},
"require-dev": {
"laravel/pint": "^1.22"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"ToneGabes\\Filament\\Icons\\PhosphorIconsServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"ToneGabes\\Filament\\Icons\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Tone Gabes",
"email": "tonegabes@gmail.com",
"homepage": "https://tonegabes.com",
"role": "Developer"
}
],
"description": "Phosphor Icons Pack ready for Filament 4",
"keywords": [
"Iconset",
"Phosphor",
"filament",
"icons",
"laravel",
"library"
],
"support": {
"issues": "https://github.com/tonegabes/filament-phosphor-icons/issues",
"source": "https://github.com/tonegabes/filament-phosphor-icons/tree/1.2.1"
},
"time": "2025-09-12T18:24:34+00:00"
},
{
"name": "ueberdosis/tiptap-php",
"version": "2.0.0",
@@ -0,0 +1 @@
/*! tailwindcss v4.1.13 | MIT License | https://tailwindcss.com */@layer theme, base, components, utilities;@layer theme{:host,:root{--font-mono:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-300:oklch(80.8% 0.114 19.571);--color-red-500:oklch(63.7% 0.237 25.331);--color-sky-400:oklch(74.6% 0.16 232.661);--color-gray-100:var(--gray-100);--color-gray-200:var(--gray-200);--color-gray-300:var(--gray-300);--color-gray-400:var(--gray-400);--color-gray-500:var(--gray-500);--color-gray-600:var(--gray-600);--color-gray-700:var(--gray-700);--color-gray-900:var(--gray-900);--color-gray-950:var(--gray-950);--color-black:#000;--color-white:#fff;--spacing:0.25rem;--breakpoint-sm:40rem;--breakpoint-md:48rem;--breakpoint-lg:64rem;--breakpoint-xl:80rem;--breakpoint-2xl:96rem;--container-3xs:16rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:0.75rem;--text-xs--line-height:calc(1 / 0.75);--text-sm:0.875rem;--text-sm--line-height:calc(1.25 / 0.875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-thin:100;--font-weight-extralight:200;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--tracking-tighter:-0.05em;--tracking-tight:-0.025em;--leading-loose:2;--radius-md:0.375rem;--radius-lg:0.5rem;--radius-xl:0.75rem;--ease-in:cubic-bezier(0.4,0,1,1);--ease-out:cubic-bezier(0,0,0.2,1);--ease-in-out:cubic-bezier(0.4,0,0.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(0.4,0,0.6,1) infinite;--default-transition-duration:150ms;--default-transition-timing-function:cubic-bezier(0.4,0,0.2,1);--default-font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--default-mono-font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-primary-50:var(--color-primary-50);--color-primary-100:var(--color-primary-100);--color-primary-200:var(--color-primary-200);--color-primary-300:var(--color-primary-300);--color-primary-400:var(--color-primary-400);--color-primary-500:var(--color-primary-500);--color-primary-600:var(--color-primary-600);--color-primary-700:var(--color-primary-700);--color-primary-800:var(--color-primary-800);--color-primary-900:var(--color-primary-900);--color-primary-950:var(--color-primary-950)}}@layer base{*,::backdrop,::file-selector-button,:after,:before{border:0 solid;box-sizing:border-box;margin:0;padding:0}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);tab-size:4;-webkit-tap-highlight-color:transparent}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-size:1em;font-variation-settings:var(--default-mono-font-variation-settings,normal)}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}::file-selector-button,button,input,optgroup,select,textarea{background-color:transparent;border-radius:0;color:inherit;font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not (-webkit-appearLine truncated
@@ -0,0 +1,140 @@
export default function checkboxListFormComponent({ livewireId }) {
return {
areAllCheckboxesChecked: false,
checkboxListOptions: [],
search: "",
visibleCheckboxListOptions: [],
// Cache selectors for better performance
selectors: {
option: ".fi-fo-checkbox-option",
label: ".fi-fo-checkbox-option__label",
description: ".fi-fo-checkbox-option__description",
checkbox: "input[type=checkbox]",
checkedOrDisabled:
"input[type=checkbox]:checked, input[type=checkbox]:disabled",
},
init() {
this.cacheElements();
this.bindEvents();
this.$nextTick(() => {
this.checkIfAllCheckboxesAreChecked();
});
},
cacheElements() {
this.checkboxListOptions = Array.from(
this.$root.querySelectorAll(this.selectors.option)
);
this.updateVisibleCheckboxListOptions();
},
bindEvents() {
// Livewire hook for updates
Livewire.hook("commit", ({ component, succeed }) => {
succeed(() => {
this.$nextTick(() => {
if (component.id !== livewireId) {
return;
}
this.cacheElements();
this.checkIfAllCheckboxesAreChecked();
});
});
});
// Debounced search watcher
this.$watch(
"search",
this.debounce(() => {
this.updateVisibleCheckboxListOptions();
this.checkIfAllCheckboxesAreChecked();
}, 150)
);
},
// Simple debounce implementation
debounce(func, wait) {
let timeout;
return function executedFunction(...args) {
const later = () => {
clearTimeout(timeout);
func(...args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
},
isFoundInSearch(checkboxItem) {
if (!this.search || this.search.trim() === "") {
return true;
}
const searchTerm = this.search.toLowerCase();
// Cache elements to avoid repeated queries
const labelElement = checkboxItem.querySelector(this.selectors.label);
const descriptionElement = checkboxItem.querySelector(
this.selectors.description
);
const labelText = labelElement?.innerText?.toLowerCase() || "";
const descriptionText =
descriptionElement?.innerText?.toLowerCase() || "";
return (
labelText.includes(searchTerm) || descriptionText.includes(searchTerm)
);
},
checkIfAllCheckboxesAreChecked() {
if (this.visibleCheckboxListOptions.length === 0) {
this.areAllCheckboxesChecked = false;
return;
}
this.areAllCheckboxesChecked =
this.visibleCheckboxListOptions.length ===
this.visibleCheckboxListOptions.filter((checkboxLabel) =>
checkboxLabel.querySelector(this.selectors.checkedOrDisabled)
).length;
},
toggleAllCheckboxes() {
this.checkIfAllCheckboxesAreChecked();
const shouldCheck = !this.areAllCheckboxesChecked;
// Batch DOM operations for better performance
const checkboxesToUpdate = [];
this.visibleCheckboxListOptions.forEach((checkboxLabel) => {
const checkbox = checkboxLabel.querySelector(this.selectors.checkbox);
if (checkbox && !checkbox.disabled) {
checkboxesToUpdate.push(checkbox);
}
});
// Update all checkboxes at once
checkboxesToUpdate.forEach((checkbox) => {
checkbox.checked = shouldCheck;
checkbox.dispatchEvent(new Event("change"));
});
this.areAllCheckboxesChecked = shouldCheck;
},
updateVisibleCheckboxListOptions() {
if (!this.search || this.search.trim() === "") {
this.visibleCheckboxListOptions = [...this.checkboxListOptions];
return;
}
this.visibleCheckboxListOptions = this.checkboxListOptions.filter(
(checkboxListItem) => this.isFoundInSearch(checkboxListItem)
);
},
};
}
+1
View File
@@ -4,6 +4,7 @@
@source '../../../../resources/views/**/*';
@source '../../../../resources/views/filament/**/*';
@source '../../../../vendor/awcodes/light-switch/resources/**/*.blade.php';
@source '../../../../vendor/jaocero/radio-deck/resources/views';
.fi-simple-main {
@apply relative sm:max-w-3xl;
@@ -1,4 +0,0 @@
<div class="pl-4">
<x-filament::icon-button icon="heroicon-m-sun" color="gray" class="hidden dark:block" x-on:click=toggle_theme(); />
<x-filament::icon-button icon="heroicon-o-moon" color="gray" class="block dark:hidden" x-on:click=toggle_theme(); />
</div>
+9 -3
View File
@@ -1,5 +1,5 @@
<nav x-data="{ mobileMenuIsOpen: false }" x-on:click.away="mobileMenuIsOpen = false"
class="flex items-center justify-between bg-white border-b border-outline px-7 py-3 dark:border-outline-dark dark:bg-surface-dark-alt">
class="drop-shadow-sm flex items-center justify-between bg-white border-b border-outline px-7 py-3 dark:border-outline-dark dark:bg-surface-dark-alt">
<!-- Brand Logo -->
@include('layouts.logo')
@@ -25,7 +25,13 @@
Registrieren
</x-filament::button>
@include('layouts.dark-toggle')
<!-- Theme Toggle -->
<div class="pl-4">
<x-filament::icon-button icon="heroicon-m-sun" color="gray" class="hidden dark:block"
x-on:click=toggle_theme(); />
<x-filament::icon-button icon="heroicon-o-moon" color="gray" class="block dark:hidden"
x-on:click=toggle_theme(); />
</div>
</dev>
<!-- Mobile Menu Button -->
<button x-on:click="mobileMenuIsOpen = !mobileMenuIsOpen" x-bind:aria-expanded="mobileMenuIsOpen"
@@ -49,7 +55,7 @@
x-transition:leave-start="translate-y-0" x-transition:leave-end="-translate-y-full" id="mobileMenu"
class="fixed max-h-svh overflow-y-auto inset-x-0 top-0 z-10 flex flex-col divide-y divide-outline rounded-b-radius border-b border-outline bg-surface-alt px-6 pb-6 pt-20 dark:divide-outline-dark dark:border-outline-dark dark:bg-surface-dark-alt md:hidden">
<li class="py-4"><a href="/home"
<li class="py-4"><a href="/"
class="w-full text-lg font-bold text-primary focus:underline dark:text-primary-dark"
aria-current="page">Home</a></li>
<li class="py-4"><a href="/nutzwerte"
+2 -2
View File
@@ -8,8 +8,8 @@ Route::get('/', function () {
Route::get('/nutzwerte', function () {
return view('pages.nutzwerte');
});
Route::get('/dieses-programm', function () {
return view('pages.dieses-programm');
Route::get('/programm', function () {
return view('pages.programm');
});
Route::get('/impressum', function () {
return view('pages.impressum');