feat: implement module generator with dynamic datagrid components and schema migration support
This commit is contained in:
@@ -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";
|
||||
|
||||
Reference in New Issue
Block a user