components([ Grid::make(2) ->schema([ TextEntry::make('row_number') ->label('Sor száma'), TextEntry::make('status') ->label('Státusz') ->badge() ->color(fn (PricelistFileLineStatusEnum $state) => $state->color()) ->formatStateUsing(fn (PricelistFileLineStatusEnum $state) => $state->label()), ]), Section::make('Adatok') ->schema([ KeyValue::make('payload') ->label('Excel adatok') ->columnSpanFull(), ]), Section::make('Validációs üzenetek') ->schema([ Placeholder::make('validation_messages_list') ->label(false) ->content(fn ($record) => new HtmlString( '' )), ]) ->visible(fn ($record) => !empty($record->validation_messages)), ]); } public function table(Table $table): Table { return $table ->recordTitleAttribute('id') ->columns([ TextColumn::make('row_number') ->label('#') ->sortable() ->width('50px'), TextColumn::make('status') ->label('Státusz') ->badge() ->color(fn (PricelistFileLineStatusEnum $state) => $state->color()) ->formatStateUsing(fn (PricelistFileLineStatusEnum $state) => $state->label()) ->icon(fn (PricelistFileLineStatusEnum $state) => $state->icon()) ->sortable(), TextColumn::make('product_info') ->label('Termék') ->description(fn ($record) => $record->payload['Termék megnevezése'] ?? '') ->getStateUsing(fn ($record) => $record->payload['Szállítói cikkszám'] ?? 'N/A') ->searchable(query: function ($query, string $search) { $query->where('payload->Szállítói cikkszám', 'like', "%{$search}%") ->orWhere('payload->Termék megnevezése', 'like', "%{$search}%"); }), TextColumn::make('price_diff') ->label('Árváltozás') ->html() ->getStateUsing(function ($record) { $oldPrice = $record->diff['changes']['price']['old'] ?? null; $newPrice = $record->payload['Új számlázási nettó ár'] ?? null; if ($oldPrice === null) { return number_format((float)$newPrice, 2, ',', ' ') . ' Ft'; } $diffPercent = (($newPrice / $oldPrice) - 1) * 100; $colorClass = $diffPercent > 0 ? 'text-danger-600' : ($diffPercent < 0 ? 'text-success-600' : 'text-gray-600'); $icon = $diffPercent > 0 ? '↑' : ($diffPercent < 0 ? '↓' : ''); return sprintf( '
%s Ft %s Ft %s %s%%
', number_format($oldPrice, 2, ',', ' '), number_format((float)$newPrice, 2, ',', ' '), $colorClass, $icon, number_format(abs($diffPercent), 1, ',', ' ') ); }) ->visible(fn ($livewire) => $livewire->getOwnerRecord()->status !== PricelistFileStatusEnum::todo), TextColumn::make('validation_messages') ->label('Megjegyzés') ->listWithLineBreaks() ->bulleted() ->color(fn ($state) => collect($state)->contains(fn ($msg) => str_contains($msg, 'Hiányzó') || str_contains($msg, 'Ismeretlen') || str_contains($msg, 'Érvénytelen')) ? 'danger' : 'info') ->getStateUsing(fn ($record) => $record->validation_messages ?? []), ]) ->filters([ SelectFilter::make('status') ->label('Státusz') ->options(collect(PricelistFileLineStatusEnum::cases())->mapWithKeys(fn ($e) => [$e->value => $e->label()])), ]) ->headerActions([ // ]) ->actions([ ViewAction::make() ->slideOver(), ]) ->bulkActions([ // ]) ->defaultSort('row_number', 'asc') ->striped() ->poll('5s'); } }