mode = $mode; } /** * Get the root selector for the component. */ public function selector(): string { // Livewire modals typically have a specific structure return '[role="dialog"], .fixed.inset-0'; } /** * Assert that the browser page contains the component. */ public function assert(Browser $browser): void { $browser->assertVisible($this->selector()); if ($this->mode === 'create') { $browser->assertSee('Add New Dish'); } else { $browser->assertSee('Edit Dish'); } } /** * Get the element shortcuts for the component. * * @return array */ public function elements(): array { return [ '@name-input' => 'input[wire\\:model="name"]', '@description-input' => 'textarea[wire\\:model="description"]', '@users-section' => 'div:contains("Assign to Users")', '@submit-button' => $this->mode === 'create' ? 'button:contains("Create Dish")' : 'button:contains("Update Dish")', '@cancel-button' => 'button:contains("Cancel")', '@validation-error' => '.text-red-500', ]; } /** * Fill the dish form. */ public function fillForm(Browser $browser, string $name, ?string $description = null): void { $browser->waitFor('@name-input') ->clear('@name-input') ->type('@name-input', $name); if ($description !== null && $browser->element('@description-input')) { $browser->clear('@description-input') ->type('@description-input', $description); } } /** * Select users to assign the dish to. */ public function selectUsers(Browser $browser, array $userIds): void { foreach ($userIds as $userId) { $browser->check("input[type='checkbox'][value='{$userId}']"); } } /** * Submit the form. */ public function submit(Browser $browser): void { $browser->press($this->mode === 'create' ? 'Create Dish' : 'Update Dish'); } /** * Cancel the modal. */ public function cancel(Browser $browser): void { $browser->press('Cancel'); } /** * Assert validation error is shown. */ public function assertValidationError(Browser $browser, string $message = 'required'): void { $browser->assertSee($message); } }