Skip to content
This repository was archived by the owner on Jan 2, 2024. It is now read-only.

Commit 7a2da87

Browse files
authored
Support for Livewire modifiers (#33)
1 parent 4950b2c commit 7a2da87

21 files changed

+106
-22
lines changed

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,16 @@ Normally you would use a `wire:model` attribute to bind a component property wit
240240
</form>
241241
```
242242

243+
Additionally, you can pass an optional modifier to the `@wire` directive. This feature was added in v2.4.0. If you're upgrading from a previous version *and* you published the Blade views, you should republish them *or* update them manually.
244+
245+
```blade
246+
<x-form wire:submit.prevent="submit">
247+
@wire('debounce.500ms')
248+
<x-form-input name="email" />
249+
@endwire
250+
</form>
251+
```
252+
243253
### Select elements
244254

245255
Besides the `name` attribute, the `select` element has a required `options` attribute, which should be a simple *key-value* array.

resources/views/bootstrap-4/form-checkbox.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
value="{{ $value }}"
55

66
@if($isWired())
7-
wire:model="{{ $name }}"
7+
wire:model{!! $wireModifier() !!}="{{ $name }}"
88
@else
99
name="{{ $name }}"
1010
@endif

resources/views/bootstrap-4/form-input.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
type="{{ $type }}"
1515

1616
@if($isWired())
17-
wire:model="{{ $name }}"
17+
wire:model{!! $wireModifier() !!}="{{ $name }}"
1818
@else
1919
name="{{ $name }}"
2020
value="{{ $value }}"

resources/views/bootstrap-4/form-radio.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
type="radio"
44

55
@if($isWired())
6-
wire:model="{{ $name }}"
6+
wire:model{!! $wireModifier() !!}="{{ $name }}"
77
@else
88
name="{{ $name }}"
99
@endif

resources/views/bootstrap-4/form-select.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
<select
55
@if($isWired())
6-
wire:model="{{ $name }}"
6+
wire:model{!! $wireModifier() !!}="{{ $name }}"
77
@else
88
name="{{ $name }}"
99
@endif

resources/views/bootstrap-4/form-textarea.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
<textarea
55
@if($isWired())
6-
wire:model="{{ $name }}"
6+
wire:model{!! $wireModifier() !!}="{{ $name }}"
77
@else
88
name="{{ $name }}"
99
@endif

resources/views/tailwind-2/form-checkbox.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
value="{{ $value }}"
66

77
@if($isWired())
8-
wire:model="{{ $name }}"
8+
wire:model{!! $wireModifier() !!}="{{ $name }}"
99
@else
1010
name="{{ $name }}"
1111
@endif

resources/views/tailwind-2/form-input.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
'class' => 'block w-full ' . ($label ? 'mt-1' : '')
77
]) !!}
88
@if($isWired())
9-
wire:model="{{ $name }}"
9+
wire:model{!! $wireModifier() !!}="{{ $name }}"
1010
@else
1111
name="{{ $name }}"
1212
value="{{ $value }}"

resources/views/tailwind-2/form-radio.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
type="radio"
55

66
@if($isWired())
7-
wire:model="{{ $name }}"
7+
wire:model{!! $wireModifier() !!}="{{ $name }}"
88
@else
99
name="{{ $name }}"
1010
@endif

resources/views/tailwind-2/form-select.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
<select
66
@if($isWired())
7-
wire:model="{{ $name }}"
7+
wire:model{!! $wireModifier() !!}="{{ $name }}"
88
@else
99
name="{{ $name }}"
1010
@endif

resources/views/tailwind-2/form-textarea.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
<textarea
66
@if($isWired())
7-
wire:model="{{ $name }}"
7+
wire:model{!! $wireModifier() !!}="{{ $name }}"
88
@else
99
name="{{ $name }}"
1010
@endif

resources/views/tailwind/form-checkbox.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
value="{{ $value }}"
66

77
@if($isWired())
8-
wire:model="{{ $name }}"
8+
wire:model{!! $wireModifier() !!}="{{ $name }}"
99
@else
1010
name="{{ $name }}"
1111
@endif

resources/views/tailwind/form-input.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
'class' => 'form-input block w-full ' . ($label ? 'mt-1' : '')
77
]) !!}
88
@if($isWired())
9-
wire:model="{{ $name }}"
9+
wire:model{!! $wireModifier() !!}="{{ $name }}"
1010
@else
1111
name="{{ $name }}"
1212
value="{{ $value }}"

resources/views/tailwind/form-radio.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
type="radio"
55

66
@if($isWired())
7-
wire:model="{{ $name }}"
7+
wire:model{!! $wireModifier() !!}="{{ $name }}"
88
@else
99
name="{{ $name }}"
1010
@endif

resources/views/tailwind/form-select.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
<select
66
@if($isWired())
7-
wire:model="{{ $name }}"
7+
wire:model{!! $wireModifier() !!}="{{ $name }}"
88
@else
99
name="{{ $name }}"
1010
@endif

resources/views/tailwind/form-textarea.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
<textarea
66
@if($isWired())
7-
wire:model="{{ $name }}"
7+
wire:model{!! $wireModifier() !!}="{{ $name }}"
88
@else
99
name="{{ $name }}"
1010
@endif

src/Components/Component.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,18 @@ public function isNotWired(): bool
4949
return !$this->isWired();
5050
}
5151

52+
/**
53+
* Returns the optional wire modifier.
54+
*
55+
* @return string
56+
*/
57+
public function wireModifier(): ?string
58+
{
59+
$modifier = app(FormDataBinder::class)->getWireModifier();
60+
61+
return $modifier ? ".{$modifier}" : null;
62+
}
63+
5264
/**
5365
* Generates an ID, once, for this component.
5466
*

src/FormDataBinder.php

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class FormDataBinder
1414
/**
1515
* Wired to a Livewire component.
1616
*/
17-
private bool $wire = false;
17+
private $wire = false;
1818

1919
/**
2020
* Bind a target to the current instance
@@ -54,17 +54,28 @@ public function pop(): void
5454
*/
5555
public function isWired(): bool
5656
{
57-
return $this->wire;
57+
return $this->wire !== false;
5858
}
5959

6060
/**
61-
* Enable Livewire binding.
61+
* Returns the modifier, if set.
6262
*
63+
* @return string|null
64+
*/
65+
public function getWireModifier(): ?string
66+
{
67+
return is_string($this->wire) ? $this->wire : null;
68+
}
69+
70+
/**
71+
* Enable Livewire binding with an optional modifier.
72+
*
73+
* @param string $modifier
6374
* @return void
6475
*/
65-
public function wire(): void
76+
public function wire($modifier = null): void
6677
{
67-
$this->wire = true;
78+
$this->wire = $modifier ?: null;
6879
}
6980

7081
/**

src/Support/ServiceProvider.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ public function boot()
3636
return '<?php app(\ProtoneMedia\LaravelFormComponents\FormDataBinder::class)->pop(); ?>';
3737
});
3838

39-
Blade::directive('wire', function () {
40-
return '<?php app(\ProtoneMedia\LaravelFormComponents\FormDataBinder::class)->wire(); ?>';
39+
Blade::directive('wire', function ($modifier) {
40+
return '<?php app(\ProtoneMedia\LaravelFormComponents\FormDataBinder::class)->wire(' . $modifier . '); ?>';
4141
});
4242

4343
Blade::directive('endwire', function () {

tests/Feature/LivewireTest.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,14 @@ public function render()
3333
}
3434
}
3535

36+
class FormComponentWithModifier extends FormComponent
37+
{
38+
public function render()
39+
{
40+
return view('livewire-form-lazy');
41+
}
42+
}
43+
3644
class LivewireTest extends TestCase
3745
{
3846
/** @test */
@@ -61,4 +69,31 @@ public function it_can_validate_the_fields()
6169
->assertSeeHtml('The checkbox must be accepted')
6270
->assertSeeHtml('The radio must be accepted');
6371
}
72+
73+
/** @test */
74+
public function it_can_add_a_modifier_to_the_wire_directive()
75+
{
76+
$component = Livewire::test(FormComponentWithModifier::class);
77+
78+
$component->assertSeeHtml('wire:model.debounce.1000ms="input"')
79+
->assertSeeHtml('wire:model.debounce.1000ms="textarea"')
80+
->assertSeeHtml('wire:model.debounce.1000ms="select"')
81+
->assertSeeHtml('wire:model.debounce.1000ms="multi_select"')
82+
->assertSeeHtml('wire:model.debounce.1000ms="checkbox"')
83+
->assertSeeHtml('wire:model.debounce.1000ms="radio"');
84+
85+
$component->set('input', '')
86+
->set('textarea', '')
87+
->set('select', '')
88+
->set('multi_select', [])
89+
->set('checkbox', false)
90+
->set('radio', false)
91+
->call('submit')
92+
->assertSeeHtml('The input field is required')
93+
->assertSeeHtml('The textarea field is required')
94+
->assertSeeHtml('The select field is required')
95+
->assertSeeHtml('The multi select field is required')
96+
->assertSeeHtml('The checkbox must be accepted')
97+
->assertSeeHtml('The radio must be accepted');
98+
}
6499
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<x-form wire:submit.prevent="submit">
2+
@wire('debounce.1000ms')
3+
<x-form-input name="input" />
4+
<x-form-textarea name="textarea" />
5+
<x-form-select name="select" :options="['' => '', 'c' => 'c']" />
6+
<x-form-select name="multi_select" multiple :options="['d' => 'd', 'e' => 'e', 'f' => 'f']" />
7+
8+
<x-form-checkbox name="checkbox" />
9+
10+
<x-form-group name="radio">
11+
<x-form-radio name="radio" />
12+
</x-form-group>
13+
14+
<x-form-submit />
15+
@endwire
16+
</x-form>

0 commit comments

Comments
 (0)