diff --git a/src/main/java/com/flowingcode/vaadin/addons/cronexpressionfield/CronExpressionField.java b/src/main/java/com/flowingcode/vaadin/addons/cronexpressionfield/CronExpressionField.java index 8af46c2..07fc757 100644 --- a/src/main/java/com/flowingcode/vaadin/addons/cronexpressionfield/CronExpressionField.java +++ b/src/main/java/com/flowingcode/vaadin/addons/cronexpressionfield/CronExpressionField.java @@ -31,6 +31,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.stream.Stream; import com.flowingcode.vaadin.addons.dayofweekselector.DayOfWeekSelector; @@ -52,17 +53,14 @@ import com.vaadin.flow.component.textfield.IntegerField; import com.vaadin.flow.component.textfield.TextField; import com.vaadin.flow.component.timepicker.TimePicker; -import com.vaadin.flow.data.provider.DataProvider; import com.vaadin.flow.function.SerializableConsumer; import com.vaadin.flow.internal.JsonSerializer; - import elemental.json.JsonObject; import org.springframework.scheduling.support.CronExpression; import it.burning.cron.CronExpressionDescriptor; import it.burning.cron.CronExpressionParser.CronExpressionParseException; import it.burning.cron.CronExpressionParser.Options; - /** * UI component for building cron expressions. * @@ -210,7 +208,6 @@ private void configureLayout() { nextDatesBtn.setText(i18n.getShowNextDatesBtn()); nextDatesBtn.addClickListener(e -> showNextDates()); - nextDatesBtn.addThemeVariants(ButtonVariant.LUMO_TERTIARY_INLINE); nextDatesBtn.setVisible(false); add(topLayout, mainLayout, new Span(i18n.getDescriptionLabel()), cronDescriptionDiv, nextDatesBtn); @@ -438,20 +435,20 @@ private void showNextDates() { if (!inputExpressionTf.getValue().isEmpty()) { grid.removeAllColumns(); grid.addColumn(date -> formatDate(date)); - grid.setHeight("30%"); - grid.setItems(DataProvider.fromCallbacks(q -> generateNextDate(LocalDateTime.now(), q.getOffset(), q.getLimit()), - q -> Integer.MAX_VALUE)); + grid.setHeight("108px"); + grid.setItems(q -> generateNextDate(LocalDateTime.now(), q.getOffset(), q.getLimit())); add(grid); } } - private LocalDateTime calculateNextDate(LocalDateTime date) { - return CronExpression.parse(inputExpressionTf.getValue()).next(date); - } - private Stream generateNextDate(LocalDateTime start, int offset, int limit) { - Stream nextDates = Stream.iterate(calculateNextDate(start), this::calculateNextDate); - return nextDates.skip(offset).limit(limit); + CronExpression parsedExpression = CronExpression.parse(inputExpressionTf.getValue()); + LocalDateTime firstNext = parsedExpression.next(start); + if (firstNext == null) { + return Stream.empty(); + } + return Stream.iterate(firstNext, Objects::nonNull, parsedExpression::next).skip(offset) + .limit(limit); } private String formatDate(LocalDateTime date) { diff --git a/src/main/resources/META-INF/frontend/styles/cron-expression-field-styles.css b/src/main/resources/META-INF/frontend/styles/cron-expression-field-styles.css index 3e265f4..ef5f2df 100644 --- a/src/main/resources/META-INF/frontend/styles/cron-expression-field-styles.css +++ b/src/main/resources/META-INF/frontend/styles/cron-expression-field-styles.css @@ -29,10 +29,6 @@ margin: 0; } -vaadin-grid::part(header) { - display: none; -} - .description-div { padding: 0; margin: 0;