318 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			318 lines
		
	
	
		
			7.4 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 array */
 | |
|     public $options;
 | |
| 
 | |
|     /** @var array */
 | |
|     public $option;
 | |
| 
 | |
|     /** @var string */
 | |
|     public $optionKey;
 | |
| 
 | |
|     /** @var string */
 | |
|     public $optionValue;
 | |
| 
 | |
|     /** @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 $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 = '',
 | |
|         $options = [], $option = [], string $optionKey = 'id', string $optionValue = 'name', $checked = null, $checkedKey = null, $selected = null, $selectedKey = null, $rows = '3',
 | |
|         $remote = false, $multiple = false, $addNew = false, $group = 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->rows = $rows;
 | |
| 
 | |
|         $this->remote = $remote;
 | |
|         $this->multiple = $multiple;
 | |
|         $this->addNew = $addNew;
 | |
|         $this->group = $group;
 | |
| 
 | |
|         $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->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 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 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;
 | |
|         }
 | |
|     }
 | |
| }
 |