354 lines
8.3 KiB
PHP
354 lines
8.3 KiB
PHP
<?php
|
|
|
|
namespace App\Abstracts\View\Components;
|
|
|
|
use App\Abstracts\View\Component;
|
|
use Illuminate\Support\Collection;
|
|
|
|
abstract class Form extends Component
|
|
{
|
|
/** @var string */
|
|
public $type;
|
|
|
|
/** @var string */
|
|
public $name;
|
|
|
|
/** @var string */
|
|
public $label;
|
|
|
|
/** @var string */
|
|
public $id;
|
|
|
|
public $value;
|
|
|
|
/** @var string */
|
|
public $valueKey;
|
|
|
|
/** @var string */
|
|
public $placeholder;
|
|
|
|
/** @var string */
|
|
public $searchText;
|
|
|
|
/** @var array */
|
|
public $options;
|
|
|
|
/** @var array */
|
|
public $option;
|
|
|
|
/** @var string */
|
|
public $optionKey;
|
|
|
|
/** @var string */
|
|
public $optionValue;
|
|
|
|
/** @var array */
|
|
public $fullOptions;
|
|
|
|
/** @var string */
|
|
public $checked;
|
|
|
|
/** @var string */
|
|
public $checkedKey;
|
|
|
|
/** @var string */
|
|
public $selected;
|
|
|
|
/** @var string */
|
|
public $selectedKey;
|
|
|
|
/** @var string */
|
|
public $rows;
|
|
|
|
/** @var bool */
|
|
public $remote;
|
|
|
|
/** @var bool */
|
|
public $multiple;
|
|
|
|
/** @var bool */
|
|
public $addNew;
|
|
|
|
/** @var bool */
|
|
public $group;
|
|
|
|
/** @var bool */
|
|
public $searchable;
|
|
|
|
/** @var bool */
|
|
public $disabled;
|
|
|
|
/** @var bool */
|
|
public $readonly;
|
|
|
|
/** @var bool */
|
|
public $required;
|
|
|
|
/** @var bool */
|
|
public $notRequired;
|
|
|
|
/** @var string */
|
|
public $formGroupClass = 'sm:col-span-3';
|
|
|
|
/** @var string */
|
|
public $inputGroupClass = '';
|
|
|
|
/** @var array */
|
|
public $custom_attributes = [];
|
|
|
|
/** @var array */
|
|
public $dynamicAttributes = [];
|
|
|
|
/** @var bool */
|
|
public $hideCurrency;
|
|
|
|
/**
|
|
* Create a new component instance.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function __construct(
|
|
string $name = '', string $type = 'text', string $label = '', string $id = null, $value = '', $valueKey = null, string $placeholder = '', string $searchText = '',
|
|
$options = [], $option = [], string $optionKey = 'id', string $optionValue = 'name', $fullOptions = [], $checked = null, $checkedKey = null, $selected = null, $selectedKey = null, $rows = '3',
|
|
$remote = false, $multiple = false, $addNew = false, $group = false,
|
|
bool $searchable = false, bool $disabled = false, bool $readonly = false, bool $required = true, bool $notRequired = false,
|
|
string $formGroupClass = '', string $inputGroupClass = '',
|
|
$dynamicAttributes = '',
|
|
bool $hideCurrency = false
|
|
) {
|
|
$this->type = $this->getType($type);
|
|
$this->name = $this->getName($name);
|
|
$this->label = $label;
|
|
$this->id = $id ?? $name;
|
|
$this->value = $this->getValue($value, $valueKey);
|
|
$this->placeholder = $this->getPlaceholder($placeholder);
|
|
$this->searchText = $this->getSearchText($searchText);
|
|
$this->rows = $rows;
|
|
|
|
$this->remote = $remote;
|
|
$this->multiple = $multiple;
|
|
$this->addNew = $addNew;
|
|
$this->group = $group;
|
|
|
|
$this->searchable = $searchable;
|
|
$this->disabled = $disabled;
|
|
$this->readonly = $readonly;
|
|
$this->required = $this->getRequired($required, $notRequired);
|
|
|
|
$this->options = $this->getOptions($options);
|
|
$this->option = $option;
|
|
$this->optionKey = $optionKey;
|
|
$this->optionValue = $optionValue;
|
|
$this->fullOptions = $this->getFullOptions($fullOptions, $options, $searchable);
|
|
$this->checked = $this->getChecked($checked, $checkedKey);
|
|
$this->selected = $this->getSelected($selected, $selectedKey);
|
|
|
|
$this->formGroupClass = $this->getFromGroupClass($formGroupClass);
|
|
$this->inputGroupClass = $this->getInputGroupClass($inputGroupClass);
|
|
|
|
$this->custom_attributes = $this->getCustomAttributes();
|
|
|
|
$this->setDynamicAttributes($dynamicAttributes);
|
|
|
|
$this->hideCurrency = $hideCurrency;
|
|
}
|
|
|
|
protected function getType($type)
|
|
{
|
|
if (! empty($type) && (! empty($this->type) && $type != 'text')) {
|
|
return $type;
|
|
}
|
|
|
|
if (! empty($this->type)) {
|
|
return $this->type;
|
|
}
|
|
}
|
|
|
|
protected function getName($name)
|
|
{
|
|
if (! empty($name)) {
|
|
return $name;
|
|
}
|
|
|
|
return $this->name;
|
|
}
|
|
|
|
protected function getValue($value, $valueKey)
|
|
{
|
|
if ($value != '') {
|
|
return $value;
|
|
}
|
|
|
|
if (empty($valueKey)) {
|
|
$valueKey = $this->name;
|
|
}
|
|
|
|
if (empty($valueKey)) {
|
|
return '';
|
|
}
|
|
|
|
// set model value.
|
|
$model = $this->getParentData('model');
|
|
|
|
$value_keys = explode('.', $valueKey);
|
|
|
|
if (count($value_keys) > 1) {
|
|
$valueKey = $value_keys[0];
|
|
}
|
|
|
|
if (! empty($model->{$valueKey})) {
|
|
$value = $model->{$valueKey};
|
|
}
|
|
|
|
if ($model instanceof Collection) {
|
|
$value = $model->get($valueKey);
|
|
}
|
|
|
|
if (count($value_keys) > 1) {
|
|
$value = $value[0]->{$value_keys[1]};
|
|
}
|
|
|
|
if (empty($value) && request()->has($valueKey)) {
|
|
$value = request()->get($valueKey);
|
|
}
|
|
|
|
return old($valueKey, $value);
|
|
}
|
|
|
|
protected function getPlaceholder($placeholder)
|
|
{
|
|
if (! empty($placeholder)) {
|
|
return $placeholder;
|
|
}
|
|
|
|
$label = $this->label;
|
|
|
|
if (! empty($this->label) && ! empty($this->label->contents)) {
|
|
$label = $this->name;
|
|
}
|
|
|
|
if ($this->type == 'select') {
|
|
return trans('general.form.select.field', ['field' => $label]);
|
|
}
|
|
|
|
return trans('general.form.enter', ['field' => $label]);
|
|
}
|
|
|
|
protected function getSearchText($searchText)
|
|
{
|
|
if (! empty($searchText)) {
|
|
return $searchText;
|
|
}
|
|
|
|
return trans('general.search_placeholder');
|
|
}
|
|
|
|
protected function getOptions($options)
|
|
{
|
|
if (! empty($options)) {
|
|
if (is_array($options) && ! $this->group) {
|
|
$o = collect();
|
|
|
|
foreach ($options as $key => $value) {
|
|
if (is_array($value)) {
|
|
$o->push((object) $value);
|
|
} else {
|
|
$o->push((object) [
|
|
'id' => $key,
|
|
'name' => $value,
|
|
]);
|
|
}
|
|
}
|
|
|
|
$options = $o;
|
|
}
|
|
|
|
return $options;
|
|
}
|
|
|
|
return [];
|
|
}
|
|
|
|
protected function getFullOptions($fullOptions, $options, $searchable)
|
|
{
|
|
if (! empty($fullOptions)) {
|
|
return $fullOptions;
|
|
}
|
|
|
|
if ($searchable && empty($fullOptions)) {
|
|
$this->options = $this->options->take(setting('default.select_limit'));
|
|
|
|
return $options;
|
|
}
|
|
|
|
return [];
|
|
}
|
|
|
|
protected function getChecked($checked, $checkedKey)
|
|
{
|
|
return $this->getValue($checked, $checkedKey);
|
|
}
|
|
|
|
protected function getSelected($selected, $selectedKey)
|
|
{
|
|
return $this->getValue($selected, $selectedKey);
|
|
}
|
|
|
|
protected function getRequired($required, $notRequired)
|
|
{
|
|
if (! empty($notRequired)) {
|
|
return false;
|
|
}
|
|
|
|
return $required;
|
|
}
|
|
|
|
protected function getFromGroupClass($formGroupClass)
|
|
{
|
|
if (! empty($formGroupClass)) {
|
|
return $formGroupClass;
|
|
}
|
|
|
|
return $this->formGroupClass;
|
|
}
|
|
|
|
protected function getInputGroupClass($inputGroupClass)
|
|
{
|
|
if (! empty($inputGroupClass)) {
|
|
return $inputGroupClass;
|
|
}
|
|
|
|
return $this->inputGroupClass;
|
|
}
|
|
|
|
protected function getCustomAttributes()
|
|
{
|
|
$attributes = [];
|
|
|
|
if (! empty($this->required)) {
|
|
$attributes['required'] = $this->required;
|
|
}
|
|
|
|
if (! empty($this->disabled)) {
|
|
$attributes['disabled'] = $this->disabled;
|
|
}
|
|
|
|
if (! empty($this->readonly)) {
|
|
$attributes['readonly'] = $this->readonly;
|
|
}
|
|
|
|
foreach ($this->custom_attributes as $key => $value) {
|
|
$attributes[$key] = $value;
|
|
}
|
|
|
|
return $attributes;
|
|
}
|
|
|
|
protected function setDynamicAttributes($dynamicAttributes)
|
|
{
|
|
if (! empty($dynamicAttributes)) {
|
|
$this->dynamicAttributes = $dynamicAttributes;
|
|
}
|
|
}
|
|
}
|