Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

There was a problem submitting the form #186

Open
ejobity opened this issue Aug 28, 2022 · 0 comments
Open

There was a problem submitting the form #186

ejobity opened this issue Aug 28, 2022 · 0 comments

Comments

@ejobity
Copy link

ejobity commented Aug 28, 2022

I get this error when I look to attach a role or permission. Can anyone help?

image

<?php

namespace App\Nova;

use App\Models\Country;
use Laravel\Nova\Panel;
use Illuminate\Support\Str;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Date;
use Laravel\Nova\Fields\Text;
use App\Nova\Metrics\NewUsers;
use Laravel\Nova\Fields\Select;
use Illuminate\Validation\Rules;
use Laravel\Nova\Fields\HasMany;
use App\Nova\Metrics\UsersPerDay;
use Laravel\Nova\Fields\Gravatar;
use Laravel\Nova\Fields\Password;
use Laravel\Nova\Actions\Actionable;
use Laravel\Nova\Fields\MorphToMany;
use Laravel\Nova\Http\Requests\NovaRequest;
use YieldStudio\NovaPhoneField\PhoneNumber;


class User extends Resource
{
    use Actionable;
    /**
     * The model the resource corresponds to.
     *
     * @var string
     */
    public static $model = \App\Models\User::class;

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

    /**
     * The columns that should be searched.
     *
     * @var array
     */
    public static $search = [
        'id', 'name', 'email',
    ];


    /**
     * The used for hasOne related fields.
     *
     */
    protected static function fillFields(NovaRequest $request, $model, $fields)
    {
        // Ticker for result array
        $count = 0;

        // The prefix of relatable columns within fields.
        // User::first()->profile->first_name
        // Text::make('Voornaam', 'profile.first_name');
        // $request->input('profile_first_name');
        $filters = ['profile_'];

        // Loop through all defined filters above
        foreach ($filters as $filter) {
            // Setup relations
            $relations[Str::replaceFirst('_', '', $filter)] = self::rejectAndFlattenRelation($filter, $request);
        }

        // Fill all primary fields after relations have been extracted from the request
        $result = parent::fillFields($request, $model, $fields);

        // Some complex iteration through all extracted relation requests
        foreach ($relations as $method => $relation) {

            // Append them to the final result accordingly
            $result[++$count][] = function () use ($relation, $method, $model) {

                // Create if not exists otherwise update with relation fields
                $model->{$method}()->updateOrCreate([], $relation);
            };
        }

        // Finally return result
        return $result;
    }

    private static function rejectAndFlattenRelation($filter, &$request)
    {
        // Grab all the currently available inputs
        $input = collect($request->all());

        // Grab all relatable fields according to filter
        $relatableFields = $input->reject(function ($item, $key) use ($filter) {
            return strpos($key, $filter) === false;
        });

        // Remove relation ship fields from request
        $request->except($relatableFields->toArray());

        // Finally flatten collection and return as array
        return $relatableFields->flatMap(function ($item, $key) use ($filter) {
            return [Str::replaceFirst($filter, '', $key) => $item];
        })->toArray();
    }

    /**
     * Get the fields displayed by the resource.
     *
     * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
     * @return array
     */
    public function fields(NovaRequest $request)
    {
        return [

            
            new Panel('User Details: '.$this->name , $this->registrationFields()),

            new Panel('Personal Information', $this->personalFields()),

            new Panel('Contact Information', $this->contactFields()),

            HasMany::make("User Employers"),

            HasMany::make('User Notes'),

            MorphToMany::make('Roles', 'roles', \Vyuldashev\NovaPermission\Role::class),
            MorphToMany::make('Permissions', 'permissions', \Vyuldashev\NovaPermission\Permission::class),

        
        ];
    }

    /**
     * Get the registration fields for the resource.
     *
     * @return array
     */
    protected function registrationFields()
    {
        return [

            

            ID::make()->sortable(),

            Gravatar::make()->maxWidth(50),

            Text::make('Name')
                ->sortable()
                ->rules('required', 'max:255'),

            Text::make('Email')
                ->sortable()
                ->rules('required', 'email', 'max:254')
                ->creationRules('unique:users,email')
                ->updateRules('unique:users,email,{{resourceId}}'),

            Password::make('Password')
                ->onlyOnForms()
                ->creationRules('required', Rules\Password::defaults())
                ->updateRules('nullable', Rules\Password::defaults()),
        ];
    }

    /**
     * Get the personal fields for the resource.
     *
     * @return array
     */
    protected function personalFields()
    {
        return [
            Date::make('Date of Birth', 'profile.date_of_birth')
                ->hideFromIndex()
                ->nullable(),

            Select::make('Sex', 'profile.sex')
                ->options([
                    '1' => 'Male',
                    '0' => 'Female',
                ])
                ->displayUsingLabels()
                ->hideFromIndex(),

            Select::make('Marital Status', 'profile.marital_status')
                ->options([
                    '1' => 'Single',
                    '2' => 'Married',
                    '3' => 'Widowed',
                    '4' => 'Divorced',
                    '5' => 'Separated',
                ])
                ->displayUsingLabels()
                ->hideFromIndex(),
        ];
    }

    /**
     * Get the contact fields for the resource.
     *
     * @return array
     */
    protected function contactFields()
    {
        return [
            PhoneNumber::make('Phone', 'profile.phone')
                ->hideFromIndex(),
           
            Select::make('Country', 'profile.country_id')
                ->displayUsingLabels()
                ->hideFromIndex()
                ->searchable()
                ->options(function () {
                    return array_filter(Country::pluck('name', 'id')->toArray());
                }),
            Text::make('State / Province / Region', 'profile.state_id')
            ->hideFromIndex(),
            Text::make('Address', 'profile.address')->hideFromIndex(),
            Text::make('City', 'profile.city')->hideFromIndex(),
            Text::make('Zip Code', 'profile.zip')->hideFromIndex(),

            ];
    }

    /**
     * Get the cards available for the request.
     *
     * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
     * @return array
     */
    public function cards(NovaRequest $request)
    {
        return [
            NewUsers::make(),
            UsersPerDay::make()
        ];
    }

    /**
     * Get the filters available for the resource.
     *
     * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
     * @return array
     */
    public function filters(NovaRequest $request)
    {
        return [];
    }

    /**
     * Get the lenses available for the resource.
     *
     * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
     * @return array
     */
    public function lenses(NovaRequest $request)
    {
        return [];
    }

    /**
     * Get the actions available for the resource.
     *
     * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
     * @return array
     */
    public function actions(NovaRequest $request)
    {
        return [];
    }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant