diff --git a/vaadin-simple-grid-filter/src/main/java/software/xdev/vaadin/FilterComponent.java b/vaadin-simple-grid-filter/src/main/java/software/xdev/vaadin/FilterComponent.java index c3ac6e8..3d92b45 100644 --- a/vaadin-simple-grid-filter/src/main/java/software/xdev/vaadin/FilterComponent.java +++ b/vaadin-simple-grid-filter/src/main/java/software/xdev/vaadin/FilterComponent.java @@ -47,7 +47,11 @@ import java.util.stream.IntStream; import java.util.stream.Stream; +import com.vaadin.flow.component.AttachEvent; +import com.vaadin.flow.component.ComponentEvent; +import com.vaadin.flow.component.ComponentUtil; import com.vaadin.flow.component.Composite; +import com.vaadin.flow.component.DetachEvent; import com.vaadin.flow.component.ItemLabelGenerator; import com.vaadin.flow.component.Key; import com.vaadin.flow.component.UI; @@ -65,6 +69,7 @@ import com.vaadin.flow.router.BeforeEnterEvent; import com.vaadin.flow.router.BeforeEnterObserver; import com.vaadin.flow.router.QueryParameters; +import com.vaadin.flow.shared.Registration; import software.xdev.vaadin.builder.CustomizableFilterBuilder; import software.xdev.vaadin.comparators.ContainsComparator; @@ -369,6 +374,7 @@ private void onAcceptFilter() final boolean editable; // Check if it's an initial condition + // Set editable/deletable and the customization degree if(this.editingBadgeId != null && !this.editingBadgeId.equals(NO_BADGE_ID_STRING)) { deletable = this.deletingBadgeEnabled; @@ -396,6 +402,7 @@ private void onAcceptFilter() editable, customizationDegree); + // Query parameter if(!this.identifier.isBlank()) { if(this.editingBadgeId != null && !this.editingBadgeId.equals(NO_BADGE_ID_STRING)) @@ -478,7 +485,7 @@ private void onAcceptFilter() }); } - this.deactivateDeleteButtonFromChipComponents(deletableCondition, badge); + this.setBtnDeleteClickListenerWhenConditionShouldBeDeletable(deletableCondition, badge); // Format chip badge text if it contains LocalDate/LocalDateTime if(TemporalAccessor.class.isAssignableFrom(badge.getItem().getItem().getType()) @@ -490,12 +497,12 @@ private void onAcceptFilter() this.chipBadges.add(badge); this.hlChipBadges.add(badge); - this.updateGridFilter(); + this.addFilterConditionToGrid(badge); return badge; } - private void deactivateDeleteButtonFromChipComponents( + private void setBtnDeleteClickListenerWhenConditionShouldBeDeletable( final boolean conditionDeletable, final ChipBadgeExtension> badge) { @@ -812,32 +819,18 @@ else if(type.isAssignableFrom(Enum.class) || type.isAssignableFrom(Boolean.class } } - private void updateGridFilter() + private void addFilterConditionToGrid(final ChipBadgeExtension> chipBadge) { - if(this.chipBadges.isEmpty()) - { - this.dataGrid.getListDataView().removeFilters(); - return; - } + Objects.requireNonNull(chipBadge); - this.dataGrid.getListDataView().setFilter(item -> + this.dataGrid.getListDataView().addFilter(item -> { - final List> predicates = new ArrayList<>(); + final FilterCondition item1 = chipBadge.getItem(); + final String inputValue = item1.getInputValue(); + final Predicate predicate = + item1.getSelectedCondition().compare(item1.getItem().getValueProvider(), inputValue); - for(final ChipBadge> chipBadge : this.chipBadges) - { - final FilterCondition item1 = chipBadge.getItem(); - final String inputValue = item1.getInputValue(); - - predicates.add( - - item1.getSelectedCondition().compare( - item1.getItem().getValueProvider(), - inputValue) - ); - } - - return predicates.stream().map(p -> p.test(item)).reduce(Boolean::logicalAnd).orElseThrow(); + return predicate.test(item); }); } @@ -938,10 +931,21 @@ private void removeChipBadgeCondition(final ChipBadgeExtension> chipBadge) { @@ -1500,4 +1504,65 @@ public FilterComponent withInitialFilter( return filterComponent; } + + // Needed for interacting with other filter components on the same ui + private Registration registration; + + @Override + protected void onAttach(final AttachEvent attachEvent) + { + super.onAttach(attachEvent); + // Register to events from the event bus + this.registration = ComponentUtil.addListener( + attachEvent.getUI(), + FilterComponentResetGridFilterEvent.class, + event -> + { + if(this.chipBadges.isEmpty()) + { + return; + } + + // Get all conditions from filter component and add them to the grid + this.dataGrid.getListDataView().addFilter(item -> this.isItemMatchingFilter(item, this.chipBadges)); + } + ); + } + + private boolean isItemMatchingFilter( + final T item, + final List>> chipBadges) + { + final List> predicates = new ArrayList<>(); + + for(final ChipBadge> chipBadge : chipBadges) + { + final FilterCondition item1 = chipBadge.getItem(); + final String inputValue = item1.getInputValue(); + + predicates.add( + item1.getSelectedCondition().compare( + item1.getItem().getValueProvider(), + inputValue) + ); + } + + return predicates.stream().map(p -> p.test(item)).reduce(Boolean::logicalAnd).orElseThrow(); + } + + @Override + protected void onDetach(final DetachEvent detachEvent) + { + super.onDetach(detachEvent); + // Unregister from the event bus + this.registration.remove(); + } + + private static class FilterComponentResetGridFilterEvent extends ComponentEvent + { + public FilterComponentResetGridFilterEvent(final FilterComponent source, final boolean fromClient) + { + super(source, fromClient); + } + } }