diff --git a/src/main/java/org/patternfly/component/ComponentType.java b/src/main/java/org/patternfly/component/ComponentType.java index 20a78909..ea919b38 100644 --- a/src/main/java/org/patternfly/component/ComponentType.java +++ b/src/main/java/org/patternfly/component/ComponentType.java @@ -103,6 +103,8 @@ public enum ComponentType { Pagination("pgn", null), + Panel("pnl", "PF5/Panel"), + Popover("pvr", "PF5/Popover"), Radio("rd", "PF5/Radio"), diff --git a/src/main/java/org/patternfly/component/SubComponent.java b/src/main/java/org/patternfly/component/SubComponent.java index cd7633b8..fa5a2261 100644 --- a/src/main/java/org/patternfly/component/SubComponent.java +++ b/src/main/java/org/patternfly/component/SubComponent.java @@ -55,7 +55,7 @@ protected , E1 extends HTMLElement, B1 extends T protected , E1 extends HTMLElement, B1 extends TypedBuilder> C lookupComponent( boolean lenient) { - return ComponentStore.lookup(componentType, element, false); + return ComponentStore.lookup(componentType, element, lenient); } protected , E2 extends HTMLElement, B2 extends TypedBuilder> S lookupSubComponent( diff --git a/src/main/java/org/patternfly/component/panel/Panel.java b/src/main/java/org/patternfly/component/panel/Panel.java new file mode 100644 index 00000000..37ce4653 --- /dev/null +++ b/src/main/java/org/patternfly/component/panel/Panel.java @@ -0,0 +1,132 @@ +/* + * 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.panel; + +import org.patternfly.component.BaseComponentFlat; +import org.patternfly.component.ComponentType; + +import elemental2.dom.HTMLDivElement; +import org.patternfly.core.Logger; + +import static org.jboss.elemento.Elements.div; +import static org.jboss.elemento.Elements.hr; +import static org.patternfly.component.panel.PanelMain.panelMain; +import static org.patternfly.component.panel.PanelFooter.panelFooter; +import static org.patternfly.component.panel.PanelHeader.panelHeader; +import static org.patternfly.core.Aria.labelledBy; +import static org.patternfly.style.Classes.*; + +/** + * The panel component is a container that supports flexible content layouts. It can be used to house other components + * such as fields, forms, videos, buttons, and more. The panel should not be confused with the drawer component, + * which allows you to surface information via a collapsable container. + * + * @see https://www.patternfly.org/components/panel + */ +public class Panel extends BaseComponentFlat { + + // ------------------------------------------------------ factory + + public static Panel panel() { + return new Panel(); + } + + public Panel raised() { + return css(modifier(raised)); + } + + public Panel bordered() { + return css(modifier(bordered)); + } + + public Panel scrollable() { + return css(modifier(scrollable)); + } + + // ------------------------------------------------------ instance + private PanelHeader header; + private PanelMain main; + private PanelFooter footer; + + protected Panel() { + super(ComponentType.Panel, div().css(component(panel)).element()); + } + + // ------------------------------------------------------ add + + public Panel addHeader(String header) { + return add(panelHeader().textContent(header)); + } + + public Panel addHeader(PanelHeader header) { + return add(header); + } + + public Panel add(PanelHeader header) { + if (this.header != null) { + Logger.unsupported(ComponentType.Panel, this.header.element(), "header already added"); + } + this.header = header; + aria(labelledBy, header.headerId); + return this; + } + + public Panel addDivider() { + element().appendChild(hr().css(divider).element()); + return this; + } + + public Panel addMain(String main) { + return add(panelMain().textContent(main)); + } + + public Panel addMain(PanelMain main) { + return add(main); + } + + public Panel add(PanelMain main) { + if (this.main != null) { + Logger.unsupported(ComponentType.Panel, this.main.element(), "main already added"); + } + this.main = main; + element().appendChild(main.element()); + return this; + } + + public Panel addFooter(String footer) { + return add(panelFooter().textContent(footer)); + } + + public Panel addFooter(PanelFooter footer) { + return add(footer); + } + + public Panel add(PanelFooter footer) { + if (this.footer != null) { + Logger.unsupported(ComponentType.Panel, this.footer.element(), "footer already added"); + } + this.footer = footer; + element().appendChild(footer.element()); + return this; + } + + // ------------------------------------------------------ builder + + @Override + public Panel that() { + return this; + } +} diff --git a/src/main/java/org/patternfly/component/panel/PanelFooter.java b/src/main/java/org/patternfly/component/panel/PanelFooter.java new file mode 100644 index 00000000..c342cb70 --- /dev/null +++ b/src/main/java/org/patternfly/component/panel/PanelFooter.java @@ -0,0 +1,45 @@ +/* + * 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.panel; + +import elemental2.dom.HTMLDivElement; + +import static org.jboss.elemento.Elements.div; +import static org.patternfly.style.Classes.*; + +public class PanelFooter extends PanelSubComponent { + + // ------------------------------------------------------ factory + + public static PanelFooter panelFooter() { + return new PanelFooter(); + } + + // ------------------------------------------------------ instance + + static final String SUB_COMPONENT_NAME = "pf"; + + PanelFooter() { + super(SUB_COMPONENT_NAME, div().css(component(panel, footer)).element()); + } + + // ------------------------------------------------------ builder + + @Override + public PanelFooter that() { + return this; + } +} diff --git a/src/main/java/org/patternfly/component/panel/PanelHeader.java b/src/main/java/org/patternfly/component/panel/PanelHeader.java new file mode 100644 index 00000000..2a7bd323 --- /dev/null +++ b/src/main/java/org/patternfly/component/panel/PanelHeader.java @@ -0,0 +1,52 @@ +/* + * 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.panel; + +import org.jboss.elemento.Id; +import org.patternfly.component.ComponentType; + +import elemental2.dom.HTMLDivElement; + +import static org.jboss.elemento.Elements.div; +import static org.patternfly.style.Classes.*; + +public class PanelHeader extends PanelSubComponent { + + // ------------------------------------------------------ factory + + public static PanelHeader panelHeader() { + return new PanelHeader(); + } + + // ------------------------------------------------------ instance + + static final String SUB_COMPONENT_NAME = "ph"; + + final String headerId; + + PanelHeader() { + super(SUB_COMPONENT_NAME, div().css(component(panel, header)).element()); + headerId = Id.unique(ComponentType.Panel.id, header); + element().id = headerId; + } + + // ------------------------------------------------------ builder + + @Override + public PanelHeader that() { + return this; + } +} diff --git a/src/main/java/org/patternfly/component/panel/PanelMain.java b/src/main/java/org/patternfly/component/panel/PanelMain.java new file mode 100644 index 00000000..e51bb00c --- /dev/null +++ b/src/main/java/org/patternfly/component/panel/PanelMain.java @@ -0,0 +1,58 @@ +/* + * 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.panel; + +import org.patternfly.core.ElementDelegate; + +import elemental2.dom.HTMLDivElement; +import elemental2.dom.HTMLElement; + +import static org.jboss.elemento.Elements.*; +import static org.patternfly.style.Classes.*; +import static org.patternfly.style.Classes.main; + +public class PanelMain extends PanelSubComponent + implements ElementDelegate { + + // ------------------------------------------------------ factory + + public static PanelMain panelMain() { + return new PanelMain(); + } + + // ------------------------------------------------------ instance + + static final String SUB_COMPONENT_NAME = "pm"; + final HTMLDivElement bodyElement; + + PanelMain() { + super(SUB_COMPONENT_NAME, div().css(component(panel, main)).element()); + element().appendChild(bodyElement = div().css(component(panel, main, body)) + .element()); + } + + @Override + public HTMLElement delegate() { + return bodyElement; + } + + // ------------------------------------------------------ builder + + @Override + public PanelMain that() { + return this; + } +} diff --git a/src/main/java/org/patternfly/component/panel/PanelSubComponent.java b/src/main/java/org/patternfly/component/panel/PanelSubComponent.java new file mode 100644 index 00000000..e04c216d --- /dev/null +++ b/src/main/java/org/patternfly/component/panel/PanelSubComponent.java @@ -0,0 +1,29 @@ +/* + * 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.panel; + +import org.jboss.elemento.TypedBuilder; +import org.patternfly.component.ComponentType; +import org.patternfly.component.SubComponent; + +import elemental2.dom.HTMLElement; + +abstract class PanelSubComponent> extends SubComponent { + + PanelSubComponent(String name, E element) { + super(ComponentType.Panel, name, element); + } +} diff --git a/src/main/java/org/patternfly/style/Classes.java b/src/main/java/org/patternfly/style/Classes.java index ff55bde9..a4c065d4 100644 --- a/src/main/java/org/patternfly/style/Classes.java +++ b/src/main/java/org/patternfly/style/Classes.java @@ -184,6 +184,7 @@ public interface Classes { String page = "page"; String pageInsets = "page-insets"; String pagination = "pagination"; + String panel = "panel"; String path = "path"; String picture = "picture"; String plain = "plain"; @@ -195,6 +196,7 @@ public interface Classes { String progress = "progress"; String progressbar = "progressbar"; String radio = "radio"; + String raised = "raised"; String read = "read"; String readOnly = "read-only"; String readonly = "readonly";