/home/bdqbpbxa/api-uniferx.goodface.com.ua/vendor/eminiarts/nova-tabs/src/Traits/HasTabs.php
<?php
declare(strict_types=1);
namespace Eminiarts\Tabs\Traits;
use Eminiarts\Tabs\Tabs;
use Illuminate\Support\Collection;
use Laravel\Nova\Contracts\BehavesAsPanel;
use Laravel\Nova\Fields\FieldCollection;
use Laravel\Nova\Http\Requests\NovaRequest;
use Laravel\Nova\Panel;
trait HasTabs
{
/**
* Resolve available panels from fields.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @param \Laravel\Nova\Fields\FieldCollection<int, \Laravel\Nova\Fields\Field> $fields
* @param string $label
* @return Collection
*/
protected function resolvePanelsFromFields(NovaRequest $request, FieldCollection $fields, $label)
{
[$defaultFields, $fieldsWithPanels] = $fields->each(function ($field) {
if ($field instanceof BehavesAsPanel && !$field->assignedPanel instanceof Tabs) {
$field->asPanel();
}
})->partition(function ($field) {
return ! isset($field->panel) || blank($field->panel);
});
$panels = $fieldsWithPanels->groupBy(function ($field) {
return $field->panel;
})->transform(function ($fields, $name) {
if ($fields[0]->assignedPanel instanceof Tabs) {
return Tabs::mutate($name, $fields);
}
return Panel::mutate($name, $fields);
})->toBase();
if ($panels->where('component', 'tabs')->isEmpty()) {
return $this->panelsWithDefaultLabel(
$panels,
$defaultFields->values(),
$label
);
}
[$relationshipUnderTabs, $panels] = $panels->partition(function ($panel) {
return $panel->component === 'relationship-panel' && $panel->meta['fields'][0]->assignedPanel instanceof Tabs;
});
$panels->transform(function($panel, $key) use ($relationshipUnderTabs) {
if ($panel->component === 'tabs') {
foreach ($relationshipUnderTabs as $rel) {
if ($panel->meta['fields'][0]->assignedPanel === $rel->meta['fields'][0]->assignedPanel) {
$panel->meta['fields'][] = $rel->meta['fields'][0];
}
}
$panel->name = $panel->meta['fields'][0]->panel;
$panel->showTitle = $panel->meta['fields'][0]->assignedPanel->showTitle;
$panel->showToolbar = $panel->meta['fields'][0]->assignedPanel->showToolbar;
$panel->slug = $panel->meta['fields'][0]->assignedPanel->slug;
$panel->currentColor = $panel->meta['fields'][0]->assignedPanel->currentColor;
$panel->errorColor = $panel->meta['fields'][0]->assignedPanel->errorColor;
$panel->retainTabPosition = $panel->meta['fields'][0]->assignedPanel->retainTabPosition;
}
return $panel;
});
return $this->panelsWithDefaultLabel(
$panels,
$defaultFields->values(),
$label
);
}
/**
* Return the panels for this request with the default label.
*
* @param \Illuminate\Support\Collection<int, \Laravel\Nova\Panel> $panels
* @param \Laravel\Nova\Fields\FieldCollection<int, \Laravel\Nova\Fields\Field> $fields
* @param string $label
* @return \Illuminate\Support\Collection<int, \Laravel\Nova\Panel>
*/
protected function panelsWithDefaultLabel(Collection $panels, FieldCollection $fields, $label)
{
return $panels->values()
->when($panels->where('name', $label)->isEmpty(), function ($panels) use ($label, $fields) {
return $fields->isNotEmpty()
? $panels->prepend(Panel::make($label, $fields)->withMeta(['fields' => $fields]))
: $panels;
})
->tap(function ($panels) use ($label): void {
/**
* There can be no panels
* Preventing ->component or ->withToolbar() on null error
*/
if(!$panels->first()){
return;
}
/**
* Default to ->withToolbar() if the first panel is not a Tabs
* Otherwise, we show the tabs component with the settings configured within it
* This check is necessary in case you ARE using Tabs component, but only for relation as a 2nd or 3rd instance
*/
$panels->first()->component !== 'tabs' ? $panels->first()->withToolbar() : $panels->where('component', 'tabs')->first();
});
}
}