diff --git a/resources/views/extend/forms/fields.antlers.html b/resources/views/extend/forms/antlers/fields.antlers.html similarity index 100% rename from resources/views/extend/forms/fields.antlers.html rename to resources/views/extend/forms/antlers/fields.antlers.html diff --git a/resources/views/extend/forms/fields/assets.antlers.html b/resources/views/extend/forms/antlers/fields/assets.antlers.html similarity index 100% rename from resources/views/extend/forms/fields/assets.antlers.html rename to resources/views/extend/forms/antlers/fields/assets.antlers.html diff --git a/resources/views/extend/forms/fields/checkboxes.antlers.html b/resources/views/extend/forms/antlers/fields/checkboxes.antlers.html similarity index 100% rename from resources/views/extend/forms/fields/checkboxes.antlers.html rename to resources/views/extend/forms/antlers/fields/checkboxes.antlers.html diff --git a/resources/views/extend/forms/fields/default.antlers.html b/resources/views/extend/forms/antlers/fields/default.antlers.html similarity index 100% rename from resources/views/extend/forms/fields/default.antlers.html rename to resources/views/extend/forms/antlers/fields/default.antlers.html diff --git a/resources/views/extend/forms/fields/dictionary.antlers.html b/resources/views/extend/forms/antlers/fields/dictionary.antlers.html similarity index 100% rename from resources/views/extend/forms/fields/dictionary.antlers.html rename to resources/views/extend/forms/antlers/fields/dictionary.antlers.html diff --git a/resources/views/extend/forms/fields/files.antlers.html b/resources/views/extend/forms/antlers/fields/files.antlers.html similarity index 100% rename from resources/views/extend/forms/fields/files.antlers.html rename to resources/views/extend/forms/antlers/fields/files.antlers.html diff --git a/resources/views/extend/forms/fields/group.antlers.html b/resources/views/extend/forms/antlers/fields/group.antlers.html similarity index 100% rename from resources/views/extend/forms/fields/group.antlers.html rename to resources/views/extend/forms/antlers/fields/group.antlers.html diff --git a/resources/views/extend/forms/fields/hidden.antlers.html b/resources/views/extend/forms/antlers/fields/hidden.antlers.html similarity index 100% rename from resources/views/extend/forms/fields/hidden.antlers.html rename to resources/views/extend/forms/antlers/fields/hidden.antlers.html diff --git a/resources/views/extend/forms/fields/integer.antlers.html b/resources/views/extend/forms/antlers/fields/integer.antlers.html similarity index 72% rename from resources/views/extend/forms/fields/integer.antlers.html rename to resources/views/extend/forms/antlers/fields/integer.antlers.html index 988791d65d2..cc4d2b7e1e1 100644 --- a/resources/views/extend/forms/fields/integer.antlers.html +++ b/resources/views/extend/forms/antlers/fields/integer.antlers.html @@ -1,4 +1,5 @@ diff --git a/resources/views/extend/forms/fields/radio.antlers.html b/resources/views/extend/forms/antlers/fields/radio.antlers.html similarity index 100% rename from resources/views/extend/forms/fields/radio.antlers.html rename to resources/views/extend/forms/antlers/fields/radio.antlers.html diff --git a/resources/views/extend/forms/fields/select.antlers.html b/resources/views/extend/forms/antlers/fields/select.antlers.html similarity index 100% rename from resources/views/extend/forms/fields/select.antlers.html rename to resources/views/extend/forms/antlers/fields/select.antlers.html diff --git a/resources/views/extend/forms/fields/spacer.antlers.html b/resources/views/extend/forms/antlers/fields/spacer.antlers.html similarity index 100% rename from resources/views/extend/forms/fields/spacer.antlers.html rename to resources/views/extend/forms/antlers/fields/spacer.antlers.html diff --git a/resources/views/extend/forms/fields/text.antlers.html b/resources/views/extend/forms/antlers/fields/text.antlers.html similarity index 100% rename from resources/views/extend/forms/fields/text.antlers.html rename to resources/views/extend/forms/antlers/fields/text.antlers.html diff --git a/resources/views/extend/forms/fields/textarea.antlers.html b/resources/views/extend/forms/antlers/fields/textarea.antlers.html similarity index 100% rename from resources/views/extend/forms/fields/textarea.antlers.html rename to resources/views/extend/forms/antlers/fields/textarea.antlers.html diff --git a/resources/views/extend/forms/fields/toggle.antlers.html b/resources/views/extend/forms/antlers/fields/toggle.antlers.html similarity index 100% rename from resources/views/extend/forms/fields/toggle.antlers.html rename to resources/views/extend/forms/antlers/fields/toggle.antlers.html diff --git a/resources/views/extend/forms/blade/fields.blade.php b/resources/views/extend/forms/blade/fields.blade.php new file mode 100644 index 00000000000..6c457637923 --- /dev/null +++ b/resources/views/extend/forms/blade/fields.blade.php @@ -0,0 +1,28 @@ +@php + use function Statamic\trans as __; +@endphp +@foreach ($fields as $field) +
+ + +
{!! $field['field'] !!}
+ + @if ($field['instructions'] ?? false) +

+ {{ $field['instructions'] }} +

+ @endif + + @if ($field['error'] ?? false) +

+ {{ $field['error'] }} +

+ @endif +
+@endforeach diff --git a/resources/views/extend/forms/blade/fields/assets.blade.php b/resources/views/extend/forms/blade/fields/assets.blade.php new file mode 100644 index 00000000000..b42537f0860 --- /dev/null +++ b/resources/views/extend/forms/blade/fields/assets.blade.php @@ -0,0 +1,22 @@ +@php + $isMultiple = ! isset($max_files) || $max_files !== 1; + $fieldName = $name; + + if ($isMultiple) { + $fieldName .= '[]'; + } +@endphp + + diff --git a/resources/views/extend/forms/blade/fields/checkboxes.blade.php b/resources/views/extend/forms/blade/fields/checkboxes.blade.php new file mode 100644 index 00000000000..ce24cf3cd60 --- /dev/null +++ b/resources/views/extend/forms/blade/fields/checkboxes.blade.php @@ -0,0 +1,25 @@ +@php + $inline = isset($inline) && $inline === true; +@endphp + + +@foreach ($options as $option => $label) + + @unless ($inline)
@endunless +@endforeach diff --git a/resources/views/extend/forms/blade/fields/default.blade.php b/resources/views/extend/forms/blade/fields/default.blade.php new file mode 100644 index 00000000000..db78b8b94c9 --- /dev/null +++ b/resources/views/extend/forms/blade/fields/default.blade.php @@ -0,0 +1,15 @@ + diff --git a/resources/views/extend/forms/blade/fields/dictionary.blade.php b/resources/views/extend/forms/blade/fields/dictionary.blade.php new file mode 100644 index 00000000000..2d04fb3e826 --- /dev/null +++ b/resources/views/extend/forms/blade/fields/dictionary.blade.php @@ -0,0 +1,44 @@ +@php + use function Statamic\trans as __; + + $isMultiple = isset($multiple) && $multiple == true; + $inline = isset($inline) && $inline === true; + $placeholderText = $placeholder ?? __('Please select...'); + + $fieldName = $name; + + if ($isMultiple) { + $fieldName .= '[]'; + } +@endphp + + diff --git a/resources/views/extend/forms/blade/fields/files.blade.php b/resources/views/extend/forms/blade/fields/files.blade.php new file mode 100644 index 00000000000..68b69a3f385 --- /dev/null +++ b/resources/views/extend/forms/blade/fields/files.blade.php @@ -0,0 +1,23 @@ +@php + $isMultiple = ! isset($max_files) || $max_files !== 1; + + $fieldName = $name; + + if ($isMultiple) { + $fieldName .= '[]'; + } +@endphp + + diff --git a/resources/views/extend/forms/blade/fields/group.blade.php b/resources/views/extend/forms/blade/fields/group.blade.php new file mode 100644 index 00000000000..e70ce5992c8 --- /dev/null +++ b/resources/views/extend/forms/blade/fields/group.blade.php @@ -0,0 +1,7 @@ +
+ @foreach ($fields as $__field) + {!! $slot?->addContext($__field) !!} + @endforeach +
diff --git a/resources/views/extend/forms/blade/fields/hidden.blade.php b/resources/views/extend/forms/blade/fields/hidden.blade.php new file mode 100644 index 00000000000..8eac9f5fc0c --- /dev/null +++ b/resources/views/extend/forms/blade/fields/hidden.blade.php @@ -0,0 +1,6 @@ + diff --git a/resources/views/extend/forms/blade/fields/integer.blade.php b/resources/views/extend/forms/blade/fields/integer.blade.php new file mode 100644 index 00000000000..394a60234d3 --- /dev/null +++ b/resources/views/extend/forms/blade/fields/integer.blade.php @@ -0,0 +1,19 @@ + diff --git a/resources/views/extend/forms/blade/fields/radio.blade.php b/resources/views/extend/forms/blade/fields/radio.blade.php new file mode 100644 index 00000000000..16fa854f873 --- /dev/null +++ b/resources/views/extend/forms/blade/fields/radio.blade.php @@ -0,0 +1,24 @@ +@php + $inline = isset($inline) && $inline === true; +@endphp + +@foreach ($options as $option => $label) + + @unless ($inline)
@endunless +@endforeach diff --git a/resources/views/extend/forms/blade/fields/select.blade.php b/resources/views/extend/forms/blade/fields/select.blade.php new file mode 100644 index 00000000000..2d04fb3e826 --- /dev/null +++ b/resources/views/extend/forms/blade/fields/select.blade.php @@ -0,0 +1,44 @@ +@php + use function Statamic\trans as __; + + $isMultiple = isset($multiple) && $multiple == true; + $inline = isset($inline) && $inline === true; + $placeholderText = $placeholder ?? __('Please select...'); + + $fieldName = $name; + + if ($isMultiple) { + $fieldName .= '[]'; + } +@endphp + + diff --git a/resources/views/extend/forms/blade/fields/spacer.blade.php b/resources/views/extend/forms/blade/fields/spacer.blade.php new file mode 100644 index 00000000000..9d7b871217c --- /dev/null +++ b/resources/views/extend/forms/blade/fields/spacer.blade.php @@ -0,0 +1 @@ +{{-- spacer --}} diff --git a/resources/views/extend/forms/blade/fields/text.blade.php b/resources/views/extend/forms/blade/fields/text.blade.php new file mode 100644 index 00000000000..75567e3db18 --- /dev/null +++ b/resources/views/extend/forms/blade/fields/text.blade.php @@ -0,0 +1,16 @@ + diff --git a/resources/views/extend/forms/blade/fields/textarea.blade.php b/resources/views/extend/forms/blade/fields/textarea.blade.php new file mode 100644 index 00000000000..3c848068011 --- /dev/null +++ b/resources/views/extend/forms/blade/fields/textarea.blade.php @@ -0,0 +1,14 @@ + diff --git a/resources/views/extend/forms/blade/fields/toggle.blade.php b/resources/views/extend/forms/blade/fields/toggle.blade.php new file mode 100644 index 00000000000..fed395a24a3 --- /dev/null +++ b/resources/views/extend/forms/blade/fields/toggle.blade.php @@ -0,0 +1,17 @@ + diff --git a/src/Fields/Fieldtype.php b/src/Fields/Fieldtype.php index 836cb4a6bc7..d8145301e45 100644 --- a/src/Fields/Fieldtype.php +++ b/src/Fields/Fieldtype.php @@ -337,11 +337,17 @@ public function preProcessIndex($data) public function view() { - $default = 'statamic::forms.fields.'.$this->handle(); + $language = config('statamic.templates.language', 'antlers'); + $handle = $this->handle(); + + $views = [ + "statamic::forms.fields.{$handle}", + "statamic::forms.{$language}.fields.{$handle}", + 'statamic::forms.fields.default', + "statamic::forms.{$language}.fields.default", + ]; - return view()->exists($default) - ? $default - : 'statamic::forms.fields.default'; + return collect($views)->first(fn ($view) => view()->exists($view)); } public function config(?string $key = null, $fallback = null) diff --git a/src/Providers/AppServiceProvider.php b/src/Providers/AppServiceProvider.php index 2b0fc4938fc..eb86a32e02a 100644 --- a/src/Providers/AppServiceProvider.php +++ b/src/Providers/AppServiceProvider.php @@ -84,8 +84,12 @@ public function boot() $this->loadViewsFrom("{$this->root}/resources/views/extend", 'statamic'); + $formsSource = config('statamic.templates.language', 'antlers') === 'blade' + ? "{$this->root}/resources/views/extend/forms/blade" + : "{$this->root}/resources/views/extend/forms/antlers"; + $this->publishes([ - "{$this->root}/resources/views/extend/forms" => resource_path('views/vendor/statamic/forms'), + $formsSource => resource_path('views/vendor/statamic/forms'), ], 'statamic-forms'); $this->publishes([ diff --git a/tests/Fields/FieldtypeTest.php b/tests/Fields/FieldtypeTest.php index b0519eed407..0f8732ca734 100644 --- a/tests/Fields/FieldtypeTest.php +++ b/tests/Fields/FieldtypeTest.php @@ -12,10 +12,13 @@ use Statamic\Fields\Field; use Statamic\Fields\Fields; use Statamic\Fields\Fieldtype; +use Tests\FakesViews; use Tests\TestCase; class FieldtypeTest extends TestCase { + use FakesViews; + #[Test] public function it_gets_the_field() { @@ -568,6 +571,120 @@ public function it_can_make_a_fieldtype_selectable_in_forms() $this->assertTrue(FieldtypeRepository::selectableInFormIsOverriden('test-selectable')); } + #[Test] + public function form_view_returns_the_package_view_for_the_handle() + { + config(['statamic.templates.language' => 'antlers']); + + $this->withFakeViews(); + $this->viewShouldReturnRaw('statamic::forms.antlers.fields.text', ''); + + $fieldtype = new class extends Fieldtype + { + protected static $handle = 'text'; + }; + + $this->assertEquals('statamic::forms.antlers.fields.text', $fieldtype->view()); + } + + #[Test] + public function form_view_returns_the_blade_package_view_when_language_is_blade() + { + config(['statamic.templates.language' => 'blade']); + + $this->withFakeViews(); + $this->viewShouldReturnRaw('statamic::forms.blade.fields.text', '', 'blade.php'); + + $fieldtype = new class extends Fieldtype + { + protected static $handle = 'text'; + }; + + $this->assertEquals('statamic::forms.blade.fields.text', $fieldtype->view()); + } + + #[Test] + public function form_view_prefers_a_legacy_published_view_over_the_package_view() + { + config(['statamic.templates.language' => 'antlers']); + + $this->withFakeViews(); + $this->viewShouldReturnRaw('statamic::forms.fields.text', ''); + $this->viewShouldReturnRaw('statamic::forms.antlers.fields.text', ''); + + $fieldtype = new class extends Fieldtype + { + protected static $handle = 'text'; + }; + + $this->assertEquals('statamic::forms.fields.text', $fieldtype->view()); + } + + #[Test] + public function form_view_falls_back_to_the_package_default_when_no_handle_view_exists() + { + config(['statamic.templates.language' => 'antlers']); + + $this->withFakeViews(); + $this->viewShouldReturnRaw('statamic::forms.antlers.fields.default', ''); + + $fieldtype = new class extends Fieldtype + { + protected static $handle = 'unknown'; + }; + + $this->assertEquals('statamic::forms.antlers.fields.default', $fieldtype->view()); + } + + #[Test] + public function form_view_falls_back_to_the_blade_default_when_no_handle_view_exists_and_language_is_blade() + { + config(['statamic.templates.language' => 'blade']); + + $this->withFakeViews(); + $this->viewShouldReturnRaw('statamic::forms.blade.fields.default', '', 'blade.php'); + + $fieldtype = new class extends Fieldtype + { + protected static $handle = 'unknown'; + }; + + $this->assertEquals('statamic::forms.blade.fields.default', $fieldtype->view()); + } + + #[Test] + public function form_view_uses_a_legacy_published_default_view_when_no_handle_view_exists() + { + config(['statamic.templates.language' => 'antlers']); + + $this->withFakeViews(); + $this->viewShouldReturnRaw('statamic::forms.fields.default', ''); + + $fieldtype = new class extends Fieldtype + { + protected static $handle = 'unknown'; + }; + + $this->assertEquals('statamic::forms.fields.default', $fieldtype->view()); + } + + #[Test] + public function form_view_prefers_a_legacy_published_default_over_the_package_default() + { + config(['statamic.templates.language' => 'antlers']); + + $this->withFakeViews(); + $this->viewShouldReturnRaw('statamic::forms.fields.default', ''); + $this->viewShouldReturnRaw('statamic::forms.antlers.fields.default', ''); + + $fieldtype = new class extends Fieldtype + { + protected static $handle = 'unknown'; + }; + + $this->assertEquals('statamic::forms.fields.default', $fieldtype->view()); + } + #[Test] public function it_can_make_a_fieldtype_unselectable_in_forms() {