AbstractNumberFieldElement.java

package org.vaadin.addons.dramafinder.element;

import com.microsoft.playwright.Locator;
import org.vaadin.addons.dramafinder.element.shared.FocusableElement;
import org.vaadin.addons.dramafinder.element.shared.HasAllowedCharPatternElement;
import org.vaadin.addons.dramafinder.element.shared.HasAriaLabelElement;
import org.vaadin.addons.dramafinder.element.shared.HasClearButtonElement;
import org.vaadin.addons.dramafinder.element.shared.HasEnabledElement;
import org.vaadin.addons.dramafinder.element.shared.HasInputFieldElement;
import org.vaadin.addons.dramafinder.element.shared.HasPlaceholderElement;
import org.vaadin.addons.dramafinder.element.shared.HasPrefixElement;
import org.vaadin.addons.dramafinder.element.shared.HasSuffixElement;
import org.vaadin.addons.dramafinder.element.shared.HasThemeElement;
import org.vaadin.addons.dramafinder.element.shared.HasTooltipElement;
import org.vaadin.addons.dramafinder.element.shared.HasValidationPropertiesElement;

import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;

/**
 * Base abstraction for Vaadin number-like fields.
 * <p>
 * Provides shared behavior for numeric inputs, including access to step
 * controls (increase/decrease buttons) and common mixins for validation,
 * input handling, theming, accessibility, and focus.
 */
public abstract class AbstractNumberFieldElement extends VaadinElement
        implements HasValidationPropertiesElement, HasInputFieldElement,
        HasPrefixElement, HasSuffixElement, HasClearButtonElement,
        HasPlaceholderElement, HasAllowedCharPatternElement, HasThemeElement,
        FocusableElement, HasAriaLabelElement, HasEnabledElement, HasTooltipElement {

    /**
     * Creates a new {@code AbstractNumberFieldElement}.
     *
     * @param locator the locator pointing at the component root element
     */
    public AbstractNumberFieldElement(Locator locator) {
        super(locator);
    }

    /**
     * Whether the step controls (increase/decrease buttons) are visible.
     *
     * @return {@code true} if the attribute is present, otherwise {@code false}
     */
    public boolean getHasControls() {
        String v = getLocator().getAttribute("step-buttons-visible");
        return Boolean.parseBoolean(v);
    }

    /**
     * Assert the visibility of step controls.
     *
     * @param hasControls expected presence of the controls
     */
    public void assertHasControls(boolean hasControls) {
        if (hasControls) {
            assertThat(getLocator()).hasAttribute("step-buttons-visible", "");
        } else {
            assertThat(getLocator()).not().hasAttribute("step-buttons-visible", "");
        }
    }

    /**
     * Click the increase button.
     */
    public void clickIncreaseButton() {
        getLocator().locator("[part~='increase-button']").click();
    }

    /**
     * Click the decrease button.
     */
    public void clickDecreaseButton() {
        getLocator().locator("[part~='decrease-button']").click();
    }

}