Skip to content

Commit c92a2b3

Browse files
committed
fix #893 Allow moving carousel slides programatically
1 parent 47f0727 commit c92a2b3

File tree

1 file changed

+77
-31
lines changed
  • domino-ui/src/main/java/org/dominokit/domino/ui/carousel

1 file changed

+77
-31
lines changed

domino-ui/src/main/java/org/dominokit/domino/ui/carousel/Carousel.java

+77-31
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,6 @@
4040
* @see BaseDominoElement
4141
*/
4242
public class Carousel extends BaseDominoElement<HTMLDivElement, Carousel> {
43-
/** Constant <code>NEXT="next"</code> */
44-
public static final String NEXT = "next";
45-
/** CSS class for previous indicator */
46-
public static final String PREV = "prev";
4743

4844
private final OListElement indicatorsElement;
4945
private final DivElement slidesElement;
@@ -62,6 +58,15 @@ public class Carousel extends BaseDominoElement<HTMLDivElement, Carousel> {
6258
private int autoSlideDuration = 3000;
6359
private boolean attached = false;
6460

61+
/**
62+
* Factory method to create an empty Carousel
63+
*
64+
* @return new instance
65+
*/
66+
public static Carousel create() {
67+
return new Carousel();
68+
}
69+
6570
/** Creates and empty Carousel */
6671
public Carousel() {
6772

@@ -76,12 +81,7 @@ public Carousel() {
7681
.appendChild(
7782
Icons.chevron_left()
7883
.addCss(GenericCss.dui_vertical_center, dui_font_size_12))
79-
.addEventListener(
80-
"click",
81-
evt -> {
82-
resetTimer();
83-
prevSlide();
84-
}))
84+
.addEventListener("click", evt -> previous()))
8585
.appendChild(
8686
nextElement =
8787
a().addCss(slide_right, carousel_control)
@@ -92,8 +92,7 @@ public Carousel() {
9292
.addEventListener(
9393
"click",
9494
evt -> {
95-
resetTimer();
96-
nextSlide();
95+
next();
9796
}))
9897
.addCss(carousel);
9998
timer =
@@ -108,6 +107,52 @@ public void run() {
108107
init(this);
109108
}
110109

110+
/**
111+
* Programmatically move to the next slide and reset the slide timer
112+
*
113+
* @return Same Carousel instance
114+
*/
115+
public Carousel next() {
116+
resetTimer();
117+
nextSlide();
118+
return this;
119+
}
120+
121+
/**
122+
* Programmatically move to the previous slide and reset the slide timer
123+
*
124+
* @return Same Carousel instance
125+
*/
126+
public Carousel previous() {
127+
resetTimer();
128+
prevSlide();
129+
return this;
130+
}
131+
132+
/**
133+
* Programmatically move to the specified slide sliding to the provided direction and reset the
134+
* slide timer
135+
*
136+
* @return Same Carousel instance
137+
*/
138+
public Carousel gotToSlide(Slide slide, SlideDirection direction) {
139+
resetTimer();
140+
goToSlide(slide, direction);
141+
return this;
142+
}
143+
144+
/**
145+
* Programmatically move to the slide of the specified index sliding to the provided direction and
146+
* reset the slide timer
147+
*
148+
* @return Same Carousel instance
149+
*/
150+
public Carousel gotToSlide(int index, SlideDirection direction) {
151+
resetTimer();
152+
goToSlide(slides.get(index), direction);
153+
return this;
154+
}
155+
111156
private void resetTimer() {
112157
if (autoSlide) {
113158
timer.cancel();
@@ -137,15 +182,6 @@ private void addAttachListener() {
137182
});
138183
}
139184

140-
/**
141-
* Factory method to create an empty Carousel
142-
*
143-
* @return new instance
144-
*/
145-
public static Carousel create() {
146-
return new Carousel();
147-
}
148-
149185
/**
150186
* Adds new {@link org.dominokit.domino.ui.carousel.Slide} to this Carousel
151187
*
@@ -161,7 +197,7 @@ public Carousel appendChild(Slide slide) {
161197
"click",
162198
evt -> {
163199
resetTimer();
164-
goToSlide(slide, "");
200+
goToSlide(slide, SlideDirection.NONE);
165201
});
166202

167203
slide.element().addEventListener("webkitTransitionEnd", evt -> removeMotionStyles());
@@ -189,7 +225,7 @@ private void nextSlide() {
189225
nextSlide = slides.get(0);
190226
}
191227

192-
goToSlide(nextSlide, NEXT);
228+
goToSlide(nextSlide, SlideDirection.NEXT);
193229
}
194230

195231
private void prevSlide() {
@@ -200,10 +236,10 @@ private void prevSlide() {
200236
prevSlide = slides.get(slides.size() - 1);
201237
}
202238

203-
goToSlide(prevSlide, PREV);
239+
goToSlide(prevSlide, SlideDirection.PREV);
204240
}
205241

206-
private void goToSlide(Slide slide, String source) {
242+
private void goToSlide(Slide slide, SlideDirection source) {
207243
if (!slide.isActive()) {
208244
this.targetSlide = slide;
209245
slide.getIndicatorElement().addCss(dui_active);
@@ -222,18 +258,20 @@ private void goToSlide(Slide slide, String source) {
222258
}
223259
}
224260

225-
private CssClass getPositionStyle(Slide target, String source) {
226-
if ((slides.indexOf(target) > slides.indexOf(activeSlide) && !PREV.equals(source))
227-
|| (NEXT.equals(source))) {
261+
private CssClass getPositionStyle(Slide target, SlideDirection source) {
262+
if ((slides.indexOf(target) > slides.indexOf(activeSlide)
263+
&& !SlideDirection.PREV.equals(source))
264+
|| (SlideDirection.NEXT.equals(source))) {
228265
return slide_next;
229266
} else {
230267
return slide_prev;
231268
}
232269
}
233270

234-
private CssClass getDirectionStyle(Slide target, String source) {
235-
if ((slides.indexOf(target) > slides.indexOf(activeSlide) && !PREV.equals(source))
236-
|| (NEXT.equals(source))) {
271+
private CssClass getDirectionStyle(Slide target, SlideDirection source) {
272+
if ((slides.indexOf(target) > slides.indexOf(activeSlide)
273+
&& !SlideDirection.PREV.equals(source))
274+
|| (SlideDirection.NEXT.equals(source))) {
237275
return slide_left;
238276
} else {
239277
return slide_right;
@@ -367,4 +405,12 @@ public List<Slide> getSlides() {
367405
public Slide getActiveSlide() {
368406
return activeSlide;
369407
}
408+
409+
public enum SlideDirection {
410+
NONE,
411+
/** CSS class for previous indicator */
412+
PREV,
413+
/** Constant <code>NEXT="next"</code> */
414+
NEXT
415+
}
370416
}

0 commit comments

Comments
 (0)