HEX
Server: LiteSpeed
System: Linux sv4.hami.host 5.14.0-611.54.3.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Thu May 7 16:31:24 EDT 2026 x86_64
User: armgroup (1008)
PHP: 8.2.32
Disabled: show_source, system, shell_exec, passthru, exec, popen, proc_open, mail, socket_create, socket_create_listen, socket_create_pair, link, dl, openlog, syslog, stream_socket_server, curl_multi_init
Upload Files
File: //home/armgroup/libs/app/Http/Livewire/Admin/Option/Edit.php
<?php

namespace App\Http\Livewire\Admin\Option;

use App\Http\Livewire\ConvertEmptyStringsToNull;
use App\Http\Livewire\General;
use App\Models\Option;
use App\Models\OptionValue;
use Illuminate\Support\Facades\DB;
use Livewire\Component;

class Edit extends Component
{
    use ConvertEmptyStringsToNull, General;

    public Option $option;

    public $values = [];

    public $deleteIds = [];

    public function mount()
    {
        $this->values = $this->option
            ->values()
            ->select('id', 'option_id', 'name', 'sort_order', 'color')
            ->get()
            ->toArray();
    }

    public function render()
    {
        return view('livewire.admin.option.edit');
    }

    protected function rules()
    {
        return [
            'option.name' => 'required|max:250|string',
            'option.label' => 'nullable|max:250|string',
            'option.sort_order' => 'nullable|integer|min:0|max:10000',
            'option.type' => 'required|integer|min:0|max:'.(count(Option::TYPE_TRANSLATE) - 1),
            'values.*.name' => 'required|max:250|string|distinct',
            'values.*.color' => ['nullable', 'regex:/^(#(?:[0-9a-f]{2}){2,4}|#[0-9a-f]{3}|(?:rgba?|hsla?)\((?:\d+%?(?:deg|rad|grad|turn)?(?:,|\s)+){2,3}[\s\/]*[\d\.]+%?\))$/i'],
            'values.*.sort_order' => 'nullable|integer|min:0|max:10000',
        ];
    }

    protected $validationAttributes = [
        'values.*.name' => 'مقدار',
        'values.*.color' => 'رنگ',
        'values.*.sort_order' => 'ترتیپ',
    ];

    public function addItem()
    {
        $this->values[] = [
            'id' => null,
            'option_id' => $this->option->id,
            'name' => null,
            'sort_order' => null,
            'color' => null,
        ];
    }

    public function removeItem($index)
    {
        if ($this->values[$index]['id']) {
            $this->deleteIds[] = $this->values[$index]['id'];
        }

        unset($this->values[$index]);
    }

    public function update()
    {
        if (count($this->deleteIds)) {
            $count = DB::table('option_product')->whereIn('value_id', $this->deleteIds)->distinct('product_id')->count();
            if ($count) {
                $this->ajaxDoneMessage("تعداد {$count} محصول دارای گزینه با مقادیر حذف شده می‌باشند و امکان حذف این موارد نیست، لطفا ابتدا محصولات را ویرایش نمایید.", 'error');

                return;
            }
        }

        $this->validate();

        DB::transaction(function () {
            $this->option->update([
                'name' => $this->option->name,
                'label' => $this->option->label,
                'sort_order' => $this->option->sort_order,
                'type' => $this->option->type,
            ]);
            if (! count($this->values)) {
                $this->option->values()->delete();
            } else {
                if (count($this->deleteIds)) {
                    OptionValue::whereIn('id', $this->deleteIds)->delete();
                }

                OptionValue::upsert(
                    $this->values,
                    ['id', 'option_id'],
                    ['name', 'sort_order', 'color']
                );
            }

            saveActivity("گزینه {$this->option->name} ویرایش شد", $this->option);
        });

        $this->doneMessage();

        return redirect()->route('admin.options.index');
    }
}