diff --git a/src/Tasks/AddRegularFields.php b/src/Tasks/AddRegularFields.php index 97aea83..8142b6b 100644 --- a/src/Tasks/AddRegularFields.php +++ b/src/Tasks/AddRegularFields.php @@ -2,11 +2,11 @@ namespace Naoray\BlueprintNovaAddon\Tasks; -use Blueprint\Models\Column; -use Blueprint\Models\Model; -use Blueprint\Translators\Rules; use Closure; +use Blueprint\Models\Model; +use Blueprint\Models\Column; use Illuminate\Support\Collection; +use Naoray\BlueprintNovaAddon\Translators\Rules; class AddRegularFields { @@ -31,14 +31,14 @@ public function handle($data, Closure $next): array $fieldType = $this->fieldType($column->dataType()); $imports[] = $fieldType; - $field = $fieldType."::make('".$this->fieldLabel($column->name())."')"; + $field = $fieldType . "::make('" . $this->fieldLabel($column->name()) . "')"; $field .= $this->addRules($column); if ($column->dataType() === 'json') { - $field .= PHP_EOL.self::INDENT_PLUS.'->json()'; + $field .= PHP_EOL . self::INDENT_PLUS . '->json()'; } - $fields .= self::INDENT.$field.','.PHP_EOL.PHP_EOL; + $fields .= self::INDENT . $field . ',' . PHP_EOL . PHP_EOL; } $data['fields'] = $fields; @@ -52,7 +52,7 @@ private function regularColumns(array $columns): Collection return collect($columns) ->filter(function (Column $column) { return $column->dataType() !== 'id' - && ! collect(['id', 'deleted_at', 'created_at', 'updated_at'])->contains($column->name()); + && !collect(['id', 'deleted_at', 'created_at', 'updated_at'])->contains($column->name()); }); } @@ -63,31 +63,19 @@ private function fieldLabel($name): string private function addRules(Column $column): string { - $fieldRules = ''; - - if (! in_array($column->dataType(), ['id'])) { - $rules = Rules::fromColumn($this->model->tableName(), $column); - - if ($column->dataType() === 'json') { - array_push($rules, 'json'); - } - - if (in_array('nullable', $column->modifiers())) { - $rules = array_filter($rules, function ($rule) { - return $rule !== 'required'; - }); - } + if (in_array($column->dataType(), ['id'])) { + return ''; + } - $rules = array_map(function ($rule) { - return " '".$rule."'"; - }, $rules); + $rules = array_map(function ($rule) { + return " '" . $rule . "'"; + }, Rules::fromColumn($this->model->tableName(), $column)); - if (! empty($rules)) { - $fieldRules .= PHP_EOL.self::INDENT_PLUS.'->rules('.trim(implode(',', $rules)).')'; - } + if (empty($rules)) { + return ''; } - return $fieldRules; + return PHP_EOL . self::INDENT_PLUS . '->rules(' . trim(implode(',', $rules)) . ')'; } private function fieldType(string $dataType) diff --git a/src/Translators/Rules.php b/src/Translators/Rules.php new file mode 100644 index 0000000..4583447 --- /dev/null +++ b/src/Translators/Rules.php @@ -0,0 +1,26 @@ +dataType() === 'json') { + array_push($rules, 'json'); + } + + if (in_array('nullable', $column->modifiers())) { + $rules = array_filter($rules, function ($rule) { + return $rule !== 'required'; + }); + } + + return $rules; + } +} diff --git a/tests/RulesTranslatorTest.php b/tests/RulesTranslatorTest.php new file mode 100644 index 0000000..ae2aef0 --- /dev/null +++ b/tests/RulesTranslatorTest.php @@ -0,0 +1,33 @@ +assertEquals(['required'], Rules::fromColumn('context', $column)); + } + + /** @test */ + public function forColumn_returns_rejects_required_rule_for_the_nullable_modifier() + { + $column = new Column('test', 'unknown', ['nullable']); + + $this->assertEquals([], Rules::fromColumn('context', $column)); + } + + /** @test */ + public function forColumn_returns_json_for_the_json_type() + { + $column = new Column('test', 'json'); + + $this->assertContains('json', Rules::fromColumn('context', $column)); + } +}