Feat: Hiding unused shipping types and removing unused fulfillment types
This commit is contained in:
@@ -13,7 +13,6 @@ use Filament\Tables\Table;
|
||||
use Lunar\Admin\Support\Extending\ResourceExtension;
|
||||
use Lunar\Admin\Support\Forms\Components\TranslatedText;
|
||||
use Lunar\Shipping\Facades\Shipping;
|
||||
use Modules\Core\Shipping\Contracts\DeclaresFulfillmentType;
|
||||
use Modules\Core\Shipping\Contracts\SupportsLivePricing;
|
||||
use Modules\Core\Shipping\Support\ShippingMethodName;
|
||||
|
||||
@@ -22,11 +21,9 @@ class ShippingMethodResourceExtension extends ResourceExtension
|
||||
public function extendForm(Schema $schema): Schema
|
||||
{
|
||||
return $schema->components(
|
||||
$this->replaceFulfillmentTypeField(
|
||||
$this->replaceChargeByField(
|
||||
$this->replaceNameField(
|
||||
$this->replaceDriverField($schema->getComponents())
|
||||
)
|
||||
$this->replaceChargeByField(
|
||||
$this->replaceNameField(
|
||||
$this->replaceDriverField($schema->getComponents())
|
||||
)
|
||||
)
|
||||
);
|
||||
@@ -98,64 +95,6 @@ class ShippingMethodResourceExtension extends ResourceExtension
|
||||
return $field;
|
||||
}
|
||||
|
||||
/**
|
||||
* Inserts the `fulfillment_type` Select right after `charge_by`, in
|
||||
* the SAME Group (vendor's own `Group::make([getChargeByFormComponent()])
|
||||
* ->columns(2)`) — formerly appended at the very end of the whole
|
||||
* form, disconnected from `driver`/`charge_by`, the decisions it
|
||||
* actually relates to. Only rendered at all for a driver that DOESN'T
|
||||
* already declare its own fulfillment type (see Modules\Core\Shipping\
|
||||
* Contracts\DeclaresFulfillmentType, Modules\Core\Shipping\Support\
|
||||
* FulfillmentType) — acs/box-now are unambiguously carrier-only, so
|
||||
* asking a merchant to also pick "Carrier delivery" for every ACS/Box
|
||||
* Now method was redundant, error-prone config with no real decision
|
||||
* behind it. Still offered for table-rate-shipping's generic drivers
|
||||
* (flat-rate, ship-by, free-shipping), which are genuinely ambiguous.
|
||||
*/
|
||||
private function replaceFulfillmentTypeField(array $components): array
|
||||
{
|
||||
$result = [];
|
||||
|
||||
foreach ($components as $component) {
|
||||
$result[] = $component;
|
||||
|
||||
if (method_exists($component, 'getName') && $component->getName() === 'charge_by') {
|
||||
$result[] = $this->fulfillmentTypeSelect();
|
||||
} elseif (in_array(HasChildComponents::class, class_uses_recursive($component), true)) {
|
||||
$component->schema($this->replaceFulfillmentTypeField($component->getChildComponents()));
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
private function fulfillmentTypeSelect(): Select
|
||||
{
|
||||
return Select::make('data.fulfillment_type')
|
||||
->label('Fulfillment type')
|
||||
->options([
|
||||
'carrier' => 'Carrier delivery',
|
||||
'store_pickup' => 'Collect in store',
|
||||
])
|
||||
->default('carrier')
|
||||
->required()
|
||||
->visible(fn (Get $get) => $this->driverIsFulfillmentAmbiguous($get('../driver')))
|
||||
->helperText('Whether an order using this method is handed to a carrier, or collected by the customer in person.');
|
||||
}
|
||||
|
||||
private function driverIsFulfillmentAmbiguous(?string $driver): bool
|
||||
{
|
||||
if (! $driver) {
|
||||
return true;
|
||||
}
|
||||
|
||||
try {
|
||||
return ! Shipping::driver($driver) instanceof DeclaresFulfillmentType;
|
||||
} catch (InvalidArgumentException) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Extend the vendor's cart_total/weight charge_by Select with a third
|
||||
* "live" option — only offered when the currently selected driver
|
||||
@@ -297,7 +236,7 @@ class ShippingMethodResourceExtension extends ResourceExtension
|
||||
->label('Type')
|
||||
->options(fn () => collect(Shipping::getSupportedDrivers())
|
||||
->mapWithKeys(fn ($driver, $key) => [$key => $driver->name()]))
|
||||
->default('flat-rate')
|
||||
->default('acs')
|
||||
->live();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user