feat: implement module generator with dynamic datagrid components and schema migration support

This commit is contained in:
Ümit Tunç
2026-04-28 23:55:39 +03:00
parent 74901dc3c6
commit 90d0a2a041
6 changed files with 274 additions and 107 deletions
@@ -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 = "<?php\n\nuse Illuminate\Database\Migrations\Migration;\nuse Illuminate\Database\Schema\Blueprint;\nuse Illuminate\Support\Facades\Schema;\n\nclass Create" . Str::studly($tableName) . "Table extends Migration\n{\n public function up()\n {\n Schema::create('{$tableName}', function (Blueprint \$table) {\n \$table->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";