/home/bdqbpbxa/api-uniferx.goodface.com.ua/app/Nova/Product.php
<?php
namespace App\Nova;
use Acme\MultilangLongtext\MultilangLongtext;
use Acme\MultilangText\MultilangText;
use Acme\MultilangTextarea\MultilangTextarea;
use App\Models\Country;
use App\Models\Language;
use App\Nova\Actions\AttachCropToProduct;
use App\Nova\Repeater\Product\Benefits;
use App\Nova\Repeater\Product\CompositionCompatibility;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\BelongsToMany;
use Laravel\Nova\Fields\Boolean;
use Laravel\Nova\Fields\FormData;
use Laravel\Nova\Fields\HasMany;
use Laravel\Nova\Fields\Heading;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Image;
use Laravel\Nova\Fields\MorphedByMany;
use Laravel\Nova\Fields\Repeater;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Slug;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\URL;
use Laravel\Nova\Http\Requests\NovaRequest;
use Laravel\Nova\Query\Builder;
use Oneduo\NovaFileManager\FileManager;
use Whitecube\NovaFlexibleContent\Flexible;
class Product extends Resource
{
/**
* The model the resource corresponds to.
*
* @var class-string<\App\Models\Product>
*/
public static string $model = \App\Models\Product::class;
/**
* The single value that should be used to represent the resource when being displayed.
*
* @var string
*/
public static $title = 'system_name';
/**
* The columns that should be searched.
*
* @var array
*/
public static $search = [
'system_name',
];
public static $trafficCop = false;
/**
* Get the fields displayed by the resource.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @return array
*/
public function fields(NovaRequest $request)
{
$countries = Country::query()->get();
$languages = Language::query()->get();
$uploadLink = route('nova.fields.upload.image');
return [
ID::make()->sortable()->hide(),
Boolean::make(__('Visibility'), 'is_enabled'),
Text::make(__('System name'), 'system_name')->fullWidth()->sortable(),
Slug::make(__('Slug'), 'slug')->from(__('System name'))->separator('_')
->rules('required')
->creationRules('unique:products,slug'),
Select::make(__('Type'), 'type')->options([
'product' => __('Product'),
'related_product' => __('Related product'),
])->displayUsingLabels()
->rules('required')->sortable(),
BelongsTo::make(__('Product'), 'product')
->readonly()
->dependsOn('type', function (BelongsTo $field, NovaRequest $request, FormData $formData) {
if ($formData->type === 'related_product') {
$field->readonly(false);
} else {
$field->value = null;
}
})->relatableQueryUsing(function (NovaRequest $request, $query) {
$product = \App\Models\Product::find($request->resourceId);
if ($product) {
return $query->where('id', '!=', $product->id);
}
return $query;
}),
/** Preview data */
Heading::make(__('Preview data')),
MultilangText::make('Preview title', 'preview_title')->languages($languages)->countries($countries)->uploadLink($uploadLink)
->fullWidth()->hideFromIndex(),
FileManager::make(__('Preview image'), 'preview_image')->hideFromIndex(),
FileManager::make(__('Logo'), 'logo')->fullWidth(),
MultilangLongtext::make('Preview description', 'preview_description')->languages($languages)->countries($countries)->uploadLink($uploadLink)
->fullWidth()->hideFromIndex(),
MultilangText::make('Preview button text', 'preview_button_text')->languages($languages)->countries($countries)->uploadLink($uploadLink)
->fullWidth()->hideFromIndex(),
/** First screen */
Heading::make(__('First screen')),
MultilangText::make(__('Title'), 'title')->languages($languages)->countries($countries)->uploadLink($uploadLink)
->fullWidth()->hideFromIndex(),
MultilangText::make(__('Title button'), 'title_button')->languages($languages)->countries($countries)->uploadLink($uploadLink)
->fullWidth()->hideFromIndex(),
MultilangText::make(__('Title button link'), 'title_button_link')->languages($languages)->countries($countries)->uploadLink($uploadLink)
->fullWidth()->hideFromIndex(),
FileManager::make(__('Title image'), 'title_image')->hideFromIndex(),
/** About */
Heading::make(__('About')),
// MultilangText::make('About tag', 'about_tag')->languages($languages)->countries($countries)->uploadLink($uploadLink)
// ->fullWidth()->hideFromIndex(),
MultilangTextarea::make('About title', 'about_title')->languages($languages)->countries($countries)->uploadLink($uploadLink)
->fullWidth()->hideFromIndex(),
MultilangTextarea::make('About description', 'about_description')->languages($languages)->countries($countries)->uploadLink($uploadLink)
->fullWidth()->hideFromIndex(),
/** General information */
Heading::make(__('General information')),
MultilangText::make(__('General information title'), 'data->general_information_title')->languages($languages)->countries($countries)->uploadLink($uploadLink)
->fullWidth()->hideFromIndex(),
MultilangTextarea::make('General information', 'general_information')->languages($languages)->countries($countries)->uploadLink($uploadLink)
->fullWidth()->hideFromIndex(),
MultilangText::make('General information read more', 'general_information_read_more')->languages($languages)->countries($countries)->uploadLink($uploadLink)
->fullWidth()->hideFromIndex(),
MultilangText::make('Formula title', 'data->formula_title')->languages($languages)->countries($countries)->uploadLink($uploadLink)
->fullWidth()->hideFromIndex(),
MultilangTextarea::make('Formula text', 'data->formula_text')->languages($languages)->countries($countries)->uploadLink($uploadLink)
->fullWidth()->hideFromIndex(),
MultilangTextarea::make('Formula table', 'data->formula_table')->languages($languages)->countries($countries)->uploadLink($uploadLink)
->fullWidth()->hideFromIndex(),
// FileManager::make(__('Formula image'), 'general_information_image')->hideFromIndex(),
MultilangTextarea::make('Formula description', 'data->formula_description')->languages($languages)->countries($countries)->uploadLink($uploadLink)
->fullWidth()->hideFromIndex(),
/** Benefits */
Heading::make(__('Benefits')),
MultilangText::make(__('Benefits title'), 'data->benefits_title')->languages($languages)->countries($countries)->uploadLink($uploadLink)
->fullWidth()->hideFromIndex(),
Repeater::make('Benefits', 'benefits')
->repeatables([
Benefits::make(),
])
->fullWidth()->hideFromIndex(),
FileManager::make(__('Benefits preview video'), 'benefits_preview_video->preview')->hideFromIndex(),
MultilangText::make(__('Benefits preview text'), 'benefits_preview_video->text')->languages($languages)->countries($countries)->uploadLink($uploadLink)
->fullWidth()->hideFromIndex(),
MultilangText::make(__('Benefits Video link'), 'benefits_video')->languages($languages)->countries($countries)->uploadLink($uploadLink)
->fullWidth()->hideFromIndex(),
MultilangText::make(__('Products title'), 'data->products_title')->languages($languages)->countries($countries)->uploadLink($uploadLink)
->fullWidth()->hideFromIndex(),
MultilangText::make(__('Composition & Compatibility title'), 'data->composition_compatibility_title')->languages($languages)->countries($countries)->uploadLink($uploadLink)
->fullWidth()->hideFromIndex(),
Flexible::make('Composition & Compatibility', 'composition_compatibility')->addLayout('Country', 'country', [
MultilangText::make('Title', 'title')->languages($languages)->countries($countries)->uploadLink($uploadLink)
->fullWidth(),
FileManager::make(__('File'), 'file')->fullWidth()
])->fullWidth()->hideFromIndex(),
// MultilangText::make(__('Nutrition programs title'), 'data->nutrition_programs_title')->languages($languages)->countries($countries)->uploadLink($uploadLink)
// ->fullWidth()->hideFromIndex(),
// MultilangText::make(__('Trial results title'), 'data->trial_results_title')->languages($languages)->countries($countries)->uploadLink($uploadLink)
// ->fullWidth()->hideFromIndex(),
// Repeater::make('Composition & Compatibility', 'composition_compatibility')
// ->repeatables([
// CompositionCompatibility::make(),
// ])
// ->fullWidth()->hideFromIndex(),
HasMany::make(__('Related Products'), 'related_products', Product::class)
,
BelongsToMany::make(__('Nutrition Programs Crop'), 'nutrition_programs', Crop::class),
BelongsToMany::make(__('Trial Results Crop'), 'trial_results', Crop::class),
// BelongsToMany::make(__('Catalogs'), 'catalogs', Catalog::class),
MorphedByMany::make(__('Catalogs'), 'Catalogs', Catalog::class),
];
}
/**
* Get the cards available for the request.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @return array
*/
public function cards(NovaRequest $request)
{
return [];
}
/**
* 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 [
(new AttachCropToProduct())->onlyOnDetail(),
];
}
public static function relatableProducts(NovaRequest $request, $query)
{
$product = \App\Models\Product::find($request->resourceId);
if ($product) {
return $query->where('id', '!=', $product->id)
->when($product->type === 'product', function ($query) {
$query->where('type', 'related_product');
});
}
}
// public static function relatableProduct(NovaRequest $request, $query)
// {
// $product = \App\Models\Product::find($request->resourceId);
// dd(1);
//// if ($product) {
// return $query->where('id', '!=', $product->id)
// ->where('type', 'product');
//// }
// }
}