Hello, using Laravel 10 Livewire 3.
I have a form where I need to validate fields on conditions.
My Code:
PackOrderComponent.php:
<?php
namespace App\Livewire\Admin\Order;
use Livewire\Component;
use Jantinnerezo\LivewireAlert\LivewireAlert;
use App\Livewire\Admin\Order\OrderPackedForm;
use App\Traits\OrderTrait;
use App\Models\Box;
use App\Models\Order;
class PackOrderComponent extends Component
{
use LivewireAlert, OrderTrait;
public Order $order;
public $boxes;
public $boxes_used = [];
public $no_boxes_used;
public $packed_from;
public $till_slip_date;
public $ask_if_ground;
public $show_till_date;
public OrderPackedForm $form;
public function mount(Order $order)
{
$this->order = $order;
$this->boxes = Box::where('active', 1)->get();
$this->form->setup($order);
}
public function packed()
{
$this->form->store();
}
public function render()
{
return view('livewire.admin.order.pack-order-component')->extends('layouts.admin.master');
}
}
PackOrderForm.php
namespace App\Livewire\Admin\Order;
use Livewire\Form;
use Illuminate\Validation\Rule;
use Illuminate\Support\Carbon;
use App\Enums\StatusEnum;
use App\Enums\PackedFromEnum;
use App\Enums\ShippingMethodEnum;
use App\Models\Box;
use App\Models\OrderItemView;
use App\Models\Order;
class OrderPackedForm extends Form
{
public $boxes_used;
public $no_boxes_used;
public $packed_from;
public $till_slip_date;
public $till_slip_time;
public $options_checked;
public $errors;
public Order $order;
protected $rules = ['till_slip_time' => 'required'];
//If I try this and not the till_slip_time everything is fine
//protected $rules = ['packed_from' => 'required'];
public function setup(Order $order): void
{
$this->order = $order;
$this->no_boxes_used = $order->shipping_method != ShippingMethodEnum::COURIER;
$this->boxes_used = [];
$this->options_checked = 0;
$this->packed_from = $order->customer->dispatch_from_shop ? PackedFromEnum::SHOP : PackedFromEnum::WAREHOUSE;
$this->till_slip_time = '';
}
public function store(): void
{
$till_slip_date_for_db = NULL;
$this->errors = $this->getErrorBag();
//Doing all the validations and stock updates if not rep
if (!auth()->user()->hasRole("Sales Rep")) {
$this->validate();
if ($this->packed_from == PackedFromEnum::WAREHOUSE) {
//Get all the items to pack and check if there are enough in stock
$items = OrderItemView::where('order_id', $this->order->id)->get();
foreach ($items as $item) {
if ($item->stock < $item->qty)
$this->errors->add($this->order->id . '-' . $item->id, "You don't have enouth stock of $item->name in stock");
}
}
if ($this->errors->any()) {
dd('errors');
} else {
dd('no errors');
if ($this->packed_from == PackedFromEnum::SHOP) {
$till_slip_date_for_db = Carbon::createFromFormat('!d/m/Y H:i', $this->till_slip_date . ' ' . $this->till_slip_time);
}
$this->order->update([
'status' => StatusEnum::DELIVER,
'packed_by' => auth()->id(),
'packed_from' => $this->packed_from,
'till_slip_date' => $till_slip_date_for_db
]);
if (!empty($this->boxes_used)) {
foreach ($this->boxes_used as $key => $val) {
$box = Box::find($key);
$box->update(['stock' => $box->stock - $val]);
}
}
}
}
}
}
pack-order-component.blade.php:
<div>
<div class="card">
<div class="card-header bg-light">Order ID: <span class="font-600">{{ $order->id }}</span> / Date: <span class="font-600">{{ $order->created_at }}</span></div>
<div class="card-body">
@if($order->customer->dispatch_from_shop)
<div class="alert alert-info">Dispatch From Shop</div>
@endif
@if($order->updated)
<div class="alert alert-danger">
<p>The order has been updated, would you like to send an email to the customer?</p>
<a href="{{ url('orders/send-update-email/' . $order->id) }}" class="btn btn-default btn-sm">Send Email</a>
</div>
@endif
<livewire:admin.order.display-order-component :order="$order" :key="'order' .$order->id" />
<x-livewire-form action="packed" submitBtnName="Packed" showRequired="0">
@if(Auth::user()->hasRole('Sales Rep'))
<input type="hidden" wire:model="form.packed_from" value="{{ \App\Enums\PackedFromEnum::SALESREP }}">
@else
<div class="form-group">
<label for="packedFrom">Packed From</label>
<select wire:model="form.packed_from" class="form-control packedFrom">
<option value="{{ \App\Enums\PackedFromEnum::WAREHOUSE }}">Warehouse</option>
<option value="{{ \App\Enums\PackedFromEnum::SHOP }}">Shop</option>
</select>
</div>
<div class="form-group">
<label for="tillSlipTime">Till Slip Time</label>
<input type="text" wire:model="form.till_slip_time" class="form-control time @error('form.till_slip_time') is-invalid @enderror" id="tillSlipTime">
<x-display-error error="form.till_slip_time"/>
</div>
@endif
</x-livewire-form>
</div>
</div>
</div>
When submitting the form I get this error:
Property type not supported in Livewire for property: [[]]
What does this error mean? Why do I get it?