diff --git a/app/Filament/Resources/PricelistFiles/Pages/ViewPricelistFile.php b/app/Filament/Resources/PricelistFiles/Pages/ViewPricelistFile.php index fdc5bc9..bd8e950 100644 --- a/app/Filament/Resources/PricelistFiles/Pages/ViewPricelistFile.php +++ b/app/Filament/Resources/PricelistFiles/Pages/ViewPricelistFile.php @@ -19,20 +19,10 @@ protected function getHeaderActions(): array ]; } - public function getHeading(): string - { - return "Árlista fájl: " . $this->record->filename; - } - protected function getHeaderWidgets(): array { return [ // Később ide jöhetnek widgetek, pl. statisztika a feldolgozásról ]; } - - public function getSubheading(): ?string - { - return "Beszállító: " . $this->record->supplier?->name; - } } diff --git a/app/Filament/Resources/PricelistFiles/Schemas/PricelistFileInfolist.php b/app/Filament/Resources/PricelistFiles/Schemas/PricelistFileInfolist.php index d2e25b7..b6f76f2 100644 --- a/app/Filament/Resources/PricelistFiles/Schemas/PricelistFileInfolist.php +++ b/app/Filament/Resources/PricelistFiles/Schemas/PricelistFileInfolist.php @@ -28,149 +28,173 @@ public static function configure(Schema $schema): Schema ->columnSpanFull() ->maxWidth(Width::Full) ->schema([ - Section::make('Fájl információk') + // BAL OSZLOP + Grid::make(1) + ->columnSpan(1) ->schema([ - Grid::make(3) + Section::make('Fájl információk') ->schema([ - TextEntry::make('filename') - ->label('Fájlnév') - ->icon('heroicon-o-document-text') - ->color('primary'), - TextEntry::make('supplier.name') - ->label('Beszállító') - ->icon('heroicon-o-user'), - TextEntry::make('status') - ->label('Státusz') - ->badge() - ->formatStateUsing(fn (PricelistFileStatusEnum $state): string => $state->label()) - ->color(fn (PricelistFileStatusEnum $state): string => match ($state) { - PricelistFileStatusEnum::todo => 'gray', - PricelistFileStatusEnum::inprogress => 'info', - PricelistFileStatusEnum::done => 'success', - PricelistFileStatusEnum::fail => 'danger', - PricelistFileStatusEnum::waiting_for_approval => 'primary', - PricelistFileStatusEnum::closed => 'warning', - }), - ]), - Grid::make(3) - ->schema([ - TextEntry::make('available_date') - ->label('Életbelépés dátuma') - ->date('Y.m.d'), - TextEntry::make('created_at') - ->label('Feltöltés időpontja') - ->dateTime('Y.m.d H:i'), + Grid::make(3) + ->schema([ + TextEntry::make('filename') + ->label('Fájlnév') + ->icon('heroicon-o-document-text') + ->color('primary'), + TextEntry::make('supplier.name') + ->label('Beszállító') + ->icon('heroicon-o-user'), + TextEntry::make('status') + ->label('Státusz') + ->badge() + ->formatStateUsing(fn (PricelistFileStatusEnum $state): string => $state->label()) + ->color(fn (PricelistFileStatusEnum $state): string => match ($state) { + PricelistFileStatusEnum::todo => 'gray', + PricelistFileStatusEnum::inprogress => 'info', + PricelistFileStatusEnum::done => 'success', + PricelistFileStatusEnum::fail => 'danger', + PricelistFileStatusEnum::waiting_for_approval => 'primary', + PricelistFileStatusEnum::closed => 'warning', + }), + ]), + Grid::make(3) + ->schema([ + TextEntry::make('available_date') + ->label('Életbelépés') + ->date('Y.m.d'), + TextEntry::make('created_at') + ->label('Feltöltés') + ->dateTime('Y.m.d H:i'), + ]), + // SÁRGA NÉGYZET JAVÍTÁSA: Teljes szélességben alul, csak hiba esetén TextEntry::make('processing_current_step') - ->label('Aktuális folyamat') + ->label('Validációs hiba') ->weight('bold') - ->color(fn ($record) => $record->status === PricelistFileStatusEnum::fail ? 'danger' : 'info') + ->color('danger') + ->columnSpanFull() + ->visible(fn ($record) => $record->status === PricelistFileStatusEnum::fail) + ->formatStateUsing(fn ($state, $record) => str_contains((string)$state, 'hibás') ? $state : "Hiba történt a folyamat során: $state"), + + // Folyamatban lévő állapot kijelzése (nem hiba, de hasznos) + TextEntry::make('processing_current_step_inprogress') + ->label('Aktuális folyamat') + ->getStateUsing(fn ($record) => $record->processing_current_step) + ->weight('bold') + ->color('info') + ->columnSpanFull() + ->visible(fn ($record) => $record->status === PricelistFileStatusEnum::inprogress) ->formatStateUsing(fn ($state, $record) => "$state ({$record->processing_current_step_percentage}%)"), + + TextEntry::make('note') + ->label('Megjegyzés') + ->placeholder('Nincs megjegyzés') + ->columnSpanFull(), ]), - TextEntry::make('note') - ->label('Megjegyzés') - ->placeholder('Nincs megjegyzés') - ->columnSpanFull(), ]), - Section::make('Validáció statisztika') + // JOBB OSZLOP + Grid::make(1) + ->columnSpan(1) ->schema([ - Grid::make(5)->schema([ - TextEntry::make('lines_count') - ->label('Összes sor') - ->icon('heroicon-o-list-bullet') - ->getStateUsing(fn ($record) => $record->lines()->count()), - TextEntry::make('error_lines_count') - ->label('Hibás sorok') - ->icon('heroicon-o-x-circle') - ->color('danger') - ->getStateUsing(fn ($record) => $record->lines()->where('status', 'error')->count()), - TextEntry::make('warning_lines_count') - ->label('Figyelmeztetések') - ->icon('heroicon-o-exclamation-triangle') - ->color('warning') - ->getStateUsing(fn ($record) => $record->lines()->where('status', 'warning')->count()), - TextEntry::make('new_lines_count') - ->label('Új termékek') - ->icon('heroicon-o-sparkles') - ->color('info') - ->getStateUsing(fn ($record) => $record->lines()->where('status', 'new_product')->count()), - TextEntry::make('updated_lines_count') - ->label('Módosult termékek') - ->icon('heroicon-o-pencil-square') - ->color('primary') - ->getStateUsing(fn ($record) => $record->lines()->where('status', 'updated')->count()), - ]), - ]) - ->visible(fn ($record) => $record->lines()->exists()), + Section::make('Fájl statisztika') // KÉK NÉGYZETEK JAVÍTÁSA: Összevont szekció + ->schema([ + Grid::make(5)->schema([ + TextEntry::make('lines_count') + ->label('Sorok') + ->icon('heroicon-o-list-bullet') + ->getStateUsing(fn ($record) => $record->lines()->count()), + TextEntry::make('error_lines_count') + ->label('Hibás') + ->icon('heroicon-o-x-circle') + ->color('danger') + ->getStateUsing(fn ($record) => $record->lines()->where('status', 'error')->count()), + TextEntry::make('warning_lines_count') + ->label('Figyelm.') + ->icon('heroicon-o-exclamation-triangle') + ->color('warning') + ->getStateUsing(fn ($record) => $record->lines()->where('status', 'warning')->count()), + TextEntry::make('new_lines_count') + ->label('Új') + ->icon('heroicon-o-sparkles') + ->color('info') + ->getStateUsing(fn ($record) => $record->lines()->where('status', 'new_product')->count()), + TextEntry::make('updated_lines_count') + ->label('Módosult') + ->icon('heroicon-o-pencil-square') + ->color('primary') + ->getStateUsing(fn ($record) => $record->lines()->where('status', 'updated')->count()), + ]), + Grid::make(4)->schema([ + TextEntry::make('file_meta.preprocess.statistics.data_rows') + ->label('Adatsorok') + ->icon('heroicon-o-table-cells'), + TextEntry::make('file_meta.preprocess.statistics.column_count') + ->label('Oszlopok'), + TextEntry::make('file_meta.preprocess.file_info.file_size_human') + ->label('Fájlméret'), + TextEntry::make('file_meta.preprocess.duration_seconds') + ->label('Idő') + ->suffix(' mp'), + ]) + ->extraAttributes(['class' => 'mt-4 border-t pt-4']), + ]) + ->visible(fn ($record) => $record->lines()->exists() || !empty($record->file_meta['preprocess'] ?? [])), + + Section::make('Feldolgozási folyamat (Workflow)') + ->collapsible() + ->collapsed(fn ($record) => $record->status !== PricelistFileStatusEnum::inprogress) + ->schema([ + RepeatableEntry::make('workflow_steps') + ->label(false) + ->schema([ + TextEntry::make('label') + ->label('Lépés') + ->weight('bold') + ->inlineLabel(), + TextEntry::make('status') + ->label('Állapot') + ->badge() + ->inlineLabel() + ->formatStateUsing(fn (string $state): string => match ($state) { + 'pending' => 'várakozik', + 'inprogress' => 'folyamatban', + 'completed' => 'kész', + 'failed' => 'hiba', + default => $state, + }) + ->color(fn (string $state): string => match ($state) { + 'pending' => 'gray', + 'inprogress' => 'info', + 'completed' => 'success', + 'failed' => 'danger', + default => 'gray', + }) + ->icon(fn (string $state): string => match ($state) { + 'pending' => 'heroicon-o-clock', + 'inprogress' => 'heroicon-o-arrow-path', + 'completed' => 'heroicon-o-check-circle', + 'failed' => 'heroicon-o-x-circle', + default => 'heroicon-o-question-mark-circle', + }), + ]) + ->columns(2) + ->columnSpanFull(), + ]), - Section::make('Előfeldolgozás eredménye') - ->schema([ - Grid::make(4)->schema([ - TextEntry::make('file_meta.preprocess.statistics.data_rows') - ->label('Adatsorok') - ->icon('heroicon-o-table-cells'), - TextEntry::make('file_meta.preprocess.statistics.column_count') - ->label('Oszlopok száma'), - TextEntry::make('file_meta.preprocess.file_info.file_size_human') - ->label('Fájlméret'), - TextEntry::make('file_meta.preprocess.duration_seconds') - ->label('Feldolgozási idő') - ->suffix(' mp'), - ]), RepeatableEntry::make('file_meta.preprocess.warnings') - ->label('Figyelmeztetések') + ->label('Előfeldolgozási figyelmeztetések') ->schema([ TextEntry::make('message')->label('Leírás')->color('warning'), TextEntry::make('severity')->label('Súlyosság')->badge()->color('warning'), ]) ->visible(fn ($record) => !empty($record->file_meta['preprocess']['warnings'] ?? [])), + RepeatableEntry::make('file_meta.preprocess.errors') - ->label('Hibák') + ->label('Előfeldolgozási hibák') ->schema([ TextEntry::make('message')->label('Leírás')->color('danger'), TextEntry::make('severity')->label('Súlyosság')->badge()->color('danger'), ]) ->visible(fn ($record) => !empty($record->file_meta['preprocess']['errors'] ?? [])), - ]) - ->visible(fn ($record) => !empty($record->file_meta['preprocess'] ?? [])), - - Section::make('Feldolgozási folyamat (Workflow)') - ->schema([ - RepeatableEntry::make('workflow_steps') - ->label(false) - ->schema([ - TextEntry::make('label') - ->label('Lépés') - ->weight('bold') - ->inlineLabel(), - TextEntry::make('status') - ->label('Állapot') - ->badge() - ->inlineLabel() - ->formatStateUsing(fn (string $state): string => match ($state) { - 'pending' => 'várakozik', - 'inprogress' => 'folyamatban', - 'completed' => 'kész', - 'failed' => 'hiba', - default => $state, - }) - ->color(fn (string $state): string => match ($state) { - 'pending' => 'gray', - 'inprogress' => 'info', - 'completed' => 'success', - 'failed' => 'danger', - default => 'gray', - }) - ->icon(fn (string $state): string => match ($state) { - 'pending' => 'heroicon-o-clock', - 'inprogress' => 'heroicon-o-arrow-path', - 'completed' => 'heroicon-o-check-circle', - 'failed' => 'heroicon-o-x-circle', - default => 'heroicon-o-question-mark-circle', - }), - ]) - ->columns(2) - ->columnSpanFull(), ]), ]), ]),