From 90d0a2a041d2a392f2f9fc83e099f3649ea002a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=9Cmit=20Tun=C3=A7?= Date: Tue, 28 Apr 2026 23:55:39 +0300 Subject: [PATCH] feat: implement module generator with dynamic datagrid components and schema migration support --- .../Controllers/ModuleGeneratorController.php | 44 ++- .../views/admin/module-generator.blade.php | 302 ++++++++++++------ .../table/datagrid/boolean.blade.php | 19 ++ .../table/datagrid/select.blade.php | 5 +- .../table/datagrid/separator.blade.php | 8 + .../template/js-multiple-choice.blade.php | 3 +- 6 files changed, 274 insertions(+), 107 deletions(-) create mode 100644 resources/views/components/table/datagrid/boolean.blade.php create mode 100644 resources/views/components/table/datagrid/separator.blade.php diff --git a/app/Http/Controllers/ModuleGeneratorController.php b/app/Http/Controllers/ModuleGeneratorController.php index 5b9f250..a94d907 100644 --- a/app/Http/Controllers/ModuleGeneratorController.php +++ b/app/Http/Controllers/ModuleGeneratorController.php @@ -28,8 +28,6 @@ class ModuleGeneratorController extends Controller $request->validate([ 'title' => 'required|string|max:255', 'columns' => 'required|array', - 'columns.*.name' => 'required|string', - 'columns.*.type' => 'required|string', ]); $title = $request->title; @@ -45,8 +43,10 @@ class ModuleGeneratorController extends Controller $migrationContent = "id();\n"; foreach ($request->columns as $column) { - $colName = Str::snake($column['name']); $uiType = $column['type']; + if ($uiType === 'separator') continue; // No column for separator + + $colName = Str::snake($column['name']); $dbType = 'string'; switch ($uiType) { @@ -57,6 +57,7 @@ class ModuleGeneratorController extends Controller case 'time': $dbType = 'time'; break; case 'long-text': $dbType = 'longText'; break; case 'boolean': $dbType = 'boolean'; break; + case 'multiple-choice': $dbType = 'text'; break; // Use text for multiple selection default: $dbType = 'string'; break; } @@ -99,9 +100,40 @@ class ModuleGeneratorController extends Controller // Generate relationDatas $relationDatasCode = "[\n"; foreach ($request->columns as $column) { + $uiType = $column['type']; + if ($uiType === 'separator') { + $label = $column['label'] ?? 'Separator'; + $relationDatasCode .= " 'separator_" . rand(100, 999) . "' => [\n 'type' => 'separator',\n 'label' => '{$label}',\n ],\n"; + continue; + } + $colName = Str::snake($column['name']); - $colType = $column['type']; - $relationDatasCode .= " '{$colName}' => [\n 'type' => '{$colType}',\n ],\n"; + $relationDatasCode .= " '{$colName}' => [\n 'type' => '{$uiType}',\n"; + + if ($uiType === 'select' || $uiType === 'multiple-choice') { + $optionsStr = $column['options'] ?? ''; + $optionsArr = array_map('trim', explode(',', $optionsStr)); + $relationDatasCode .= " 'datas' => [\n"; + foreach ($optionsArr as $opt) { + if (empty($opt)) continue; + $relationDatasCode .= " ['id' => '{$opt}', 'name' => '{$opt}'],\n"; + } + $relationDatasCode .= " ],\n"; + if ($uiType === 'select') { + $relationDatasCode .= " 'value' => 'id',\n"; + } + if ($uiType === 'multiple-choice') { + $relationDatasCode .= " 'pattern' => '{name}',\n"; + $relationDatasCode .= " 'seperator' => ',',\n"; + } + } elseif ($uiType === 'select-dropdown') { + $source = $column['source'] ?? ''; + $relationDatasCode .= " 'dataSource' => '{$source}',\n"; + $relationDatasCode .= " 'datas' => [],\n"; + $relationDatasCode .= " 'pattern' => '{name}',\n"; + } + + $relationDatasCode .= " ],\n"; } $relationDatasCode .= "]"; @@ -125,7 +157,7 @@ class ModuleGeneratorController extends Controller $type->slug = $slug; $type->icon = $iconName; $type->enabled = 1; - $type->full_control = "1"; // Default admin level + $type->full_control = "1"; $type->write = "1"; $type->read = "1"; $type->modify = "1"; diff --git a/resources/views/admin/module-generator.blade.php b/resources/views/admin/module-generator.blade.php index 9b3c5f0..658a76d 100644 --- a/resources/views/admin/module-generator.blade.php +++ b/resources/views/admin/module-generator.blade.php @@ -1,123 +1,231 @@ @extends('admin.master') -@section("title", e2("Module Generator")) -@section("desc", e2("Create a new module with model, migration and view automatically.")) +@section("title", e2("Module Generator Wizard")) +@section("desc", e2("Follow the steps to create a complex module.")) @section('content')
-
- @csrf -
-
-

{{e2("Module Basic Information")}}

-
-
-
-
-
- - -
-
-
-
- - - Recommended size: 64x64px. Saved to assets/icons/ -
-
-
-
-
+
+ + -
-
-

{{e2("Database Columns")}}

-
- + + @csrf +
+ +
+
+
+
+ + +
+
+ +
+ + +
+
+
+ +
+
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + +
{{e2("Column Name")}}{{e2("Type")}}{{e2("Advanced Config")}}
+ + + + +
+ {{e2("No extra config needed")}} +
+
+ +
+
+
+ +
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + {{e2("Default permissions will be assigned to Level 1 (Admin). You can adjust them later in System Settings.")}} +
+

{{e2("Ready to generate?")}}

+

{{e2("This will create a Migration, Model, and a Blade View.")}}

+ +
+ +
+ + +
+
-
-
- - - - - - - - - - - - - - - -
{{e2("Column Name")}}{{e2("Type")}}{{e2("Action")}}
- - - - - -
-
-
- -
-
-
- + +
@section('scripts')