diff --git a/.gitignore b/.gitignore index 3929e4b..67392d0 100755 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ docs vendor coverage .idea +/.phpunit.result.cache diff --git a/README.md b/README.md index a019a58..dc946d1 100755 --- a/README.md +++ b/README.md @@ -2,11 +2,11 @@ Livewire component for dependant and/or searchable select inputs -# Preview +### Preview ![preview](https://github.com/asantibanez/livewire-select/raw/master/preview.gif) -## Installation +### Installation You can install the package via composer: @@ -14,9 +14,193 @@ You can install the package via composer: composer require asantibanez/livewire-select ``` -## Usage +### Requirements -// TODO 😅 +This package uses `livewire/livewire` (https://laravel-livewire.com/) under the hood. + +It also uses TailwindCSS (https://tailwindcss.com/) for base styling. + +Please make sure you include both of these dependencies before using this component. + +### Usage + +In order to use this component, you must create a new Livewire component that extends from +`LivewireSelect` + +You can use `make:livewire` to create a new component. For example. +``` bash +php artisan make:livewire CarModelSelect +``` + +In the `CarModelSelect` class, instead of extending from the base Livewire `Component` class, +extend from `LivewireSelect` class. Also, remove the `render` method. +You'll have a class similar to this snippet. + +``` php +class CarModelSelect extends LivewireSelect +{ + // +} +``` + +In this class, you must override the following methods to provide options for your select input +```php +public function options($searchTerm = null) : Collection +{ + // +} +``` + +`options()` must return a collection of keyed values array items that must have at least the following +keys: `value` and `description`. For example: + +```php +public function options($searchTerm = null) : Collection +{ + return collect([ + [ + 'value' => 'honda', + 'description' => 'Honda', + ], + [ + 'value' => 'mazda', + 'description' => 'Mazda', + ], + [ + 'value' => 'tesla', + 'description' => 'Tesla', + ], + ]); +} +``` + +To render the component in a view, just use the Livewire tag or include syntax + + ```blade + + ``` + +You'll see on screen a select input with some custom styles with your defined values + +![preview](https://github.com/asantibanez/livewire-select/raw/master/basic.gif) + +Nothing fancy there. Now, let's make another select input depend on its value. + +Create another component following the same process above. In this case, we will create +a `CarModelSelect` with the following `options()` method. + +```php +// In CarModelSelect component +public function options($searchTerm = null) : Collection +{ + $modelsByBrand = [ + 'tesla' => [ + ['value' => 'Model S', 'description' => 'Model S'], + ['value' => 'Model 3', 'description' => 'Model 3'], + ['value' => 'Model X', 'description' => 'Model X'], + ], + 'honda' => [ + ['value' => 'CRV', 'description' => 'CRV'], + ['value' => 'Pilot', 'description' => 'Pilot'], + ], + 'mazda' => [ + ['value' => 'CX-3', 'description' => 'CX-3'], + ['value' => 'CX-5', 'description' => 'CX-5'], + ['value' => 'CX-9', 'description' => 'CX-9'], + ], + ]; + + $carBrandId = $this->getDependingValue('car_brand_id'); + + if ($this->hasDependency('car_brand_id') && $carBrandId != null) { + return collect(data_get($modelsByBrand, $carBrandId, [])); + } + + return collect([ + ['value' => 'Model S', 'description' => 'Tesla - Model S'], + ['value' => 'Model 3', 'description' => 'Tesla - Model 3'], + ['value' => 'Model X', 'description' => 'Tesla - Model X'], + ['value' => 'CRV', 'description' => 'Honda - CRV'], + ['value' => 'Pilot', 'description' => 'Honda - Pilot'], + ['value' => 'CX-3', 'description' => 'Mazda - CX-3'], + ['value' => 'CX-5', 'description' => 'Mazda - CX-5'], + ['value' => 'CX-9', 'description' => 'Mazda - CX-9'], + ]); +} +``` + +and define it in the view like this + +```blade + +``` + +With these two snippets we have defined a select input that `depends-on` another +select input with name `car_brand_id`. With this definition, we tell our component +to listen to any updates on our `car_brand_id` input and be notified on changes. + +![preview](https://github.com/asantibanez/livewire-select/raw/master/dependant.gif) + +Notice in the `options()` method the use of two other helper methods: +`getDependingValue` and `hasDependency`. + +`getDependingValue('token')` will return the value of another field, in this case +`car_brand_id`. If `car_brand_id` has no value, then it will return `null`. + +`hasDependency('token')` allows us to check if our component has been specified +to depend on other component values. This allows us to reuse the component by checking +if a dependency has been specified in our layouts. + +For example if we define the same component without the `:depends-on` attribute, +we can use the component and return all car models. + +```blade + +``` + +It should look something like this + +![preview](https://github.com/asantibanez/livewire-select/raw/master/no-dependency.gif) + +### Searchable inputs + +You can define the `searchable` attribute on the component to change the behavior of your +inputs. With `:searchable="true"` your component will change its behavior to allow searching +the options returned in the `options()` method. + + ```blade + +``` + +Your input will look something like this + +![preview](https://github.com/asantibanez/livewire-select/raw/master/searchable.gif) + +To filter the options in the dropdown, you can use the `$searchTerm` parameter in the +`options()` method. + +### Customizing the UI + +// TODO 😬 + +### Advanced behavior + +// TODO 😬 ### Testing diff --git a/basic.gif b/basic.gif new file mode 100644 index 0000000..cad5c14 Binary files /dev/null and b/basic.gif differ diff --git a/dependant.gif b/dependant.gif new file mode 100644 index 0000000..e461ca6 Binary files /dev/null and b/dependant.gif differ diff --git a/no-dependency.gif b/no-dependency.gif new file mode 100644 index 0000000..3ce4326 Binary files /dev/null and b/no-dependency.gif differ diff --git a/searchable.gif b/searchable.gif new file mode 100644 index 0000000..3bf22b7 Binary files /dev/null and b/searchable.gif differ