Dynamic form for product prices
I want to apply a dynamic form to ProductResource based on the existing license list.
Table
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
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
I have a solution, but this worked for me. If yes, please fix it..
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?
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();
})