<?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 getAllRetailers() { $list = array(); foreach (Retailer::get() as $retailer) { $list[$retailer['id']] = $retailer['name']; } return $list; } public function getAllCategories() { $list = array(); foreach (Category::get() as $retailer) { $list[$retailer['id']] = $retailer['name']; } return $list; } public function fields(NovaRequest $request) { return [ Text::make('Name') ->sortable() ->rules('required', 'max:255', 'min:2'), Select::make('Retailer', 'retailer_id') ->options( $this->getAllRetailers() ) ->rules('required') ->placeholder('Choose retailer') ->displayUsingLabels(), BelongsToMany::make('Categories') ->rules('required'), Multiselect::make('Categories') ->options( $this->getAllCategories()) ->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), 0)) ->rules('numeric'), 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 []; } public function actions(NovaRequest $request) { return [ new Actions\CompareActionChangeValues($this->sku, $this->id), ]; } }