feat(generation): add retry action for failed template generations and update related schemas
This commit is contained in:
@@ -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();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,6 +4,7 @@ namespace App\Filament\Resources\TemplateGenerations\Tables;
|
|||||||
|
|
||||||
use App\Enums\TemplateGenerationStatus;
|
use App\Enums\TemplateGenerationStatus;
|
||||||
use App\Filament\Resources\TemplateGenerations\Actions\DownloadGenerationAction;
|
use App\Filament\Resources\TemplateGenerations\Actions\DownloadGenerationAction;
|
||||||
|
use App\Filament\Resources\TemplateGenerations\Actions\RetryGenerationAction;
|
||||||
use Filament\Actions\ViewAction;
|
use Filament\Actions\ViewAction;
|
||||||
use Filament\Tables\Columns\TextColumn;
|
use Filament\Tables\Columns\TextColumn;
|
||||||
use Filament\Tables\Filters\SelectFilter;
|
use Filament\Tables\Filters\SelectFilter;
|
||||||
@@ -60,6 +61,7 @@ class TemplateGenerationsTable
|
|||||||
->recordActions([
|
->recordActions([
|
||||||
ViewAction::make(),
|
ViewAction::make(),
|
||||||
DownloadGenerationAction::make(),
|
DownloadGenerationAction::make(),
|
||||||
|
RetryGenerationAction::make(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,10 +4,12 @@ namespace App\Filament\Resources\TemplateGenerations;
|
|||||||
|
|
||||||
use App\Filament\Resources\TemplateGenerations\Pages\ListTemplateGenerations;
|
use App\Filament\Resources\TemplateGenerations\Pages\ListTemplateGenerations;
|
||||||
use App\Filament\Resources\TemplateGenerations\Pages\ViewTemplateGeneration;
|
use App\Filament\Resources\TemplateGenerations\Pages\ViewTemplateGeneration;
|
||||||
|
use App\Filament\Resources\TemplateGenerations\Schemas\TemplateGenerationInfolist;
|
||||||
use App\Filament\Resources\TemplateGenerations\Tables\TemplateGenerationsTable;
|
use App\Filament\Resources\TemplateGenerations\Tables\TemplateGenerationsTable;
|
||||||
use App\Models\TemplateGeneration;
|
use App\Models\TemplateGeneration;
|
||||||
use BackedEnum;
|
use BackedEnum;
|
||||||
use Filament\Resources\Resource;
|
use Filament\Resources\Resource;
|
||||||
|
use Filament\Schemas\Schema;
|
||||||
use Filament\Support\Icons\Heroicon;
|
use Filament\Support\Icons\Heroicon;
|
||||||
use Filament\Tables\Table;
|
use Filament\Tables\Table;
|
||||||
use UnitEnum;
|
use UnitEnum;
|
||||||
@@ -35,6 +37,11 @@ class TemplateGenerationResource extends Resource
|
|||||||
return TemplateGenerationsTable::configure($table);
|
return TemplateGenerationsTable::configure($table);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function infolist(Schema $schema): Schema
|
||||||
|
{
|
||||||
|
return TemplateGenerationInfolist::configure($schema);
|
||||||
|
}
|
||||||
|
|
||||||
public static function getPages(): array
|
public static function getPages(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ namespace App\Filament\Resources\Templates\RelationManagers;
|
|||||||
|
|
||||||
use App\Enums\TemplateGenerationStatus;
|
use App\Enums\TemplateGenerationStatus;
|
||||||
use App\Filament\Resources\TemplateGenerations\Actions\DownloadGenerationAction;
|
use App\Filament\Resources\TemplateGenerations\Actions\DownloadGenerationAction;
|
||||||
|
use App\Filament\Resources\TemplateGenerations\Actions\RetryGenerationAction;
|
||||||
use Filament\Resources\RelationManagers\RelationManager;
|
use Filament\Resources\RelationManagers\RelationManager;
|
||||||
use Filament\Tables\Columns\TextColumn;
|
use Filament\Tables\Columns\TextColumn;
|
||||||
use Filament\Tables\Filters\SelectFilter;
|
use Filament\Tables\Filters\SelectFilter;
|
||||||
@@ -63,6 +64,7 @@ class GenerationsRelationManager extends RelationManager
|
|||||||
])
|
])
|
||||||
->recordActions([
|
->recordActions([
|
||||||
DownloadGenerationAction::make(),
|
DownloadGenerationAction::make(),
|
||||||
|
RetryGenerationAction::make(),
|
||||||
])
|
])
|
||||||
->toolbarActions([]);
|
->toolbarActions([]);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user