diff --git a/docs/introduction.md b/docs/introduction.md index 691ab4c3..3915d911 100644 --- a/docs/introduction.md +++ b/docs/introduction.md @@ -48,8 +48,8 @@ included a UI for the frontend bilt with filament - 🔥 show responses for each form - 🔥 search in all responses filtering on the dynamic fields (soon) - 🔥 set status for each response -- 🔥 exporting -- 🔥 clone form with `ReplicateAction` (soon) +- 🔥 export or print form with its fields +- 🔥 Replicate forms with its sections and fields - 🔥 form reports - 🔥 exam module (set correct answer, the mark for each question, auto correction for all responses, send the mark to the user, and display the result) (soon) - 🔥 poll module (custom layout to show the form as a poll, and display the result as chart) (soon) diff --git a/resources/lang/ar.json b/resources/lang/ar.json index 417f6a80..cb89460b 100644 --- a/resources/lang/ar.json +++ b/resources/lang/ar.json @@ -155,5 +155,6 @@ "ipv4": "رقم IP 4", "ipv6": "رقم IP 6", "mac address": "عنوان ماك", + "Replicate": "تكرار", "Export": "تصدير" } diff --git a/src/Filament/Resources/FormResource.php b/src/Filament/Resources/FormResource.php index 7c97730d..9fb2cd53 100644 --- a/src/Filament/Resources/FormResource.php +++ b/src/Filament/Resources/FormResource.php @@ -2,11 +2,13 @@ namespace LaraZeus\Bolt\Filament\Resources; +use Filament\Forms\Components\TextInput; use Filament\Resources\Form; use Filament\Resources\Table; use Filament\Tables\Actions\Action; use Filament\Tables\Actions\ActionGroup; use Filament\Tables\Actions\EditAction; +use Filament\Tables\Actions\ReplicateAction; use Filament\Tables\Actions\ViewAction; use Filament\Tables\Columns\IconColumn; use Filament\Tables\Columns\TextColumn; @@ -93,6 +95,28 @@ public static function table(Table $table): Table ->tooltip(__('view form')) ->url(fn (ZeusForm $record): string => route('bolt.form.show', $record)) ->openUrlInNewTab(), + + ReplicateAction::make() + ->label(__('Replicate')) + ->excludeAttributes(['name', 'slug']) + ->form([ + TextInput::make('name.' . app()->getLocale())->required(), + TextInput::make('slug')->required(), + ]) + ->beforeReplicaSaved(function (ZeusForm $replica, ZeusForm $record, array $data): void { + $repForm = $replica->fill($data); + $repForm->save(); + $formID = $repForm->id; + $record->sections->each(function ($item) use ($formID) { + $repSec = $item->replicate()->fill(['form_id' => $formID]); + $repSec->save(); + $sectionID = $repSec->id; + $item->fields->each(function ($item) use ($sectionID) { + $repField = $item->replicate()->fill(['section_id' => $sectionID]); + $repField->save(); + }); + }); + }), ]), ]) ->filters([ diff --git a/src/Models/Section.php b/src/Models/Section.php index 272e4dde..500e61d9 100644 --- a/src/Models/Section.php +++ b/src/Models/Section.php @@ -5,6 +5,7 @@ use Database\Factories\SectionFactory; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\SoftDeletes; use Spatie\Translatable\HasTranslations; @@ -26,9 +27,10 @@ protected static function newFactory() return SectionFactory::new(); } - public function fields() + /** @phpstan-return hasMany */ + public function fields(): HasMany { - return $this->hasMany(config('zeus-bolt.models.Field'), 'section_id', 'id')->orderBy('ordering'); + return $this->hasMany(config('zeus-bolt.models.Field'), 'section_id', 'id'); } public function form()