steps($steps); } public static function make(array | Closure $steps = []): static { $static = app(static::class, ['steps' => $steps]); $static->configure(); return $static; } protected function setUp(): void { parent::setUp(); $this->registerListeners([ 'wizard::nextStep' => [ function (Wizard $component, string $statePath, string $currentStep): void { if ($statePath !== $component->getStatePath()) { return; } if (! $component->isSkippable()) { /** @var Step $currentStep */ $currentStep = $component->getChildComponentContainer()->getComponents(withHidden: true)[$currentStep]; $currentStep->callBeforeValidation(); $currentStep->getChildComponentContainer()->validate(); $currentStep->callAfterValidation(); } /** @var LivewireComponent $livewire */ $livewire = $component->getLivewire(); $livewire->dispatchBrowserEvent('next-wizard-step', [ 'statePath' => $statePath, ]); }, ], ]); } public function steps(array | Closure $steps): static { $this->childComponents($steps); return $this; } public function startOnStep(int | Closure $startStep): static { $this->startStep = $startStep; return $this; } public function cancelAction(string | Htmlable | null $action): static { $this->cancelAction = $action; return $this; } public function submitAction(string | Htmlable | null $action): static { $this->submitAction = $action; return $this; } public function skippable(bool | Closure $condition = true): static { $this->skippable = $condition; return $this; } public function persistStepInQueryString(string | Closure | null $key = 'step'): static { $this->stepQueryStringKey = $key; return $this; } public function getCancelAction(): string | Htmlable | null { return $this->cancelAction; } public function getSubmitAction(): string | Htmlable | null { return $this->submitAction; } public function getStartStep(): int { if ($this->isStepPersistedInQueryString()) { $queryStringStep = request()->query($this->getStepQueryStringKey()); foreach ($this->getChildComponents() as $index => $step) { if ($step->getId() !== $queryStringStep) { continue; } return $index + 1; } } return $this->evaluate($this->startStep); } public function getStepQueryStringKey(): ?string { return $this->evaluate($this->stepQueryStringKey); } public function isSkippable(): bool { return $this->evaluate($this->skippable); } public function isStepPersistedInQueryString(): bool { return filled($this->getStepQueryStringKey()); } }