All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.patternfly.component.expandable.ExpandableSectionToggle Maven / Gradle / Ivy

There is a newer version: 0.2.11
Show newest version
/*
 *  Copyright 2023 Red Hat
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package org.patternfly.component.expandable;

import org.jboss.elemento.ButtonType;
import org.jboss.elemento.By;
import org.jboss.elemento.Id;
import org.patternfly.component.ComponentType;
import org.patternfly.style.Classes;

import elemental2.dom.HTMLButtonElement;
import elemental2.dom.HTMLElement;

import static org.jboss.elemento.Elements.button;
import static org.jboss.elemento.Elements.failSafeRemoveFromParent;
import static org.jboss.elemento.Elements.span;
import static org.jboss.elemento.EventType.click;
import static org.patternfly.component.expandable.ExpandableSectionToggleText.expandableSectionToggleText;
import static org.patternfly.core.Aria.expanded;
import static org.patternfly.icon.IconSets.fas.angleRight;
import static org.patternfly.style.Classes.component;
import static org.patternfly.style.Classes.expandTop;
import static org.patternfly.style.Classes.icon;
import static org.patternfly.style.Classes.modifier;
import static org.patternfly.style.Classes.toggle;

public class ExpandableSectionToggle extends ExpandableSectionSubComponent {

    // ------------------------------------------------------ factory

    public static ExpandableSectionToggle expandableSectionToggle() {
        return new ExpandableSectionToggle(null, null);
    }

    public static ExpandableSectionToggle expandableSectionToggle(String moreText) {
        return new ExpandableSectionToggle(moreText, null);
    }

    public static ExpandableSectionToggle expandableSectionToggle(String moreText, String lessText) {
        return new ExpandableSectionToggle(moreText, lessText);
    }

    // ------------------------------------------------------ instance

    static final String SUB_COMPONENT_NAME = "est";

    final String id;
    private final HTMLElement toggleIconElement;
    private boolean up;
    private ExpandableSectionToggleText text;

    ExpandableSectionToggle(String moreText, String lessText) {
        super(SUB_COMPONENT_NAME, button(ButtonType.button).css(component(Classes.expandableSection, toggle))
                .aria(expanded, false)
                .element());
        on(click, e -> {
            ExpandableSection expandableSection = lookupComponent();
            expandableSection.toggle();
        });

        id(id = Id.unique(ComponentType.ExpandableSection.id, "tgl"));
        add(toggleIconElement = span().css(component(Classes.expandableSection, toggle, icon))
                .add(angleRight().element())
                .element());
        if (moreText != null || lessText != null) {
            add(expandableSectionToggleText(moreText, lessText));
        }
    }

    // ------------------------------------------------------ add

    public ExpandableSectionToggle addText(ExpandableSectionToggleText text) {
        return add(text);
    }

    // override to ensure internal wiring
    public ExpandableSectionToggle add(ExpandableSectionToggleText text) {
        this.text = text;
        add(text.element());
        return this;
    }

    // ------------------------------------------------------ builder

    /** Changes the toggle icon to point upwards. */
    public ExpandableSectionToggle up() {
        this.up = true;
        return this;
    }

    @Override
    public ExpandableSectionToggle that() {
        return this;
    }

    // ------------------------------------------------------ internal

    void collapse() {
        aria(expanded, false);
        if (up) {
            toggleIconElement.classList.remove(modifier(expandTop));
        }
        if (text != null) {
            text.collapse();
        }
    }

    void expand() {
        aria(expanded, true);
        if (up) {
            toggleIconElement.classList.add(modifier(expandTop));
        }
        if (text != null) {
            text.expand();
        }
    }

    void removeIcon() {
        HTMLElement icon = find(By.classname(component(Classes.expandableSection, toggle, Classes.icon)));
        failSafeRemoveFromParent(icon);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy