From cb3084cf844a1e0edcdac0b2941c509f32d0eee0 Mon Sep 17 00:00:00 2001 From: halkosajtarevic Date: Sun, 7 Jan 2024 20:53:34 +0100 Subject: [PATCH 1/2] Fix #77: added Panel component --- .../patternfly/component/ComponentType.java | 2 + .../patternfly/component/SubComponent.java | 2 +- .../org/patternfly/component/panel/Panel.java | 122 ++++++++++++++++++ .../patternfly/component/panel/PanelBody.java | 58 +++++++++ .../component/panel/PanelFooter.java | 45 +++++++ .../component/panel/PanelHeader.java | 52 ++++++++ .../component/panel/PanelSubComponent.java | 29 +++++ .../java/org/patternfly/style/Classes.java | 2 + 8 files changed, 311 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/patternfly/component/panel/Panel.java create mode 100644 src/main/java/org/patternfly/component/panel/PanelBody.java create mode 100644 src/main/java/org/patternfly/component/panel/PanelFooter.java create mode 100644 src/main/java/org/patternfly/component/panel/PanelHeader.java create mode 100644 src/main/java/org/patternfly/component/panel/PanelSubComponent.java 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..573751d2 --- /dev/null +++ b/src/main/java/org/patternfly/component/panel/Panel.java @@ -0,0 +1,122 @@ +/* + * 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.Attachable; +import org.patternfly.component.BaseComponentFlat; +import org.patternfly.component.ComponentType; + +import elemental2.dom.HTMLDivElement; +import elemental2.dom.MutationRecord; + +import static org.jboss.elemento.Elements.div; +import static org.jboss.elemento.Elements.hr; +import static org.patternfly.component.panel.PanelBody.panelBody; +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.*; + +public class Panel extends BaseComponentFlat implements Attachable { + private PanelHeader header; + private PanelBody body; + private PanelFooter footer; + + protected Panel() { + super(ComponentType.Panel, div().css(component(panel)).element()); + } + + 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)); + } + + // ------------------------------------------------------ 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) { + throw new IllegalStateException("header already added"); + } + this.header = header; + element().appendChild(header.element()); + element().appendChild(hr().css(divider).element()); + aria(labelledBy, header.headerId); + return this; + } + + public Panel addBody(String body) { + return add(panelBody().textContent(body)); + } + + public Panel addBody(PanelBody body) { + return add(body); + } + + public Panel add(PanelBody body) { + if (this.body != null) { + throw new IllegalStateException("body already added"); + } + this.body = body; + element().appendChild(body.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) { + throw new IllegalStateException("footer already added"); + } + this.footer = footer; + element().appendChild(footer.element()); + return this; + } + + @Override + public void attach(MutationRecord mutationRecord) { + + } + + @Override + public Panel that() { + return this; + } +} diff --git a/src/main/java/org/patternfly/component/panel/PanelBody.java b/src/main/java/org/patternfly/component/panel/PanelBody.java new file mode 100644 index 00000000..3b4c4ad5 --- /dev/null +++ b/src/main/java/org/patternfly/component/panel/PanelBody.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 PanelBody extends PanelSubComponent + implements ElementDelegate { + + // ------------------------------------------------------ factory + + public static PanelBody panelBody() { + return new PanelBody(); + } + + // ------------------------------------------------------ instance + + static final String SUB_COMPONENT_NAME = "pm"; + final HTMLDivElement bodyElement; + + PanelBody() { + 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 PanelBody 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/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 c969dc56..b94d1f97 100644 --- a/src/main/java/org/patternfly/style/Classes.java +++ b/src/main/java/org/patternfly/style/Classes.java @@ -189,6 +189,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"; @@ -200,6 +201,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"; From 6900755e64ca62b8e6920b3a0c083a9afe858eeb Mon Sep 17 00:00:00 2001 From: halkosajtarevic Date: Mon, 8 Jan 2024 20:38:33 +0100 Subject: [PATCH 2/2] Fix #77: addressed comments --- .../org/patternfly/component/panel/Panel.java | 64 +++++++++++-------- .../panel/{PanelBody.java => PanelMain.java} | 12 ++-- 2 files changed, 43 insertions(+), 33 deletions(-) rename src/main/java/org/patternfly/component/panel/{PanelBody.java => PanelMain.java} (85%) diff --git a/src/main/java/org/patternfly/component/panel/Panel.java b/src/main/java/org/patternfly/component/panel/Panel.java index 573751d2..37ce4653 100644 --- a/src/main/java/org/patternfly/component/panel/Panel.java +++ b/src/main/java/org/patternfly/component/panel/Panel.java @@ -15,29 +15,30 @@ */ package org.patternfly.component.panel; -import org.jboss.elemento.Attachable; import org.patternfly.component.BaseComponentFlat; import org.patternfly.component.ComponentType; import elemental2.dom.HTMLDivElement; -import elemental2.dom.MutationRecord; +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.PanelBody.panelBody; +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.*; -public class Panel extends BaseComponentFlat implements Attachable { - private PanelHeader header; - private PanelBody body; - private PanelFooter footer; +/** + * 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 { - protected Panel() { - super(ComponentType.Panel, div().css(component(panel)).element()); - } + // ------------------------------------------------------ factory public static Panel panel() { return new Panel(); @@ -55,6 +56,15 @@ 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) { @@ -67,29 +77,32 @@ public Panel addHeader(PanelHeader header) { public Panel add(PanelHeader header) { if (this.header != null) { - throw new IllegalStateException("header already added"); + Logger.unsupported(ComponentType.Panel, this.header.element(), "header already added"); } this.header = header; - element().appendChild(header.element()); - element().appendChild(hr().css(divider).element()); aria(labelledBy, header.headerId); return this; } - public Panel addBody(String body) { - return add(panelBody().textContent(body)); + public Panel addDivider() { + element().appendChild(hr().css(divider).element()); + return this; } - public Panel addBody(PanelBody body) { - return add(body); + public Panel addMain(String main) { + return add(panelMain().textContent(main)); } - public Panel add(PanelBody body) { - if (this.body != null) { - throw new IllegalStateException("body already added"); + 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.body = body; - element().appendChild(body.element()); + this.main = main; + element().appendChild(main.element()); return this; } @@ -103,17 +116,14 @@ public Panel addFooter(PanelFooter footer) { public Panel add(PanelFooter footer) { if (this.footer != null) { - throw new IllegalStateException("footer already added"); + Logger.unsupported(ComponentType.Panel, this.footer.element(), "footer already added"); } this.footer = footer; element().appendChild(footer.element()); return this; } - @Override - public void attach(MutationRecord mutationRecord) { - - } + // ------------------------------------------------------ builder @Override public Panel that() { diff --git a/src/main/java/org/patternfly/component/panel/PanelBody.java b/src/main/java/org/patternfly/component/panel/PanelMain.java similarity index 85% rename from src/main/java/org/patternfly/component/panel/PanelBody.java rename to src/main/java/org/patternfly/component/panel/PanelMain.java index 3b4c4ad5..e51bb00c 100644 --- a/src/main/java/org/patternfly/component/panel/PanelBody.java +++ b/src/main/java/org/patternfly/component/panel/PanelMain.java @@ -24,13 +24,13 @@ import static org.patternfly.style.Classes.*; import static org.patternfly.style.Classes.main; -public class PanelBody extends PanelSubComponent - implements ElementDelegate { +public class PanelMain extends PanelSubComponent + implements ElementDelegate { // ------------------------------------------------------ factory - public static PanelBody panelBody() { - return new PanelBody(); + public static PanelMain panelMain() { + return new PanelMain(); } // ------------------------------------------------------ instance @@ -38,7 +38,7 @@ public static PanelBody panelBody() { static final String SUB_COMPONENT_NAME = "pm"; final HTMLDivElement bodyElement; - PanelBody() { + PanelMain() { super(SUB_COMPONENT_NAME, div().css(component(panel, main)).element()); element().appendChild(bodyElement = div().css(component(panel, main, body)) .element()); @@ -52,7 +52,7 @@ public HTMLElement delegate() { // ------------------------------------------------------ builder @Override - public PanelBody that() { + public PanelMain that() { return this; } }