add nova
This commit is contained in:
169
nova/src/Fields/ID.php
Normal file
169
nova/src/Fields/ID.php
Normal file
@@ -0,0 +1,169 @@
|
||||
<?php
|
||||
|
||||
namespace Laravel\Nova\Fields;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Laravel\Nova\Http\Requests\NovaRequest;
|
||||
use Laravel\Nova\Util;
|
||||
|
||||
/**
|
||||
* @method static static make(mixed $name = null, string|null $attribute = null, callable|null $resolveCallback = null)
|
||||
*/
|
||||
class ID extends Field
|
||||
{
|
||||
/**
|
||||
* The field's component.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $component = 'id-field';
|
||||
|
||||
/**
|
||||
* The field's resolved pivot value.
|
||||
*
|
||||
* @var mixed
|
||||
*/
|
||||
public $pivotValue = null;
|
||||
|
||||
/**
|
||||
* Create a new field.
|
||||
*
|
||||
* @param string|null $name
|
||||
* @param string|null $attribute
|
||||
* @param (callable(mixed, mixed, ?string):(mixed))|null $resolveCallback
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($name = null, $attribute = null, $resolveCallback = null)
|
||||
{
|
||||
parent::__construct($name ?? 'ID', $attribute, $resolveCallback);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new hidden ID field.
|
||||
*
|
||||
* @param string $name
|
||||
* @param string $attribute
|
||||
* @param callable|null $resolveCallback
|
||||
* @return \Laravel\Nova\Fields\Hidden
|
||||
*/
|
||||
public static function hidden($name = 'ID', $attribute = 'id', callable $resolveCallback = null)
|
||||
{
|
||||
return Hidden::make($name, $attribute, $resolveCallback);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new, resolved ID field for the given resource.
|
||||
*
|
||||
* @param \Laravel\Nova\Resource $resource
|
||||
* @return static|null
|
||||
*/
|
||||
public static function forResource($resource)
|
||||
{
|
||||
$model = $resource->model();
|
||||
|
||||
/** @var static|null $field */
|
||||
$field = transform(
|
||||
$resource->availableFieldsOnIndexOrDetail(app(NovaRequest::class))
|
||||
->whereInstanceOf(self::class)
|
||||
->first(),
|
||||
function ($field) use ($model) {
|
||||
return tap($field)->resolve($model);
|
||||
},
|
||||
function () use ($model) {
|
||||
return ! is_null($model) && $model->exists ? static::forModel($model) : null;
|
||||
}
|
||||
);
|
||||
|
||||
if ($field instanceof static) {
|
||||
return empty($field->value) && $field->nullable !== true ? null : $field;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new, resolved ID field for the given model.
|
||||
*
|
||||
* @param \Illuminate\Database\Eloquent\Model $model
|
||||
* @return static
|
||||
*/
|
||||
public static function forModel($model)
|
||||
{
|
||||
return tap(static::make('ID', $model->getKeyName()), function ($field) use ($model) {
|
||||
$value = $model->getKey();
|
||||
|
||||
if (is_int($value) && $value >= 9007199254740991) {
|
||||
$field->asBigInt();
|
||||
}
|
||||
|
||||
$field->resolve($model);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve the given attribute from the given resource.
|
||||
*
|
||||
* @param mixed $resource
|
||||
* @param string $attribute
|
||||
* @return mixed
|
||||
*/
|
||||
protected function resolveAttribute($resource, $attribute)
|
||||
{
|
||||
if ($resource instanceof Model) {
|
||||
$pivotAccessor = $this->pivotAccessor ?? 'pivot';
|
||||
|
||||
$pivotValue = $resource->relationLoaded($pivotAccessor)
|
||||
? optional($resource->{$pivotAccessor})->getKey()
|
||||
: null;
|
||||
|
||||
if (is_int($pivotValue) || is_string($pivotValue)) {
|
||||
$this->pivotValue = $pivotValue;
|
||||
}
|
||||
}
|
||||
|
||||
return Util::safeInt(
|
||||
parent::resolveAttribute($resource, $attribute)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve a BIGINT ID field as a string for compatibility with JavaScript.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function asBigInt()
|
||||
{
|
||||
$this->resolveCallback = function ($id) {
|
||||
return (string) $id;
|
||||
};
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Hide the ID field from the Nova interface but keep it available for operations.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function hide()
|
||||
{
|
||||
$this->showOnIndex = false;
|
||||
$this->showOnDetail = false;
|
||||
$this->showOnCreation = false;
|
||||
$this->showOnUpdate = false;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare the field for JSON serialization.
|
||||
*
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
public function jsonSerialize(): array
|
||||
{
|
||||
return array_merge(parent::jsonSerialize(), array_filter([
|
||||
'pivotValue' => $this->pivotValue ?? null,
|
||||
]));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user