// Repeater for items will go here Forms\Components\Repeater::make('orderItems') ->relationship() ->schema([ Select::make('category_id') ->required() ->placeholder('Select Category') ->label('Category') ->options(Category::query()->where(['is_active' => 1, 'is_parent' => 1])->pluck('name', 'id')->toArray()) ->reactive() ->afterStateUpdated(fn (callable $set) => $set('product_id', null)), Select::make('product_id') ->label('Product') ->options(function (callable $get) { $category_id = $get('category_id'); if(! $category_id) { return Product::query()->where('is_active', 1)->pluck('name', 'id'); } return Product::whereHas('categories', function ($query) use ($category_id) { $query->where('categories.id', $category_id); })->pluck('name', 'id'); }) ->required() ->reactive() ->placeholder('Select Product') ->afterStateHydrated(function ($state, callable $set) { $product = Product::find($state); if($product) { $set('price', number_format($product->price, 2)); $set('product_price', $product->price); $set('stock', $product->stock); } }) ->afterStateUpdated(function ($state, callable $set) { $product = Product::find($state); if($product) { $set('price', number_format($product->price, 2)); $set('product_price', $product->price); $set('stock', $product->stock); $set('total_price', $product->price * $product->quantity); } }), TextInput::make('product_quantity') ->reactive() ->label('Qty') ->numeric() ->default(1) ->minValue(1) ->required(), TextInput::make('price') ->label('Unit Price') ->disabled() ->reactive() ->numeric(), Hidden::make('product_price') ->disabled() ])->columns([ 'sm' => 4, ])->defaultItems(1) ->columnSpan('full'), // End of repeater Hidden::make('payment_status') ->default('unpaid'), TextInput::make('shipping_fee') ->label('Delivery fee') ->reactive() ->afterStateHydrated(function ($state, callable $set, callable $get) { $orderItems = collect($get('orderItems')); $shippingFee = $state; $subtotal = $orderItems->sum(function ($item) { return $item['product_quantity'] * $item['product_price']; }); $set('total', $subtotal + $shippingFee); }) ->afterStateUpdated(function ($state, callable $set, callable $get) { $orderItems = collect($get('orderItems')); $shippingFee = $state; $subtotal = $orderItems->sum(function ($item) { return $item['product_quantity'] * $item['product_price']; }); $set('total', $subtotal + $shippingFee); }) ->required() ->numeric(), TextInput::make('total') ->label('Total') ->disabled()