FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

Code block component · patternfly-java/patternfly-java@90f89ac · GitHub

Commit 90f89ac

Browse files
committed
Code block component
1 parent 445af04 commit 90f89ac

30 files changed

Lines changed: 313 additions & 73 deletions

‎src/main/java/org/patternfly/component/Button.java‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import org.jboss.elemento.Elements;
1919
import org.jboss.elemento.HTMLContainerBuilder;
2020
import org.patternfly.core.Aria;
21-
import org.patternfly.core.Callback;
21+
import org.patternfly.handler.Callback;
2222
import org.patternfly.core.Modifiers;
2323
import org.patternfly.layout.Classes;
2424

@@ -29,6 +29,7 @@
2929
import static org.jboss.elemento.Elements.i;
3030
import static org.jboss.elemento.Elements.span;
3131
import static org.jboss.elemento.EventType.click;
32+
import static org.patternfly.component.icon.InlineIcon.inlineIcon;
3233
import static org.patternfly.layout.Classes.active;
3334
import static org.patternfly.layout.Classes.block;
3435
import static org.patternfly.layout.Classes.component;
@@ -105,11 +106,11 @@ public static Button link(HTMLElement element, String href, String target) {
105106
}
106107

107108
public static Button icon(String iconClass) {
108-
return new Button(Elements.button().css(modifier(plain)).add(i().css(iconClass)));
109+
return new Button(Elements.button().css(modifier(plain)).add(inlineIcon(iconClass)));
109110
}
110111

111112
public static Button icon(String iconClass, String label) {
112-
return new Button(Elements.button().css(modifier(plain)).aria("label", label).add(i().css(iconClass)));
113+
return new Button(Elements.button().css(modifier(plain)).aria("label", label).add(inlineIcon(iconClass)));
113114
}
114115

115116
public static Button icon(Icon icon) {

‎src/main/java/org/patternfly/component/Chip.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import org.jboss.elemento.HTMLContainerBuilder;
1919
import org.jboss.elemento.Id;
2020
import org.patternfly.component.badge.Badge;
21-
import org.patternfly.core.Callback;
21+
import org.patternfly.handler.Callback;
2222
import org.patternfly.layout.Classes;
2323

2424
import elemental2.dom.HTMLElement;

‎src/main/java/org/patternfly/component/EmptyState.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
package org.patternfly.component;
1717

1818
import org.patternfly.component.title.Title;
19-
import org.patternfly.core.Callback;
19+
import org.patternfly.handler.Callback;
2020
import org.patternfly.layout.Classes;
2121

2222
import elemental2.dom.HTMLDivElement;

‎src/main/java/org/patternfly/component/Pagination.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
import org.jboss.elemento.EventType;
2121
import org.jboss.elemento.HTMLContainerBuilder;
22-
import org.patternfly.core.Callback;
22+
import org.patternfly.handler.Callback;
2323
import org.patternfly.core.Modifiers;
2424
import org.patternfly.dataprovider.PageInfo;
2525

‎src/main/java/org/patternfly/component/alert/Alert.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import org.patternfly.component.Button;
2222
import org.patternfly.component.ComponentType;
2323
import org.patternfly.core.Aria;
24-
import org.patternfly.core.Callback;
24+
import org.patternfly.handler.Callback;
2525
import org.patternfly.layout.Classes;
2626

2727
import elemental2.dom.HTMLDivElement;

‎src/main/java/org/patternfly/component/code/CodeBlock.java‎

Lines changed: 113 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,30 +15,43 @@
1515
*/
1616
package org.patternfly.component.code;
1717

18+
import org.jboss.elemento.Attachable;
1819
import org.jboss.elemento.Elements;
20+
import org.jboss.elemento.Id;
1921
import org.patternfly.component.BaseComponent;
20-
import org.patternfly.component.Button;
2122
import org.patternfly.component.ComponentType;
23+
import org.patternfly.component.expandable.ExpandableSection;
2224
import org.patternfly.layout.Classes;
2325

2426
import elemental2.dom.HTMLDivElement;
2527
import elemental2.dom.HTMLElement;
28+
import elemental2.dom.MutationRecord;
2629

30+
import static java.util.Arrays.copyOfRange;
2731
import static org.jboss.elemento.Elements.div;
32+
import static org.jboss.elemento.Elements.failSafeRemoveFromParent;
33+
import static org.jboss.elemento.Elements.insertAfter;
34+
import static org.jboss.elemento.Elements.insertFirst;
2835
import static org.jboss.elemento.Elements.pre;
36+
import static org.jboss.elemento.Elements.removeChildrenFrom;
37+
import static org.jboss.elemento.Elements.wrapHtmlContainer;
38+
import static org.patternfly.component.code.CodeBlockActions.codeBlockActions;
2939
import static org.patternfly.component.code.CodeBlockHeader.codeBlockHeader;
40+
import static org.patternfly.component.expandable.ExpandableSection.expandableSection;
41+
import static org.patternfly.component.expandable.ExpandableSectionContent.expandableSectionContent;
42+
import static org.patternfly.component.expandable.ExpandableSectionToggle.expandableSectionToggle;
3043
import static org.patternfly.layout.Classes.codeBlock;
3144
import static org.patternfly.layout.Classes.component;
3245
import static org.patternfly.layout.Classes.content;
3346
import static org.patternfly.layout.Classes.pre;
3447

3548
/**
36-
* A code block is a component that contains 2 or more lines of read-only code. The code in a code block can be copied to the
37-
* clipboard.
49+
* A code block is a component that contains 2 or more lines of read-only code. The code in a code block can be copied
50+
* to the clipboard.
3851
*
3952
* @see <a href= "https://www.patternfly.org/components/code-block">https://www.patternfly.org/components/code-block</a>
4053
*/
41-
public class CodeBlock extends BaseComponent<HTMLDivElement, CodeBlock> {
54+
public class CodeBlock extends BaseComponent<HTMLDivElement, CodeBlock> implements Attachable {
4255

4356
// ------------------------------------------------------ factory methods
4457

@@ -52,20 +65,40 @@ public static CodeBlock codeBlock(String code) {
5265

5366
// ------------------------------------------------------ instance
5467

55-
private CodeBlockHeader header;
68+
public static final int DEFAULT_TRUNCATE = 3;
69+
70+
private final HTMLElement preElement;
5671
private final HTMLElement codeElement;
72+
private String code;
73+
private int truncate;
74+
private CodeBlockHeader header;
75+
private ExpandableSection esCode;
76+
private ExpandableSection esTrigger;
5777

5878
CodeBlock(String code) {
5979
super(div().css(component(codeBlock)).element(), ComponentType.CodeBlock);
6080

6181
add(div().css(component(codeBlock, content))
62-
.add(pre().css(component(codeBlock, pre))
82+
.add(preElement = pre().css(component(codeBlock, pre))
6383
.add(codeElement = Elements.code().css(component(codeBlock, Classes.code))
64-
.element())));
84+
.element())
85+
.element()));
6586

6687
if (code != null) {
6788
codeElement.textContent = code;
6889
}
90+
91+
Attachable.register(this, this);
92+
}
93+
94+
@Override
95+
public void attach(MutationRecord mutationRecord) {
96+
if (header != null) {
97+
header.passComponent(this);
98+
}
99+
if (mustSplitCode()) {
100+
splitCode();
101+
}
69102
}
70103

71104
@Override
@@ -82,26 +115,94 @@ public CodeBlock addHeader(CodeBlockHeader header) {
82115
// override to assure internal wiring
83116
public CodeBlock add(CodeBlockHeader header) {
84117
this.header = header;
85-
add(header.element());
118+
insertFirst(element(), header.element());
86119
return this;
87120
}
88121

89-
public CodeBlock addAction(Button action) {
122+
public CodeBlock addAction(CodeBlockAction action) {
90123
if (header == null) {
91124
addHeader(codeBlockHeader());
92125
}
93-
header.addAction(action);
126+
if (header.actions == null) {
127+
header.addActions(codeBlockActions());
128+
}
129+
header.actions.addAction(action);
130+
return this;
131+
}
132+
133+
// ------------------------------------------------------ modifiers
134+
135+
/** Same as {@linkplain #truncate(int) truncate(3)} */
136+
public CodeBlock truncate() {
137+
return truncate(DEFAULT_TRUNCATE);
138+
}
139+
140+
public CodeBlock truncate(int truncate) {
141+
this.truncate = truncate;
94142
return this;
95143
}
96144

97145
// ------------------------------------------------------ public API
98146

99147
public CodeBlock code(String code) {
100-
codeElement.textContent = code;
148+
this.code = code;
149+
if (element().isConnected) { // already attached?
150+
if (mustSplitCode()) {
151+
splitCode();
152+
} else {
153+
unsplitCode();
154+
codeElement.textContent = code;
155+
}
156+
} else {
157+
codeElement.textContent = code;
158+
}
101159
return this;
102160
}
103161

104162
public String code() {
105-
return codeElement.textContent;
163+
return code;
164+
}
165+
166+
// ------------------------------------------------------ internals
167+
168+
private String[] lines() {
169+
return code != null && !code.trim().isEmpty() ? code.split("\n") : new String[0];
170+
}
171+
172+
private boolean mustSplitCode() {
173+
return truncate > 0 && truncate < lines().length;
174+
}
175+
176+
private void splitCode() {
177+
String visibleCode = String.join("\n", copyOfRange(lines(), 0, truncate));
178+
String moreCode = String.join("\n", copyOfRange(lines(), truncate, lines().length));
179+
180+
if (esCode == null && esTrigger == null) {
181+
String codeId = Id.unique(componentType().id, "es-code");
182+
String triggerId = Id.unique(componentType().id, "es-trigger");
183+
esCode = expandableSection(codeId)
184+
.detachedFrom(triggerId)
185+
.addContent(expandableSectionContent().textContent(moreCode));
186+
esTrigger = expandableSection(triggerId)
187+
.detachedFrom(codeId)
188+
.addToggle(expandableSectionToggle("Show more", "Show less"));
189+
190+
removeChildrenFrom(codeElement);
191+
wrapHtmlContainer(codeElement)
192+
.add(visibleCode)
193+
.add(esCode);
194+
insertAfter(esTrigger.element(), preElement);
195+
196+
} else if (esCode != null) {
197+
codeElement.textContent = visibleCode;
198+
esCode.content().textContent(moreCode);
199+
}
200+
}
201+
202+
private void unsplitCode() {
203+
failSafeRemoveFromParent(esCode);
204+
failSafeRemoveFromParent(esTrigger);
205+
esCode = null;
206+
esTrigger = null;
106207
}
107208
}

‎src/main/java/org/patternfly/component/code/CodeBlockAction.java‎

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,32 +15,84 @@
1515
*/
1616
package org.patternfly.component.code;
1717

18+
import org.patternfly.component.Button;
19+
import org.patternfly.component.ComponentReference;
1820
import org.patternfly.component.SubComponent;
21+
import org.patternfly.core.Aria;
22+
import org.patternfly.layout.Classes;
23+
import org.patternfly.layout.PredefinedIcon;
1924

2025
import elemental2.dom.HTMLDivElement;
26+
import elemental2.dom.HTMLElement;
2127

2228
import static org.jboss.elemento.Elements.div;
29+
import static org.jboss.elemento.EventType.click;
30+
import static org.patternfly.js.ExtendedDomGlobal.navigator;
2331
import static org.patternfly.layout.Classes.actions;
24-
import static org.patternfly.layout.Classes.codeBlock;
2532
import static org.patternfly.layout.Classes.component;
2633
import static org.patternfly.layout.Classes.item;
34+
import static org.patternfly.layout.PredefinedIcon.copy;
2735

28-
public class CodeBlockAction extends SubComponent<HTMLDivElement, CodeBlockAction> {
36+
public class CodeBlockAction extends SubComponent<HTMLDivElement, CodeBlockAction> implements
37+
ComponentReference<CodeBlock> {
2938

3039
// ------------------------------------------------------ factory methods
3140

3241
public static CodeBlockAction codeBlockAction() {
33-
return new CodeBlockAction();
42+
return new CodeBlockAction(null);
43+
}
44+
45+
public static CodeBlockAction codeBlockAction(PredefinedIcon icon) {
46+
return new CodeBlockAction(icon.className);
47+
}
48+
49+
public static CodeBlockAction codeBlockAction(String iconClass) {
50+
return new CodeBlockAction(iconClass);
51+
}
52+
53+
public static CodeBlockAction codeBlockCopyToClipboardAction() {
54+
return new CodeBlockAction(copy.className)
55+
.ariaLabel("Copy to clipboard")
56+
.onAction((action, codeBlock) -> navigator.clipboard.writeText(codeBlock.code()));
3457
}
3558

3659
// ------------------------------------------------------ instance
3760

38-
CodeBlockAction() {
39-
super(div().css(component(codeBlock, actions, item)).element());
61+
private HTMLElement buttonElement;
62+
private CodeBlockActionHandler handler;
63+
64+
CodeBlockAction(String iconClass) {
65+
super(div().css(component(Classes.codeBlock, actions, item)).element());
66+
if (iconClass != null) {
67+
add(buttonElement = Button.icon(iconClass).element());
68+
}
69+
}
70+
71+
@Override
72+
public void passComponent(CodeBlock codeBlock) {
73+
if (handler != null && buttonElement != null) {
74+
buttonElement.addEventListener(click.name, e -> handler.onAction(this, codeBlock));
75+
}
4076
}
4177

4278
@Override
4379
public CodeBlockAction that() {
4480
return this;
4581
}
82+
83+
// ------------------------------------------------------ public API
84+
85+
public CodeBlockAction ariaLabel(String label) {
86+
if (buttonElement != null) {
87+
buttonElement.setAttribute(Aria.label, label);
88+
}
89+
return this;
90+
}
91+
92+
// ------------------------------------------------------ events
93+
94+
public CodeBlockAction onAction(CodeBlockActionHandler handler) {
95+
this.handler = handler;
96+
return this;
97+
}
4698
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.patternfly.component.code;
2+
3+
@FunctionalInterface
4+
public interface CodeBlockActionHandler {
5+
6+
void onAction(CodeBlockAction action, CodeBlock codeBlock);
7+
}

0 commit comments

Comments
 (0)

Back | FazBrowse Home | New Git URL