diff --git a/app/Filament/Resources/MailAdressens/MailAdressenResource.php b/app/Filament/Resources/MailAdressens/MailAdressenResource.php index 3705bb7..b922e8b 100644 --- a/app/Filament/Resources/MailAdressens/MailAdressenResource.php +++ b/app/Filament/Resources/MailAdressens/MailAdressenResource.php @@ -17,9 +17,11 @@ class MailAdressenResource extends Resource { protected static ?string $model = MailAdressen::class; + protected static ?int $navigationSort = 2; + protected static ?string $cluster = NewsletterCluster::class; - protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedRectangleStack; + protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedUserCircle; protected static ?string $navigationLabel = 'Mail Adressen'; diff --git a/app/Filament/Resources/MailAdressens/Tables/MailAdressensTable.php b/app/Filament/Resources/MailAdressens/Tables/MailAdressensTable.php index b022ae2..0691a7d 100644 --- a/app/Filament/Resources/MailAdressens/Tables/MailAdressensTable.php +++ b/app/Filament/Resources/MailAdressens/Tables/MailAdressensTable.php @@ -3,17 +3,19 @@ namespace App\Filament\Resources\MailAdressens\Tables; use App\Models\MailAdressen; +use App\Models\MailGruppen; use Filament\Actions\BulkAction; use Filament\Actions\BulkActionGroup; use Filament\Actions\DeleteAction; use Filament\Actions\DeleteBulkAction; use Filament\Actions\EditAction; use Filament\Forms\Components\DatePicker; +use Filament\Forms\Components\Select; +use Filament\Forms\Components\Toggle; use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\ToggleColumn; use Filament\Tables\Enums\FiltersLayout; use Filament\Tables\Filters\Filter; -use Filament\Tables\Filters\TernaryFilter; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Collection; @@ -41,15 +43,31 @@ class MailAdressensTable TextColumn::make('last_name')->label('Nachname'), ]) ->filters([ - TernaryFilter::make('im_newsletter')->label('Im Newsletter'), - Filter::make('vereidigung') + Filter::make('mail_gruppen_id') + ->columnSpanFull() + ->columns(4) ->schema([ - DatePicker::make('vereidigung_von')->native(false), - DatePicker::make('vereidigung_bis')->native(false), + Select::make('mail_gruppen_id') + ->hiddenLabel() + ->preload() + ->default(1) + ->selectablePlaceholder(false) + ->options(function (): array { + return MailGruppen::pluck('name', 'id')->toArray(); + }), + Toggle::make('im_newsletter')->label('Im Newsletter'), + DatePicker::make('vereidigung_von')->native(false)->hiddenLabel()->placeholder('Vereidigung von'), + DatePicker::make('vereidigung_bis')->native(false)->hiddenLabel()->placeholder('Vereidigung bis'), ]) ->query(function (Builder $query, array $data): Builder { return $query ->when( + $data['mail_gruppen_id'], + fn (Builder $query, $mail_gruppen_id): Builder => $query->where('mail_gruppen_id', $mail_gruppen_id), + )->when( + $data['im_newsletter'], + fn (Builder $query, $im_newsletter): Builder => $query->where('im_newsletter', $im_newsletter), + )->when( $data['vereidigung_von'], fn (Builder $query, $date): Builder => $query->whereDate('vereidigung', '>=', $date), ) @@ -58,7 +76,10 @@ class MailAdressensTable fn (Builder $query, $date): Builder => $query->whereDate('vereidigung', '<=', $date), ); }), - ], layout: FiltersLayout::Modal) + ], layout: FiltersLayout::AboveContent) + ->filtersResetActionPosition(null) + ->hiddenFilterIndicators() + ->deferFilters(false) ->recordActions([ EditAction::make()->iconButton(), DeleteAction::make()->iconButton(), diff --git a/app/Filament/Resources/MailGruppens/MailGruppenResource.php b/app/Filament/Resources/MailGruppens/MailGruppenResource.php new file mode 100644 index 0000000..6636a6d --- /dev/null +++ b/app/Filament/Resources/MailGruppens/MailGruppenResource.php @@ -0,0 +1,48 @@ + ListMailGruppens::route('/'), + ]; + } +} diff --git a/app/Filament/Resources/MailGruppens/Pages/CreateMailGruppen.php b/app/Filament/Resources/MailGruppens/Pages/CreateMailGruppen.php new file mode 100644 index 0000000..a8ed5cd --- /dev/null +++ b/app/Filament/Resources/MailGruppens/Pages/CreateMailGruppen.php @@ -0,0 +1,11 @@ +createAnother(false), + ]; + } +} diff --git a/app/Filament/Resources/MailGruppens/Schemas/MailGruppenForm.php b/app/Filament/Resources/MailGruppens/Schemas/MailGruppenForm.php new file mode 100644 index 0000000..67b81c9 --- /dev/null +++ b/app/Filament/Resources/MailGruppens/Schemas/MailGruppenForm.php @@ -0,0 +1,17 @@ +components([ + TextInput::make('name'), + ])->columns(1); + } +} diff --git a/app/Filament/Resources/MailGruppens/Tables/MailGruppensTable.php b/app/Filament/Resources/MailGruppens/Tables/MailGruppensTable.php new file mode 100644 index 0000000..5cf6d54 --- /dev/null +++ b/app/Filament/Resources/MailGruppens/Tables/MailGruppensTable.php @@ -0,0 +1,28 @@ +columns([ + TextColumn::make('id'), + TextColumn::make('name'), + ]) + ->recordActions([ + EditAction::make()->iconButton(), + DeleteAction::make()->iconButton() + ->requiresConfirmation() + ->modalHeading('Adressen Gruppe') + ->modalDescription('Alle Mail Adressen die sich in dieser Gruppe befinden werden auch gelöscht. Dies kann nicht mehr rückgängig gemacht werden.') + ->modalSubmitActionLabel('Löschen'), + ]); + } +} diff --git a/app/Filament/Resources/MailVersands/MailVersandResource.php b/app/Filament/Resources/MailVersands/MailVersandResource.php new file mode 100644 index 0000000..9077b8f --- /dev/null +++ b/app/Filament/Resources/MailVersands/MailVersandResource.php @@ -0,0 +1,48 @@ + ListMailVersands::route('/'), + ]; + } +} diff --git a/app/Filament/Resources/MailVersands/Pages/CreateMailVersand.php b/app/Filament/Resources/MailVersands/Pages/CreateMailVersand.php new file mode 100644 index 0000000..6d2e356 --- /dev/null +++ b/app/Filament/Resources/MailVersands/Pages/CreateMailVersand.php @@ -0,0 +1,11 @@ +createAnother(false), + ]; + } +} diff --git a/app/Filament/Resources/MailVersands/Schemas/MailVersandForm.php b/app/Filament/Resources/MailVersands/Schemas/MailVersandForm.php new file mode 100644 index 0000000..0ea02ac --- /dev/null +++ b/app/Filament/Resources/MailVersands/Schemas/MailVersandForm.php @@ -0,0 +1,26 @@ +components([ + TextInput::make('name')->label('Benennung')->required(), + DateTimePicker::make('sende_zeitpunkt')->native(false)->required(), + Select::make('mail_gruppen_id') + ->required() + ->relationship(name: 'mail_gruppen', titleAttribute: 'name'), + Select::make('mail_vorlage_id') + ->required() + ->relationship(name: 'mail_vorlage', titleAttribute: 'titel'), + ]); + } +} diff --git a/app/Filament/Resources/MailVersands/Tables/MailVersandsTable.php b/app/Filament/Resources/MailVersands/Tables/MailVersandsTable.php new file mode 100644 index 0000000..615552d --- /dev/null +++ b/app/Filament/Resources/MailVersands/Tables/MailVersandsTable.php @@ -0,0 +1,43 @@ +columns([ + TextColumn::make('name')->label('Benennung'), + SelectColumn::make('mail_gruppen_id') + ->optionsRelationship(name: 'mail_gruppen', titleAttribute: 'name') + ->label('Versand an Gruppe'), + SelectColumn::make('mail_vorlage_id') + ->optionsRelationship(name: 'mail_vorlage', titleAttribute: 'titel') + ->label('Vorlage'), + TextColumn::make('sende_zeitpunkt')->dateTime()->label('Sende Zeitpunkt'), + TextColumn::make('versand_am')->dateTime(), + SelectColumn::make('status') + ->native(false) + ->disabled(fn ($record): bool => $record->ist_active ? true : false) + ->options([ + 'wartend' => 'Wartend', + 'versand' => 'Mail Versand', + ]) + ->allowOptionsHtml(), + ToggleColumn::make('ist_active')->onColor('success'), + ]) + ->filters([ + // + ]) + ->recordActions([ + EditAction::make()->iconButton(), + ]); + } +} diff --git a/app/Filament/Resources/MailVorlages/MailVorlageResource.php b/app/Filament/Resources/MailVorlages/MailVorlageResource.php index 8b3a824..f689c41 100644 --- a/app/Filament/Resources/MailVorlages/MailVorlageResource.php +++ b/app/Filament/Resources/MailVorlages/MailVorlageResource.php @@ -17,9 +17,11 @@ class MailVorlageResource extends Resource { protected static ?string $model = MailVorlage::class; + protected static ?int $navigationSort = 3; + protected static ?string $cluster = NewsletterCluster::class; - protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedRectangleStack; + protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedDocumentText; protected static ?string $navigationLabel = 'Mail Vorlagen'; diff --git a/app/Filament/Resources/MailVorlages/Pages/ListMailVorlages.php b/app/Filament/Resources/MailVorlages/Pages/ListMailVorlages.php index f55470f..b1c0278 100644 --- a/app/Filament/Resources/MailVorlages/Pages/ListMailVorlages.php +++ b/app/Filament/Resources/MailVorlages/Pages/ListMailVorlages.php @@ -10,6 +10,11 @@ class ListMailVorlages extends ListRecords { protected static string $resource = MailVorlageResource::class; + // protected function getTableRecordsPerPageSelectOptions(): array + // { + // return [1]; + // } + protected function getHeaderActions(): array { return [ diff --git a/app/Filament/Resources/MailVorlages/Schemas/MailVorlageForm.php b/app/Filament/Resources/MailVorlages/Schemas/MailVorlageForm.php index c7c93d5..c771e9e 100644 --- a/app/Filament/Resources/MailVorlages/Schemas/MailVorlageForm.php +++ b/app/Filament/Resources/MailVorlages/Schemas/MailVorlageForm.php @@ -5,6 +5,7 @@ namespace App\Filament\Resources\MailVorlages\Schemas; use Filament\Forms\Components\RichEditor; use Filament\Forms\Components\TextInput; use Filament\Schemas\Schema; +use Illuminate\Support\HtmlString; class MailVorlageForm { @@ -14,9 +15,9 @@ class MailVorlageForm ->components([ TextInput::make('titel')->suffix('Nur zur Kennung'), RichEditor::make('inhalt') - ->belowContent('Im Text konnen Vornamen und Nachnamen des Empfängers mit den Platzhaltern ###vorname### und ###nachname### ersetzen werden. Für die Anrede ###anrede### wird je nach Geschlecht "Sehr geehrte Frau" oder "Sehr geehrter Herr" verwended. Ansonnsten einfach "Hallo" verwenden.') + ->belowContent(new HtmlString('
Im Text können Vornamen und Nachnamen des Empfängers mit den Platzhaltern ###vorname### und ###nachname### ersetzen werden.
Für die Anrede wird der Platzhalter ###anrede### verwended. Dieser wird je nach Geschlecht durch "Sehr geehrte Frau" oder "Sehr geehrter Herr" ersetzt, oder einfach "Hallo" verwenden.
')) ->toolbarButtons([ - ['bold', 'italic', 'underline', 'strike'], + ['bold', 'italic', 'underline', 'strike', 'code', 'small', 'highlight'], ['undo', 'redo'], ]), ])->columns(1); diff --git a/app/Filament/Resources/MailVorlages/Tables/MailVorlagesTable.php b/app/Filament/Resources/MailVorlages/Tables/MailVorlagesTable.php index c735609..052c259 100644 --- a/app/Filament/Resources/MailVorlages/Tables/MailVorlagesTable.php +++ b/app/Filament/Resources/MailVorlages/Tables/MailVorlagesTable.php @@ -2,11 +2,14 @@ namespace App\Filament\Resources\MailVorlages\Tables; -use Filament\Actions\BulkActionGroup; -use Filament\Actions\DeleteBulkAction; +use App\Models\MailVorlage; use Filament\Actions\EditAction; +use Filament\Forms\Components\Select; use Filament\Tables\Columns\TextColumn; +use Filament\Tables\Enums\FiltersLayout; +use Filament\Tables\Filters\Filter; use Filament\Tables\Table; +use Illuminate\Database\Eloquent\Builder; class MailVorlagesTable { @@ -14,19 +17,40 @@ class MailVorlagesTable { return $table ->columns([ - TextColumn::make('titel'), - TextColumn::make('inhalt')->html(), + // TextColumn::make('titel'), + TextColumn::make('inhalt') + ->label('E-Mail Vorlage') + ->extraAttributes(['class' => 'tiptap']) + ->html() + ->wrap(), ]) + ->paginated(false) ->filters([ - // - ]) + Filter::make('vorlagen_id') + ->schema([ + Select::make('vorlagen_id') + ->hiddenLabel() + ->preload() + ->default(1) + ->selectablePlaceholder(false) + ->options(function (): array { + return MailVorlage::pluck('titel', 'id')->toArray(); + }), + ]) + ->query(function (Builder $query, array $data): Builder { + return $query + ->when( + $data['vorlagen_id'], + fn (Builder $query, $vorlagen_id): Builder => $query->where('id', $vorlagen_id), + ); + }), + + ], layout: FiltersLayout::AboveContent) + ->filtersResetActionPosition(null) + ->hiddenFilterIndicators() + ->deferFilters(false) ->recordActions([ EditAction::make(), - ]) - ->toolbarActions([ - BulkActionGroup::make([ - DeleteBulkAction::make(), - ]), ]); } } diff --git a/app/Models/Konto.php b/app/Models/Konto.php index 2751252..79b0def 100644 --- a/app/Models/Konto.php +++ b/app/Models/Konto.php @@ -6,7 +6,8 @@ use Database\Factories\KontoFactory; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; -use Illuminate\Database\Eloquent\Relations\HasOne; + +// use Illuminate\Database\Eloquent\Relations\HasOne; class Konto extends Model { @@ -37,8 +38,8 @@ class Konto extends Model return KontoFactory::new(); } - public function plan(): HasOne - { - return $this->hasOne(Plan::class, 'id', 'plan_id'); - } + // public function plan(): HasOne + // { + // return $this->hasOne(Plan::class, 'id', 'plan_id'); + // } } diff --git a/app/Models/MailAdressen.php b/app/Models/MailAdressen.php index fcc3f96..d4c786b 100644 --- a/app/Models/MailAdressen.php +++ b/app/Models/MailAdressen.php @@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Model; class MailAdressen extends Model { protected $fillable = [ + 'mail_adressen_id', 'email', 'company', 'gender', diff --git a/app/Models/MailGruppen.php b/app/Models/MailGruppen.php new file mode 100644 index 0000000..a80f99c --- /dev/null +++ b/app/Models/MailGruppen.php @@ -0,0 +1,12 @@ +belongsTo(MailGruppen::class); + } + + public function mail_vorlage() + { + return $this->belongsTo(MailVorlage::class); + } +} diff --git a/database/migrations/2026_05_04_070425_create_mail_adressens_table.php b/database/migrations/2026_05_04_070425_create_mail_adressens_table.php index 822f482..139835a 100644 --- a/database/migrations/2026_05_04_070425_create_mail_adressens_table.php +++ b/database/migrations/2026_05_04_070425_create_mail_adressens_table.php @@ -13,6 +13,7 @@ return new class extends Migration { Schema::create('mail_adressens', function (Blueprint $table) { $table->id(); + $table->foreignId('mail_gruppen_id')->constrained()->cascadeOnDelete(); $table->string('email')->unique(); $table->string('company'); $table->string('gender')->nullable(); diff --git a/database/migrations/2026_05_06_053208_create_mail_versands_table.php b/database/migrations/2026_05_06_053208_create_mail_versands_table.php new file mode 100644 index 0000000..a4ba216 --- /dev/null +++ b/database/migrations/2026_05_06_053208_create_mail_versands_table.php @@ -0,0 +1,34 @@ +id(); + $table->string('name'); + $table->foreignId('mail_gruppen_id'); + $table->foreignId('mail_vorlage_id'); + $table->date('sende_zeitpunkt'); + $table->date('versand_am')->nullable(); + $table->string('status')->nullable()->default('wartend'); + $table->boolean('ist_active')->default(0); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('mail_versands'); + } +}; diff --git a/database/migrations/2026_05_06_060450_create_mail_gruppens_table.php b/database/migrations/2026_05_06_060450_create_mail_gruppens_table.php new file mode 100644 index 0000000..028a81a --- /dev/null +++ b/database/migrations/2026_05_06_060450_create_mail_gruppens_table.php @@ -0,0 +1,28 @@ +id(); + $table->string('name'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('mail_gruppens'); + } +}; diff --git a/public/storage b/public/storage index 2935def..c5aab61 120000 --- a/public/storage +++ b/public/storage @@ -1 +1 @@ -/Users/hermanntelser/Sites/nutzwerte_fi4/storage/app/public \ No newline at end of file +/Users/salam/Sites/nutzwerte_fi4/storage/app/public \ No newline at end of file diff --git a/resources/css/filament/admin/theme.css b/resources/css/filament/admin/theme.css index 638cb6e..2736fe3 100644 --- a/resources/css/filament/admin/theme.css +++ b/resources/css/filament/admin/theme.css @@ -64,7 +64,7 @@ } .tiptap p { - margin: 1em 0; + margin: 0.5em 0; font-family: Verdana, Tahoma, sans-serif; font-size: 10pt; font-weight: normal; diff --git a/storage/BenutzerLogos/hvflogo _orig.psd b/storage/BenutzerLogos/hvflogo _orig.psd new file mode 100644 index 0000000..3a3de4e Binary files /dev/null and b/storage/BenutzerLogos/hvflogo _orig.psd differ diff --git a/storage/BenutzerLogos/hvflogo.jpg b/storage/BenutzerLogos/hvflogo.jpg new file mode 100644 index 0000000..af019c3 Binary files /dev/null and b/storage/BenutzerLogos/hvflogo.jpg differ diff --git a/storage/BenutzerLogos/hvflogo2.jpg b/storage/BenutzerLogos/hvflogo2.jpg new file mode 100644 index 0000000..e61a5fa Binary files /dev/null and b/storage/BenutzerLogos/hvflogo2.jpg differ diff --git a/storage/BenutzerLogos/hvflogo3.jpg b/storage/BenutzerLogos/hvflogo3.jpg new file mode 100644 index 0000000..b59a220 Binary files /dev/null and b/storage/BenutzerLogos/hvflogo3.jpg differ diff --git a/storage/BenutzerLogos/logo hanno.psd b/storage/BenutzerLogos/logo hanno.psd new file mode 100644 index 0000000..3a52a40 Binary files /dev/null and b/storage/BenutzerLogos/logo hanno.psd differ