Files
site/nova/src/Panel.php
2025-04-21 16:03:20 +02:00

211 lines
4.4 KiB
PHP

<?php
namespace Laravel\Nova;
use Illuminate\Http\Resources\MergeValue;
use Illuminate\Support\Traits\Macroable;
use JsonSerializable;
use Laravel\Nova\Metrics\HasHelpText;
class Panel extends MergeValue implements JsonSerializable
{
use Macroable, Metable, Makeable, HasHelpText;
/**
* The name of the panel.
*
* @var string
*/
public $name;
/**
* The panel fields.
*
* @var array
*/
public $data;
/**
* The panel's component.
*
* @var string
*/
public $component = 'panel';
/**
* Indicates whether the detail toolbar should be visible on this panel.
*
* @var bool
*/
public $showToolbar = false;
/**
* The initial field display limit.
*
* @var int|null
*/
public $limit = null;
/**
* The help text for the element.
*
* @var string
*/
public $helpText;
/**
* Create a new panel instance.
*
* @param string $name
* @param \Closure|array $fields
* @return void
*/
public function __construct($name, $fields = [])
{
$this->name = $name;
parent::__construct($this->prepareFields($fields));
}
/**
* Prepare the given fields.
*
* @param \Closure|array $fields
* @return array
*/
protected function prepareFields($fields)
{
return collect(is_callable($fields) ? $fields() : $fields)->each(function ($field) {
$field->panel = $this->name;
})->all();
}
/**
* Get the default panel name for the given resource.
*
* @param \Laravel\Nova\Resource $resource
* @return string
*/
public static function defaultNameForDetail(Resource $resource)
{
return __(':resource Details: :title', [
'resource' => $resource->singularLabel(),
'title' => (string) $resource->title(),
]);
}
/**
* Get the default panel name for a create panel.
*
* @param \Laravel\Nova\Resource $resource
* @return string
*/
public static function defaultNameForCreate(Resource $resource)
{
return __('Create :resource', [
'resource' => (string) $resource->singularLabel(),
]);
}
/**
* Get the default panel name for the update panel.
*
* @param \Laravel\Nova\Resource $resource
* @return string
*/
public static function defaultNameForUpdate(Resource $resource)
{
return __('Update :resource: :title', [
'resource' => $resource->singularLabel(),
'title' => $resource->title(),
]);
}
/**
* Display the toolbar when showing this panel.
*
* @return $this
*/
public function withToolbar()
{
$this->showToolbar = true;
return $this;
}
/**
* Set the number of initially visible fields.
*
* @param int $limit
* @return $this
*/
public function limit($limit)
{
$this->limit = $limit;
return $this;
}
/**
* Set the Vue component key for the panel.
*
* @param string $component
* @return $this
*/
public function withComponent($component)
{
$this->component = $component;
return $this;
}
/**
* Get the Vue component key for the panel.
*
* @return string
*/
public function component()
{
return $this->component;
}
/**
* Set the width for the help text tooltip.
*
* @param string
* @return $this
* @throws \Exception
*/
public function helpWidth($helpWidth)
{
throw new \Exception('Help width is not supported on panels.');
}
/**
* Return the width of the help text tooltip.
*
* @return string
* @throws \Exception
*/
public function getHelpWidth()
{
throw new \Exception('Help width is not supported on panels.');
}
/**
* Prepare the panel for JSON serialization.
*
* @return array
*/
public function jsonSerialize()
{
return array_merge([
'component' => $this->component(),
'name' => $this->name,
'showToolbar' => $this->showToolbar,
'limit' => $this->limit,
'helpText' => $this->getHelpText(),
], $this->meta());
}
}