<?php declare (strict_types = 1); namespace App\Nova; use App\Models\Category; use App\Models\Retailer; use App\Rules\isSKUAvailable; use Illuminate\Database\Eloquent\Model; use Laravel\Nova\Fields\BelongsToMany; use Laravel\Nova\Fields\Select; use Laravel\Nova\Fields\Text; use Laravel\Nova\Fields\Textarea; use Laravel\Nova\Http\Requests\NovaRequest; use Outl1ne\MultiselectField\Multiselect; use Vyuldashev\NovaMoneyField\Money; class Product extends Resource { public static $model = \App\Models\Product::class; public static $title = 'name'; public static $search = [ 'name', 'sku', ]; public static $categories = []; public static function attach(Model $model) { $categories = self::$categories; foreach ($categories as $category) { $model->categories()->attach($category); } } public static function afterCreate(NovaRequest $request, Model $model) { self::attach($model); } public function fields(NovaRequest $request) { return [ Text::make('Name') ->sortable() ->rules('required', 'max:255', 'min:2'), Select::make('Retailer', 'retailer_id') ->options( Retailer::pluck('name', 'id')->all() ) ->rules('required') ->placeholder('Choose retailer') ->displayUsingLabels(), BelongsToMany::make('Categories') ->rules('required'), Multiselect::make('Categories') ->options( Category::pluck('name', 'id')->all()) ->rules('required') ->fillUsing( function ($request, $model) { self::$categories = $request->categories; return null; }) ->hideFromIndex() ->hideFromDetail() ->hideWhenUpdating(), Text::make('SKU') ->sortable() ->creationRules('required', new isSKUAvailable(intval($request->retailer_id), false, 0)) ->updateRules('required', new isSKUAvailable(intval($this->retailer_id), true, $this->id)) ->rules('numeric', 'required'), Money::make('Price') ->sortable() ->rules('required'), Textarea::make('Description') ->sortable() ->rules('required'), ]; } public function cards(NovaRequest $request) { return []; } public function filters(NovaRequest $request) { return [ new Filters\ProductPriceFilter(), new Filters\ProductCategoryFilter(), new Filters\CompareFilter(), ]; } public function lenses(NovaRequest $request) { return [ (new Lenses\CompareProduct()) ->canSee(function ($request) { return (array_key_exists('query', parse_url(url()->full())) || array_key_exists('query', parse_url(url()->previous()))) ? true : false; }), ]; } public function actions(NovaRequest $request) { return [ Actions\CompareAction::make() ->standalone() ->confirmText('This action uses for compare different products by choosen field between choosen retailer and other retailers') ->confirmButtonText('Compare') ->cancelButtonText("Don't compare"), ]; } }