feat(generation): add retry action for failed template generations and update related schemas

This commit is contained in:
2026-08-21 14:53:19 +03:30
parent e58dcd8581
commit fe2090a5af
5 changed files with 100 additions and 0 deletions

View File

@@ -0,0 +1,41 @@
<?php
namespace App\Filament\Resources\TemplateGenerations\Actions;
use App\Enums\TemplateGenerationStatus;
use App\Jobs\GenerateTemplateJob;
use App\Models\TemplateGeneration;
use Filament\Actions\Action;
use Filament\Notifications\Notification;
use Filament\Support\Icons\Heroicon;
/**
* Re-runs the pptx fill step for a failed generation using its already-stored
* values (including any AI-generated text), without calling the AI service again.
*/
class RetryGenerationAction
{
public static function make(): Action
{
return Action::make('retry')
->label('تلاش دوباره')
->icon(Heroicon::OutlinedArrowPath)
->color('warning')
->requiresConfirmation()
->modalDescription('فایل پاورپوینت با همان محتوایی که قبلاً (از جمله متن‌های تولیدشده با هوش مصنوعی) ذخیره شده، دوباره ساخته می‌شود. نیازی به تماس مجدد با هوش مصنوعی نیست.')
->visible(fn (TemplateGeneration $record): bool => $record->status === TemplateGenerationStatus::Failed)
->action(function (TemplateGeneration $record): void {
$record->update([
'status' => TemplateGenerationStatus::Pending,
'error_message' => null,
]);
GenerateTemplateJob::dispatch($record);
Notification::make()
->title('درخواست دوباره ارسال شد')
->success()
->send();
});
}
}

View File

@@ -0,0 +1,48 @@
<?php
namespace App\Filament\Resources\TemplateGenerations\Schemas;
use App\Enums\TemplateGenerationStatus;
use Filament\Infolists\Components\KeyValueEntry;
use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Schema;
class TemplateGenerationInfolist
{
public static function configure(Schema $schema): Schema
{
return $schema
->components([
TextEntry::make('uuid')
->label('شناسه')
->copyable(),
TextEntry::make('template.title')
->label('قالب'),
TextEntry::make('status')
->label('وضعیت')
->badge()
->formatStateUsing(fn (TemplateGenerationStatus $state): string => $state->label())
->color(fn (TemplateGenerationStatus $state): string => match ($state) {
TemplateGenerationStatus::Pending => 'gray',
TemplateGenerationStatus::Processing => 'warning',
TemplateGenerationStatus::Completed => 'success',
TemplateGenerationStatus::Failed => 'danger',
}),
TextEntry::make('requester.name')
->label('درخواست‌دهنده')
->placeholder('—'),
TextEntry::make('error_message')
->label('پیام خطا')
->placeholder('—')
->columnSpanFull(),
KeyValueEntry::make('values')
->label('محتوای ذخیره‌شده (از جمله متن‌های تولیدشده با هوش مصنوعی)')
->keyLabel('کلید')
->valueLabel('مقدار')
->columnSpanFull(),
TextEntry::make('created_at')
->label('تاریخ ایجاد')
->dateTime(),
]);
}
}

View File

@@ -4,6 +4,7 @@ namespace App\Filament\Resources\TemplateGenerations\Tables;
use App\Enums\TemplateGenerationStatus;
use App\Filament\Resources\TemplateGenerations\Actions\DownloadGenerationAction;
use App\Filament\Resources\TemplateGenerations\Actions\RetryGenerationAction;
use Filament\Actions\ViewAction;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter;
@@ -60,6 +61,7 @@ class TemplateGenerationsTable
->recordActions([
ViewAction::make(),
DownloadGenerationAction::make(),
RetryGenerationAction::make(),
]);
}
}

View File

@@ -4,10 +4,12 @@ namespace App\Filament\Resources\TemplateGenerations;
use App\Filament\Resources\TemplateGenerations\Pages\ListTemplateGenerations;
use App\Filament\Resources\TemplateGenerations\Pages\ViewTemplateGeneration;
use App\Filament\Resources\TemplateGenerations\Schemas\TemplateGenerationInfolist;
use App\Filament\Resources\TemplateGenerations\Tables\TemplateGenerationsTable;
use App\Models\TemplateGeneration;
use BackedEnum;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Support\Icons\Heroicon;
use Filament\Tables\Table;
use UnitEnum;
@@ -35,6 +37,11 @@ class TemplateGenerationResource extends Resource
return TemplateGenerationsTable::configure($table);
}
public static function infolist(Schema $schema): Schema
{
return TemplateGenerationInfolist::configure($schema);
}
public static function getPages(): array
{
return [