sereny/nova-cep

A Laravel Nova Cep field.

1.0.0 2023-04-10 11:22 UTC

This package is auto-updated.

Last update: 2024-10-10 14:47:36 UTC


README

A Laravel Nova field enables automatic address data completion by CEP lookup.

Installation

You can install the package in to a Laravel app that uses Nova via composer:

composer require sereny/nova-cep

example

Usage

Create migration:

php artisan make:migration create_addresses_table

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('addresses', function (Blueprint $table) {
            $table->id('id')->primary();
            $table->foreignId('owner')->constrained()->cascadeOnDelete();
            $table->string('postcode');
            $table->string('street');
            $table->string('details')->nullable();
            $table->string('district')->nullable();
            $table->string('number')->nullable();
            $table->json('city');
            $table->timestamps();
            $table->softDeletes();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('addresses');
    }
};

Run migration

php artisan migrate

Create the Address resource

php artisan nova:resource Address

<?php

namespace App\Nova;

use Laravel\Nova\Fields\Hidden;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Http\Requests\NovaRequest;
use Sereny\NovaCep\Fields\Cep;

class Address extends Resource
{
    /**
     * The model the resource corresponds to.
     *
     * @var class-string<\App\Models\Address>
     */
    public static $model = \App\Models\Address::class;

    /**
     * The single value that should be used to represent the resource when being displayed.
     *
     * @var string
     */
    public static $title = 'street';

    /**
     * The columns that should be searched.
     *
     * @var array
     */
    public static $search = [
        'street',
        'postcode',
        'district'
    ];

    /**
     * Get the fields displayed by the resource.
     *
     * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
     * @return array
     */
    public function fields(NovaRequest $request)
    {
        return [
            Cep::make(__('Postcode'), 'postcode')
                ->required(),

            Text::make(__('Street'), 'street')
                ->rules('required'),

            Text::make(__('Number'), 'number')
                ->rules('required'),

            Text::make(__('District'), 'district')
                ->rules('required'),

            Text::make(__('Reference'), 'details')
                ->hideFromIndex(),

            Hidden::make('city')// This is necessary because `city` field must be `readonly`
                ->fillUsing(function ($request, $model, $attribute) {
                    [$name, $state] = explode(' - ', $request->input($attribute));
                    $model->city = ['name' => $name, 'state' => $state];
                }),

            Text::make(__('City'), 'city')
                ->readonly()
                ->resolveUsing(function ($value) {
                    return $value ?  "{$value['name']} - {$value['state']}" : null;
                }),
        ];
    }
}