Skip to content

Commit 3980fb4

Browse files
AkronimBlackbmadzaracStyleCIBot
authored
Add form templates #minor (#67)
* Add FormTemplate to forms * Apply fixes from StyleCI * Update to use getMorphClass Co-authored-by: bmadzarac <bojan.madzarac@asseco-see.hr> Co-authored-by: StyleCI Bot <bot@styleci.io>
1 parent b452a31 commit 3980fb4

File tree

9 files changed

+225
-1
lines changed

9 files changed

+225
-1
lines changed

config/asseco-custom-fields.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use Asseco\BlueprintAudit\App\MigrationMethodPicker;
44
use Asseco\CustomFields\App\Models\CustomField;
55
use Asseco\CustomFields\App\Models\Form;
6+
use Asseco\CustomFields\App\Models\FormTemplate;
67
use Asseco\CustomFields\App\Models\PlainType;
78
use Asseco\CustomFields\App\Models\Relation;
89
use Asseco\CustomFields\App\Models\RemoteType;
@@ -35,6 +36,7 @@
3536
'relation' => Relation::class,
3637
'validation' => Validation::class,
3738
'value' => Value::class,
39+
'form_template' => FormTemplate::class,
3840
],
3941

4042
'plain_types' => [
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
use Asseco\BlueprintAudit\App\MigrationMethodPicker;
4+
use Illuminate\Database\Migrations\Migration;
5+
use Illuminate\Database\Schema\Blueprint;
6+
use Illuminate\Support\Facades\Schema;
7+
8+
class CreateFormTemplatesTable extends Migration
9+
{
10+
/**
11+
* Run the migrations.
12+
*
13+
* @return void
14+
*/
15+
public function up()
16+
{
17+
Schema::create('form_templates', function (Blueprint $table) {
18+
if (config('asseco-custom-fields.migrations.uuid')) {
19+
$table->uuid('id')->primary();
20+
$table->foreignUuid('form_id')->constrained();
21+
} else {
22+
$table->id();
23+
$table->foreignId('form_id')->constrained();
24+
}
25+
26+
$table->string('name');
27+
MigrationMethodPicker::pick($table, config('asseco-custom-fields.migrations.timestamps'));
28+
});
29+
}
30+
31+
/**
32+
* Reverse the migrations.
33+
*
34+
* @return void
35+
*/
36+
public function down()
37+
{
38+
Schema::table('form_templates', function (Blueprint $table) {
39+
$table->dropIfExists('form_templates');
40+
});
41+
}
42+
}

routes/api.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use Asseco\CustomFields\App\Contracts\PlainType;
44
use Asseco\CustomFields\App\Http\Controllers\CustomFieldController;
55
use Asseco\CustomFields\App\Http\Controllers\FormController;
6+
use Asseco\CustomFields\App\Http\Controllers\FormTemplateController;
67
use Asseco\CustomFields\App\Http\Controllers\ModelController;
78
use Asseco\CustomFields\App\Http\Controllers\PlainCustomFieldController;
89
use Asseco\CustomFields\App\Http\Controllers\RelationController;
@@ -58,3 +59,4 @@
5859
Route::apiResource('forms', FormController::class);
5960
});
6061
});
62+
Route::apiResource('form-templates', FormTemplateController::class);

src/App/Contracts/FormTemplate.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
namespace Asseco\CustomFields\App\Contracts;
4+
5+
use Illuminate\Database\Eloquent\Model;
6+
7+
/**
8+
* @mixin Model|\Asseco\CustomFields\App\Models\FormTemplate
9+
*/
10+
interface FormTemplate
11+
{
12+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
<?php
2+
3+
namespace Asseco\CustomFields\App\Http\Controllers;
4+
5+
use Asseco\CustomFields\App\Contracts\FormTemplate as FormTemplateContract;
6+
use Asseco\CustomFields\App\Http\Requests\FormTemplateRequest;
7+
use Asseco\CustomFields\App\Models\FormTemplate;
8+
use Illuminate\Http\JsonResponse;
9+
use Illuminate\Support\Arr;
10+
11+
class FormTemplateController extends Controller
12+
{
13+
protected FormTemplateContract $formTemplate;
14+
15+
public function __construct(FormTemplateContract $formTemplate)
16+
{
17+
$this->formTemplate = $formTemplate;
18+
}
19+
20+
/**
21+
* Display a listing of the resource.
22+
*
23+
* @return JsonResponse
24+
*/
25+
public function index(): JsonResponse
26+
{
27+
return response()->json($this->formTemplate::all());
28+
}
29+
30+
/**
31+
* Store a newly created resource in storage.
32+
*
33+
* @param FormTemplateRequest $request
34+
* @return JsonResponse
35+
*/
36+
public function store(FormTemplateRequest $request): JsonResponse
37+
{
38+
$formTemplate = $this->formTemplate::query()
39+
->create(Arr::except($request->validated(), 'form_data'));
40+
41+
$formTemplate->createCustomFieldValues(Arr::get($request->validated(), 'form_data', []));
42+
43+
return response()->json($formTemplate->refresh()->load('customFieldValues.customField.selectable'), JsonResponse::HTTP_CREATED);
44+
}
45+
46+
/**
47+
* Display the specified resource.
48+
*
49+
* @param FormTemplate $formTemplate
50+
* @return JsonResponse
51+
*/
52+
public function show(FormTemplate $formTemplate): JsonResponse
53+
{
54+
return response()->json($formTemplate);
55+
}
56+
57+
/**
58+
* Update the specified resource in storage.
59+
*
60+
* @param FormTemplateRequest $request
61+
* @param FormTemplate $formTemplate
62+
* @return JsonResponse
63+
*/
64+
public function update(FormTemplateRequest $request, FormTemplate $formTemplate): JsonResponse
65+
{
66+
$formTemplate->createCustomFieldValues(Arr::get($request->validated(), 'form_data', []));
67+
$formTemplate->update(Arr::except($request->validated(), 'form_data'));
68+
69+
return response()->json($formTemplate->refresh()->load('customFieldValues.customField.selectable'));
70+
}
71+
72+
/**
73+
* Remove the specified resource from storage.
74+
*
75+
* @param FormTemplate $formTemplate
76+
* @return JsonResponse
77+
*/
78+
public function destroy(FormTemplate $formTemplate): JsonResponse
79+
{
80+
$isDeleted = $formTemplate->delete();
81+
82+
return response()->json($isDeleted ? 'true' : 'false');
83+
}
84+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace Asseco\CustomFields\App\Http\Requests;
4+
5+
use Illuminate\Foundation\Http\FormRequest as LaravelFormRequest;
6+
7+
class FormTemplateRequest extends LaravelFormRequest
8+
{
9+
public function rules()
10+
{
11+
return [
12+
'form_data' => 'array',
13+
'form_id' => 'required|string|exists:forms,id',
14+
'name' => 'required|string',
15+
];
16+
}
17+
}

src/App/Models/Form.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
namespace Asseco\CustomFields\App\Models;
66

77
use Asseco\CustomFields\App\Contracts\CustomField;
8+
use Asseco\CustomFields\App\Contracts\FormTemplate;
89
use Asseco\CustomFields\Database\Factories\FormFactory;
910
use Exception;
1011
use Illuminate\Database\Eloquent\Factories\HasFactory;
1112
use Illuminate\Database\Eloquent\Model;
1213
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
14+
use Illuminate\Database\Eloquent\Relations\HasMany;
1315
use Illuminate\Support\Arr;
1416

1517
class Form extends Model implements \Asseco\CustomFields\App\Contracts\Form
@@ -57,6 +59,11 @@ protected static function booted()
5759
});
5860
}
5961

62+
public function templates(): HasMany
63+
{
64+
return $this->hasMany(get_class(app(FormTemplate::class)));
65+
}
66+
6067
protected function relateCustomFieldsFromDefinition()
6168
{
6269
$components = Arr::get($this->definition, 'components', []);
@@ -153,7 +160,7 @@ public function createValues(array $formData, string $modelType, $modelId): arra
153160

154161
$values[] = $customField->values()->updateOrCreate([
155162
'model_type' => $modelType,
156-
'model_id' => $modelId,
163+
'model_id' => $modelId,
157164
],
158165
[$type => $formCustomField]
159166
);

src/App/Models/FormTemplate.php

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php
2+
3+
namespace Asseco\CustomFields\App\Models;
4+
5+
use Asseco\CustomFields\App\Contracts\Form;
6+
use Asseco\CustomFields\App\Traits\Customizable;
7+
use Illuminate\Database\Eloquent\Model;
8+
use Illuminate\Database\Eloquent\Relations\BelongsTo;
9+
use Illuminate\Support\Arr;
10+
11+
class FormTemplate extends Model implements \Asseco\CustomFields\App\Contracts\FormTemplate
12+
{
13+
use Customizable;
14+
15+
protected $guarded = ['id', 'created_at', 'updated_at'];
16+
17+
public function form(): BelongsTo
18+
{
19+
return $this->belongsTo(get_class(app(Form::class)));
20+
}
21+
22+
/**
23+
* @param array $formData
24+
* @return array
25+
*/
26+
public function createCustomFieldValues(array $formData = []): array
27+
{
28+
if (empty($formData)) {
29+
return [];
30+
}
31+
32+
$values = [];
33+
34+
/**
35+
* @var \Asseco\CustomFields\App\Contracts\CustomField $customField
36+
*/
37+
foreach ($this->form->customFields as $customField) {
38+
$formCustomField = Arr::get($formData, $customField->name);
39+
40+
if (!$formCustomField) {
41+
continue;
42+
}
43+
44+
$type = $customField->getValueColumn();
45+
46+
$values[] = $customField->values()->updateOrCreate([
47+
'model_type' => $this->getMorphClass(),
48+
'model_id' => $this->id,
49+
],
50+
[$type => $formCustomField]
51+
);
52+
}
53+
54+
return $values;
55+
}
56+
}

src/CustomFieldsServiceProvider.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use Asseco\CustomFields\App\Contracts\CustomField;
88
use Asseco\CustomFields\App\Contracts\Form;
9+
use Asseco\CustomFields\App\Contracts\FormTemplate;
910
use Asseco\CustomFields\App\Contracts\PlainType;
1011
use Asseco\CustomFields\App\Contracts\PlainTypes\BooleanType;
1112
use Asseco\CustomFields\App\Contracts\PlainTypes\DateTimeType;
@@ -69,6 +70,7 @@ protected function bindClasses()
6970
$this->app->bind(Relation::class, config('asseco-custom-fields.models.relation'));
7071
$this->app->bind(Validation::class, config('asseco-custom-fields.models.validation'));
7172
$this->app->bind(Value::class, config('asseco-custom-fields.models.value'));
73+
$this->app->bind(FormTemplate::class, config('asseco-custom-fields.models.form_template'));
7274

7375
$this->app->bind(BooleanType::class, config('asseco-custom-fields.plain_types.boolean'));
7476
$this->app->bind(DateTimeType::class, config('asseco-custom-fields.plain_types.date_time'));

0 commit comments

Comments
 (0)