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(
'
' .
collect($record->validation_messages ?? [])->map(fn ($msg) => "- $msg
")->join('') .
'
'
)),
])
->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');
}
}