components([ Section::make(null) ->poll('5s') ->columnSpanFull() ->maxWidth(Width::Full) ->schema([ Grid::make(2) ->columnSpanFull() ->maxWidth(Width::Full) ->schema([ Section::make('Fájl információk') ->schema([ 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 dátuma') ->date('Y.m.d'), TextEntry::make('created_at') ->label('Feltöltés időpontja') ->dateTime('Y.m.d H:i'), TextEntry::make('processing_current_step') ->label('Aktuális folyamat') ->weight('bold') ->color('info') ->formatStateUsing(fn ($state, $record) => "$state ({$record->processing_current_step_percentage}%)"), ]), TextEntry::make('note') ->label('Megjegyzés') ->placeholder('Nincs megjegyzés') ->columnSpanFull(), ]), Section::make('Validáció statisztika') ->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('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') ->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') ->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(), ]), ]), ]), ]); } }