Dynamic form for product prices

I want to apply a dynamic form to ProductResource based on the existing license list.
products
- id
- name
products
- id
- name
licenses
- id
- name
licenses
- id
- name
product_price
- id
- license_id
- product_id
- price
- promo_price
product_price
- id
- license_id
- product_id
- price
- promo_price
Table products hasMany to product_price, product_price(product_id) belongsTo to products, and also license_id belongTo to licenses. I want to create a form based on a list of licenses by entering price and promo_price in the product_price table I have tried but not achieved
Group::make(function(Livewire $livewire, ?Model $record) {
if ($livewire instanceof Pages\EditProduct) {
$productPrices = $record->productPrices;

return collect($productPrices)->map(function($price) {
$license = $price->license;

return Section::make($price->id)
->heading(str($license->name)->headline())
->id("data.productPrices.record-{$price->id}")
->schema([
Placeholder::make(json_encode($license)),
TextInput::make("record-{$price->id}.price")->numeric()->required(),
TextInput::make("record-{$price->id}.promo_price")->numeric()->required(),
]);
})->toArray();
} elseif ($livewire instanceof Pages\CreateProduct) {
return collect(License::all())->map(function($license) {
return Section::make(str($license->name)->headline())
->schema([
Placeholder::make(json_encode($license)),
TextInput::make('productPrices.price')->numeric()->required(),
TextInput::make('productPrices.promo_price')->numeric()->required(),
]);
})->toArray();
} else {
throw new \InvalidArgumentException('Unsupported $livewire instance.');
}
})->statePath('productPrices');
Group::make(function(Livewire $livewire, ?Model $record) {
if ($livewire instanceof Pages\EditProduct) {
$productPrices = $record->productPrices;

return collect($productPrices)->map(function($price) {
$license = $price->license;

return Section::make($price->id)
->heading(str($license->name)->headline())
->id("data.productPrices.record-{$price->id}")
->schema([
Placeholder::make(json_encode($license)),
TextInput::make("record-{$price->id}.price")->numeric()->required(),
TextInput::make("record-{$price->id}.promo_price")->numeric()->required(),
]);
})->toArray();
} elseif ($livewire instanceof Pages\CreateProduct) {
return collect(License::all())->map(function($license) {
return Section::make(str($license->name)->headline())
->schema([
Placeholder::make(json_encode($license)),
TextInput::make('productPrices.price')->numeric()->required(),
TextInput::make('productPrices.promo_price')->numeric()->required(),
]);
})->toArray();
} else {
throw new \InvalidArgumentException('Unsupported $livewire instance.');
}
})->statePath('productPrices');
1 Reply
zainalab
zainalab3mo ago
I have a solution, but this worked for me. If yes, please fix it..
Forms\Components\Repeater::make('productPrices')
->relationship()
->schema([
Forms\Components\Hidden::make('license_id'),
Forms\Components\TextInput::make('price')
->numeric()
])
->deletable(false)
->collapsible()
->addable(false)
->itemLabel(fn (array $state): ?string => License::find($state['license_id'])->name ?? null)
->formatStateUsing(function(Livewire $livewire, $state) {
if ($livewire instanceof Pages\EditProduct && ! blank($state)) {
return $state;
}

return collect(License::all())
->map(fn($license) => ['license_id' => $license->id])
->toArray();
})
Forms\Components\Repeater::make('productPrices')
->relationship()
->schema([
Forms\Components\Hidden::make('license_id'),
Forms\Components\TextInput::make('price')
->numeric()
])
->deletable(false)
->collapsible()
->addable(false)
->itemLabel(fn (array $state): ?string => License::find($state['license_id'])->name ?? null)
->formatStateUsing(function(Livewire $livewire, $state) {
if ($livewire instanceof Pages\EditProduct && ! blank($state)) {
return $state;
}

return collect(License::all())
->map(fn($license) => ['license_id' => $license->id])
->toArray();
})
there are still new problems here. If there is an additional License. then the new license does not appear on the repeater page edit.. do you have a solution?