From c446450f7336a2ee8dd62ef70407016174164ec1 Mon Sep 17 00:00:00 2001 From: salam Date: Sat, 4 Oct 2025 18:40:15 +0200 Subject: [PATCH] wip --- ARTISAN.md | 2 + app/Filament/Imports/RaeumealleImporter.php | 75 +++++++++++++++++++ .../AllgemeinflaechensRelationManager.php | 12 ++- .../RaeumeallesRelationManager.php | 21 +++++- 4 files changed, 104 insertions(+), 6 deletions(-) create mode 100644 app/Filament/Imports/RaeumealleImporter.php diff --git a/ARTISAN.md b/ARTISAN.md index dbad7f5..08b3664 100644 --- a/ARTISAN.md +++ b/ARTISAN.md @@ -24,6 +24,8 @@ a make:filament-relation-manager RaeumealleResource Raeumealles geschoss a make:model Allgemeinflaechen -ms a make:model Raeumealle -ms +php artisan make:filament-importer Raeumealle + A make:filament-resource Allgemeinflaechen --nested diff --git a/app/Filament/Imports/RaeumealleImporter.php b/app/Filament/Imports/RaeumealleImporter.php new file mode 100644 index 0000000..9dbdf95 --- /dev/null +++ b/app/Filament/Imports/RaeumealleImporter.php @@ -0,0 +1,75 @@ +rules(['max:255']) + ->castStateUsing(function (string $state) { + $state = trim($state); + + return iconv(mb_detect_encoding($state, mb_detect_order(), true), 'UTF-8', $state); + }), + ImportColumn::make('geschoss') + ->rules(['max:255']) + ->castStateUsing(function (string $state) { + $state = trim($state); + + return iconv(mb_detect_encoding($state, mb_detect_order(), true), 'UTF-8', $state); + }), + ImportColumn::make('raumart') + ->rules(['max:255']) + ->castStateUsing(function (string $state) { + $state = trim($state); + + return iconv(mb_detect_encoding($state, mb_detect_order(), true), 'UTF-8', $state); + }), + ImportColumn::make('flaeche') + ->validationAttribute('Fläche') + ->rules(['required']) + ->example('52,75') + ->castStateUsing(function (string $state): ?float { + if (blank($state)) { + return '0.00'; + } + + $state = str_replace(',', '.', $state); + $state = preg_replace('/[^0-9.]/', '', $state); + + return round($state, precision: 2); + }), + ]; + } + + public function resolveRecord(): Raeumealle + { + return new Raeumealle; + $raeumealle = new Raeumealle; + $raeumealle->projekte_id = $this->options['projekte_id']; + + return $raeumealle; + } + + public static function getCompletedNotificationBody(Import $import): string + { + $body = ' Der Import der Räume ist abgeschlossen. Es wurden '.Number::format($import->successful_rows).' '.str('row')->plural($import->successful_rows).' importiert.'; + + if ($failedRowsCount = $import->getFailedRowsCount()) { + $body .= ' Bei '.Number::format($failedRowsCount).' '.str('row')->plural($failedRowsCount).' ist der Import fehlgeschlagen.'; + } + + return $body; + } +} diff --git a/app/Filament/Resources/Projektes/RelationManagers/AllgemeinflaechensRelationManager.php b/app/Filament/Resources/Projektes/RelationManagers/AllgemeinflaechensRelationManager.php index 7c22f87..ac539ad 100644 --- a/app/Filament/Resources/Projektes/RelationManagers/AllgemeinflaechensRelationManager.php +++ b/app/Filament/Resources/Projektes/RelationManagers/AllgemeinflaechensRelationManager.php @@ -13,6 +13,7 @@ use Filament\Forms\Components\TextInput; use Filament\Resources\RelationManagers\RelationManager; use Filament\Schemas\Schema; use Filament\Tables\Columns\TextColumn; +use Filament\Tables\Columns\TextInputColumn; use Filament\Tables\Table; use Illuminate\Validation\Rules\File; @@ -29,6 +30,9 @@ class AllgemeinflaechensRelationManager extends RelationManager TextInput::make('geschoss') ->required() ->maxLength(255), + TextInput::make('raumart') + ->required() + ->maxLength(255), ]); } @@ -39,9 +43,10 @@ class AllgemeinflaechensRelationManager extends RelationManager ->columns([ TextColumn::make('geschoss')->searchable(), TextColumn::make('raumart')->searchable(), - TextColumn::make('flaeche') + TextInputColumn::make('flaeche') + ->width('2rem') ->alignment('right') - ->formatStateUsing(fn ($state) => "{$state} m²") + // ->formatStateUsing(fn ($state) => "{$state} m²") ->label('Fläche') // ->numeric(decimalPlaces: 2) ->searchable(), @@ -50,7 +55,8 @@ class AllgemeinflaechensRelationManager extends RelationManager // ]) ->headerActions([ - CreateAction::make(), + CreateAction::make() + ->icon('phosphor-file-plus'), ImportAction::make() ->importer(AllgemeinflaechenImporter::class) ->label('Hochladen') diff --git a/app/Filament/Resources/Projektes/RelationManagers/RaeumeallesRelationManager.php b/app/Filament/Resources/Projektes/RelationManagers/RaeumeallesRelationManager.php index 25f7809..648bef2 100644 --- a/app/Filament/Resources/Projektes/RelationManagers/RaeumeallesRelationManager.php +++ b/app/Filament/Resources/Projektes/RelationManagers/RaeumeallesRelationManager.php @@ -2,16 +2,19 @@ namespace App\Filament\Resources\Projektes\RelationManagers; +use App\Filament\Imports\RaeumealleImporter; use Filament\Actions\BulkActionGroup; use Filament\Actions\CreateAction; use Filament\Actions\DeleteAction; use Filament\Actions\DeleteBulkAction; use Filament\Actions\EditAction; +use Filament\Actions\ImportAction; use Filament\Forms\Components\TextInput; use Filament\Resources\RelationManagers\RelationManager; use Filament\Schemas\Schema; use Filament\Tables\Columns\TextColumn; use Filament\Tables\Table; +use Illuminate\Validation\Rules\File; class RaeumeallesRelationManager extends RelationManager { @@ -47,11 +50,23 @@ class RaeumeallesRelationManager extends RelationManager // ]) ->headerActions([ - CreateAction::make(), + CreateAction::make() + ->icon('phosphor-file-plus'), + ImportAction::make() + ->importer(RaeumealleImporter::class) + ->label('Hochladen') + ->icon('phosphor-upload') + ->color('info') + ->options([ + 'projekte_id' => $this->getOwnerRecord()->id, + ]) + ->fileRules([ + File::types(['csv', 'txt'])->max(1024), + ]), ]) ->recordActions([ - EditAction::make(), - DeleteAction::make(), + EditAction::make()->iconButton()->color('gray'), + DeleteAction::make()->iconButton(), ]) ->toolbarActions([ BulkActionGroup::make([