Skip to content

Commit eb25234

Browse files
committed
Add stepper
1 parent 1f4456f commit eb25234

File tree

6 files changed

+177
-27
lines changed

6 files changed

+177
-27
lines changed

user-interface/frontend/themes/datamanager/components/all.css

+79
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,16 @@ First some general property definitions
2525
--font-weight-medium: 500;
2626
--font-weight-semi-bold: 600;
2727
--font-weight-bold: 700;
28+
--icon-color-primary: var(--lumo-primary-color);
2829
--icon-color-info: rgba(22, 118, 243, 1);
2930
--icon-color-error: rgba(255, 66, 56, 1);
3031
--icon-color-success: rgba(21, 193, 93, 1);
3132
--icon-color-warning: rgba(254, 201, 1, 1);
33+
--icon-color-default: rgba(28, 46, 69, 0.6);
34+
--icon-size-xs: 1rem;
35+
--icon-size-s: var(--lumo-icon-size-s);
3236
--icon-size-m: var(--lumo-icon-size-m);
37+
--icon-size-l: var(--lumo-icon-size-l);
3338
--spacing-01: 0.125rem;
3439
--spacing-02: 0.25rem;
3540
--spacing-03: 0.5rem;
@@ -147,6 +152,11 @@ Body text
147152
Padding & gaps
148153
***************************/
149154

155+
.padding-left-right-02 {
156+
padding-left: var(--spacing-02);
157+
padding-right: var(--spacing-02);
158+
}
159+
150160
.padding-left-right-04 {
151161
padding-left: var(--spacing-04);
152162
padding-right: var(--spacing-04);
@@ -187,6 +197,10 @@ Padding & gaps
187197
padding-bottom: var(--spacing-07);
188198
}
189199

200+
.gap-02 {
201+
gap: var(--spacing-02);
202+
}
203+
190204
.gap-04 {
191205
gap: var(--spacing-04);
192206
}
@@ -320,10 +334,70 @@ Icons
320334
color: var(--icon-color-warning)
321335
}
322336

337+
.icon-size-xs {
338+
height: var(--icon-size-xs);
339+
width: var(--icon-size-xs);
340+
}
341+
342+
.icon-size-s {
343+
height: var(--icon-size-s);
344+
width: var(--icon-size-s);
345+
}
346+
323347
.icon-size-m {
324348
height: var(--icon-size-m);
349+
width: var(--icon-size-m);
325350
}
326351

352+
.icon-size-l {
353+
height: var(--icon-size-l);
354+
width: var(--icon-size-l);
355+
}
356+
357+
.round {
358+
border-radius: 50%;
359+
}
360+
361+
.icon-background-color-default {
362+
background-color: var(--icon-color-default);
363+
}
364+
365+
.icon-background-color-primary {
366+
background-color: var(--icon-color-primary);
367+
}
368+
369+
.icon-color-default {
370+
color: var(--icon-color-default);
371+
}
372+
373+
374+
375+
.icon-text-white {
376+
color: white;
377+
}
378+
379+
.icon-text-inner {
380+
font-size: 0.6875rem;
381+
}
382+
383+
.icon-label-text {
384+
font-size: 0.875rem;
385+
}
386+
387+
.icon-label-text-color-default {
388+
color: var(--icon-color-default);
389+
}
390+
391+
.icon-label-text-color-primary {
392+
color: var(--icon-color-primary);
393+
}
394+
395+
.icon-content-center {
396+
display: inline-flex;
397+
justify-content: center;
398+
align-items: center;
399+
line-height: 1;
400+
}
327401

328402

329403
/****************************
@@ -339,6 +413,11 @@ Layout
339413
flex-direction: row;
340414
}
341415

416+
.flex-vertical {
417+
display: flex;
418+
flex-direction: column;
419+
}
420+
342421

343422

344423
/****************************
416 Bytes
Binary file not shown.

user-interface/src/main/java/life/qbic/datamanager/views/demo/ComponentDemo.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import life.qbic.datamanager.views.general.dialog.InputValidation;
2222
import life.qbic.datamanager.views.general.dialog.UserInput;
2323
import life.qbic.datamanager.views.general.dialog.stepper.Step;
24-
import life.qbic.datamanager.views.general.dialog.stepper.StepDisplay;
24+
import life.qbic.datamanager.views.general.dialog.stepper.StepperDisplay;
2525
import life.qbic.datamanager.views.general.dialog.stepper.StepperDialog;
2626
import life.qbic.datamanager.views.general.dialog.stepper.StepperDialogFooter;
2727
import life.qbic.datamanager.views.general.icon.IconFactory;
@@ -127,7 +127,7 @@ private static Div stepperDialogShowCase(List<Step> steps, String dialogTitle) {
127127
StepperDialog stepperDialog = StepperDialog.create(dialog, steps);
128128
StepperDialogFooter.with(stepperDialog);
129129

130-
StepDisplay.with(stepperDialog, steps.stream().map(Step::name).toList());
130+
StepperDisplay.with(stepperDialog, steps.stream().map(Step::name).toList());
131131

132132
showDialog.addClickListener(listener -> stepperDialog.open());
133133

user-interface/src/main/java/life/qbic/datamanager/views/general/dialog/AppDialog.java

+4-6
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
public class AppDialog extends Dialog {
2424

2525
public static final String PADDING_LEFT_RIGHT_07 = "padding-left-right-07";
26+
public static final String PADDING_TOP_BOTTOM_04 = "padding-top-bottom-04";
2627
public static final String PADDING_TOP_BOTTOM_05 = "padding-top-bottom-05";
2728
public static final String BORDER_BOTTOM_SOLID = "border-bottom-solid";
2829
public static final String FULL_WIDTH = "full-width";
@@ -249,8 +250,7 @@ private static class LayoutSmall implements Style {
249250

250251
LayoutSmall() {
251252
header.addClassNames(paddings());
252-
navigation.addClassNames(paddings());
253-
navigation.addClassName(BORDER_BOTTOM_SOLID);
253+
navigation.addClassNames(PADDING_LEFT_RIGHT_07, PADDING_TOP_BOTTOM_04, BORDER_BOTTOM_SOLID);
254254
body.addClassNames(paddings());
255255
footer.addClassNames(paddings());
256256
footer.addClassName(FULL_WIDTH);
@@ -295,8 +295,7 @@ private static class LayoutMedium implements Style {
295295
LayoutMedium() {
296296
header.addClassNames(paddings());
297297
body.addClassNames(paddings());
298-
navigation.addClassNames(paddings());
299-
navigation.addClassName(BORDER_BOTTOM_SOLID);
298+
navigation.addClassNames(PADDING_LEFT_RIGHT_07, PADDING_TOP_BOTTOM_04, BORDER_BOTTOM_SOLID);
300299
footer.addClassNames(paddings());
301300
footer.addClassName(FULL_WIDTH);
302301
}
@@ -339,8 +338,7 @@ private static class LayoutLarge implements Style {
339338

340339
LayoutLarge() {
341340
header.addClassNames(paddings());
342-
navigation.addClassNames(paddings());
343-
navigation.addClassName(BORDER_BOTTOM_SOLID);
341+
navigation.addClassNames(PADDING_LEFT_RIGHT_07, PADDING_TOP_BOTTOM_04, BORDER_BOTTOM_SOLID);
344342
body.addClassNames(paddings());
345343
footer.addClassNames(paddings());
346344
footer.addClassName(FULL_WIDTH);
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package life.qbic.datamanager.views.general.dialog.stepper;
22

33
import com.vaadin.flow.component.html.Div;
4-
import java.util.ArrayList;
5-
import java.util.List;
6-
import org.springframework.lang.NonNull;
74

85
/**
96
* <b><class short description - 1 Line!></b>
@@ -12,28 +9,42 @@
129
*
1310
* @since <version tag>
1411
*/
15-
public class StepDisplay extends Div implements NavigationListener {
12+
public class StepDisplay extends Div {
1613

17-
private final StepperDialog dialog;
14+
public static final String ICON_BACKGROUND_COLOR_DEFAULT = "icon-background-color-default";
15+
public static final String ICON_BACKGROUND_COLOR_PRIMARY = "icon-background-color-primary";
16+
public static final String ICON_LABEL_TEXT_COLOR_DEFAULT = "icon-label-text-color-default";
17+
public static final String ICON_LABEL_TEXT_COLOR_PRIMARY = "icon-label-text-color-primary";
18+
private final Div numberIcon;
19+
private final Div stepLabel;
1820

19-
private final List<String> steps;
21+
private StepDisplay(int number, String label) {
22+
this.addClassNames("flex-vertical", "gap-02", "flex-align-items-center");
23+
this.numberIcon = new Div(String.valueOf(number));
24+
this.stepLabel = new Div(label);
25+
numberIcon.addClassNames("round", "icon-size-m", ICON_BACKGROUND_COLOR_DEFAULT,
26+
"icon-text-white", "icon-content-center", "icon-text-inner");
27+
stepLabel.addClassNames("icon-label-text", ICON_LABEL_TEXT_COLOR_DEFAULT);
28+
add(numberIcon, stepLabel);
29+
}
2030

21-
private StepDisplay(StepperDialog stepperDialog, List<String> stepNames) {
22-
this.dialog = stepperDialog;
23-
this.steps = new ArrayList<>(stepNames);
24-
dialog.registerNavigationListener(this);
25-
onNavigationChange(dialog.currentNavigation());
26-
this.addClassNames("full-width", "flex-horizontal", "gap-04");
31+
public static StepDisplay with(int number, String label) {
32+
return new StepDisplay(number, label);
2733
}
2834

29-
public static StepDisplay with(@NonNull StepperDialog stepperDialog, @NonNull List<String> stepNames) {
30-
return new StepDisplay(stepperDialog, stepNames);
35+
public void activate() {
36+
numberIcon.removeClassName(ICON_BACKGROUND_COLOR_DEFAULT);
37+
numberIcon.addClassName(ICON_BACKGROUND_COLOR_PRIMARY);
38+
39+
stepLabel.removeClassName(ICON_LABEL_TEXT_COLOR_DEFAULT);
40+
stepLabel.addClassName(ICON_LABEL_TEXT_COLOR_PRIMARY);
3141
}
3242

33-
@Override
34-
public void onNavigationChange(NavigationInformation navigationInformation) {
35-
this.removeAll();
36-
steps.forEach(step -> add(new Div(step)));
37-
dialog.setStepper(this);
43+
public void deactivate() {
44+
numberIcon.removeClassName(ICON_BACKGROUND_COLOR_PRIMARY);
45+
numberIcon.addClassName(ICON_BACKGROUND_COLOR_DEFAULT);
46+
47+
stepLabel.removeClassName(ICON_LABEL_TEXT_COLOR_PRIMARY);
48+
stepLabel.addClassName(ICON_LABEL_TEXT_COLOR_DEFAULT);
3849
}
3950
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package life.qbic.datamanager.views.general.dialog.stepper;
2+
3+
import com.vaadin.flow.component.html.Div;
4+
import com.vaadin.flow.component.icon.Icon;
5+
import com.vaadin.flow.component.icon.VaadinIcon;
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
import java.util.stream.IntStream;
9+
import org.springframework.lang.NonNull;
10+
11+
/**
12+
* <b><class short description - 1 Line!></b>
13+
*
14+
* <p><More detailed description - When to use, what it solves, etc.></p>
15+
*
16+
* @since <version tag>
17+
*/
18+
public class StepperDisplay extends Div implements NavigationListener {
19+
20+
private final StepperDialog dialog;
21+
22+
private final List<String> steps;
23+
24+
private StepperDisplay(StepperDialog stepperDialog, List<String> stepNames) {
25+
this.dialog = stepperDialog;
26+
this.steps = new ArrayList<>(stepNames);
27+
dialog.registerNavigationListener(this);
28+
onNavigationChange(dialog.currentNavigation());
29+
this.addClassNames("full-width", "flex-horizontal", "gap-04", "flex-align-items-center");
30+
}
31+
32+
public static StepperDisplay with(@NonNull StepperDialog stepperDialog,
33+
@NonNull List<String> stepNames) {
34+
return new StepperDisplay(stepperDialog, stepNames);
35+
}
36+
37+
@Override
38+
public void onNavigationChange(NavigationInformation navigationInformation) {
39+
this.removeAll();
40+
IntStream.range(0, steps.size()).forEach(index -> {
41+
var step = StepDisplay.with(index + 1, steps.get(index));
42+
if (index == navigationInformation.currentStep() - 1) {
43+
step.activate();
44+
}
45+
add(step);
46+
if (index < navigationInformation.totalSteps() - 1) {
47+
add(new StepPointer(VaadinIcon.ARROW_RIGHT.create()));
48+
}
49+
});
50+
dialog.setStepper(this);
51+
}
52+
53+
private static class StepPointer extends Div {
54+
55+
StepPointer(@NonNull Icon icon) {
56+
this.add(icon);
57+
addClassNames("icon-color-default", "padding-left-right-02", "icon-size-xs",
58+
"flex-horizontal");
59+
}
60+
61+
}
62+
}

0 commit comments

Comments
 (0)