Skip to content

Commit 9e6366f

Browse files
committed
Add max nested
1 parent 47f8fd4 commit 9e6366f

File tree

12 files changed

+156
-98
lines changed

12 files changed

+156
-98
lines changed

vaadin-grid-filter-demo/src/main/java/software/xdev/vaadin/ui/DemoView.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import java.time.LocalDate;
44

55
import com.vaadin.flow.component.AttachEvent;
6+
import com.vaadin.flow.component.details.Details;
7+
import com.vaadin.flow.component.details.DetailsVariant;
68
import com.vaadin.flow.component.grid.Grid;
79
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
810
import com.vaadin.flow.router.AfterNavigationEvent;
@@ -24,14 +26,21 @@ public class DemoView extends VerticalLayout implements AfterNavigationObserver
2426
public DemoView()
2527
{
2628
final GridFilter<Person> filter = GridFilter.createDefault(this.grid)
27-
.withFilterableField("id", Person::id, Integer.class)
28-
.withFilterableField("firstName", Person::firstName, String.class)
29-
.withFilterableField("birthday", Person::birthday, LocalDate.class)
30-
.withFilterableField("married", Person::married, Boolean.class)
31-
.withFilterableField("department", Person::department, Department.class);
32-
this.add(filter, this.grid);
29+
.withFilterableField("ID", Person::id, Integer.class)
30+
.withFilterableField("First Name", Person::firstName, String.class)
31+
.withFilterableField("Birthday", Person::birthday, LocalDate.class)
32+
.withFilterableField("Married", Person::married, Boolean.class)
33+
.withFilterableField("Department", Person::department, Department.class);
34+
35+
final Details details = new Details("Filter data");
36+
details.addThemeVariants(DetailsVariant.FILLED);
37+
details.add(filter);
38+
details.setOpened(true);
39+
this.add(details, this.grid);
3340

3441
this.queryParameterAdapter = new GridFilterQueryParameterAdapter(filter, "filter");
42+
43+
this.setSpacing(false);
3544
}
3645

3746
@Override

vaadin-grid-filter/src/main/java/software/xdev/vaadin/gridfilter/AddFilterComponentsButtons.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,13 @@ public class AddFilterComponentsButtons extends HorizontalLayout
3030
{
3131
public void update(
3232
final Collection<FilterComponentSupplier> filterComponentSuppliers,
33-
final Consumer<FilterComponentSupplier> onAddButtonClicked)
33+
final Consumer<FilterComponentSupplier> onAddButtonClicked,
34+
final int nestedDepth,
35+
final int maxNestedDepth)
3436
{
3537
this.removeAll();
3638
filterComponentSuppliers.stream()
39+
.filter(s -> nestedDepth < maxNestedDepth || !s.canCreateNested())
3740
.map(s -> {
3841
final Button btn =
3942
new Button(s.display(), VaadinIcon.PLUS.create(), ev -> onAddButtonClicked.accept(s));

vaadin-grid-filter/src/main/java/software/xdev/vaadin/gridfilter/FilterContainerComponent.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public FilterContainerComponent(final Runnable onValueUpdated, final boolean sho
3636
this.shouldWrapperUseFullWidth = shouldWrapperUseFullWidth;
3737

3838
this.setPadding(false);
39+
this.setSpacing(false);
3940

4041
this.updateFilterConditionsContainerVisibility();
4142
}

vaadin-grid-filter/src/main/java/software/xdev/vaadin/gridfilter/GridFilter.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ public class GridFilter<T>
8383
protected final List<FilterComponentSupplier> filterComponentSuppliers = new ArrayList<>();
8484
protected final List<FilterableField<T, ?>> filterableFields = new ArrayList<>();
8585

86+
protected int maxNestedDepth = 10;
87+
8688
protected final Map<Operation<?>, List<TypeValueComponentProvider<?>>> cacheOperationTypeValueComponents =
8789
Collections.synchronizedMap(new LinkedHashMap<>());
8890
protected final Map<FilterableField<T, ?>, Map<Operation<?>, TypeValueComponentProvider<?>>> cacheField =
@@ -104,14 +106,17 @@ public GridFilter(final Grid<T> grid)
104106
this.setSpacing(false);
105107
}
106108

109+
@SuppressWarnings("java:S1452")
107110
public FilterComponent<T, ?> addFilterComponent(final FilterComponentSupplier supplier)
108111
{
109112
final FilterComponent<T, ?> filterComponent = supplier.create(
110113
this.filterableFields,
111114
this::getForField,
112115
this.valueReUseAdapters,
113116
this.filterComponentSuppliers,
114-
this::onFilterUpdate);
117+
this::onFilterUpdate,
118+
1,
119+
this.maxNestedDepth);
115120
this.filterContainerComponent.addFilterComponent(filterComponent);
116121
return filterComponent;
117122
}
@@ -141,7 +146,11 @@ public FilterChangedEvent(final GridFilter<T> source, final boolean fromClient)
141146
@Override
142147
protected void onAttach(final AttachEvent attachEvent)
143148
{
144-
this.addFilterComponentButtons.update(this.filterComponentSuppliers, this::addFilterComponent);
149+
this.addFilterComponentButtons.update(
150+
this.filterComponentSuppliers,
151+
this::addFilterComponent,
152+
1,
153+
this.maxNestedDepth);
145154
}
146155

147156
@SuppressWarnings("java:S1452") // No
@@ -302,6 +311,16 @@ public <S> GridFilter<T> withFilterableField(
302311
return this;
303312
}
304313

314+
public GridFilter<T> withMaxNestedDepth(final int maxNestedDepth)
315+
{
316+
if(maxNestedDepth < 1)
317+
{
318+
throw new IllegalArgumentException("Invalid depth");
319+
}
320+
this.maxNestedDepth = maxNestedDepth;
321+
return this;
322+
}
323+
305324
// endregion
306325

307326
public static <T> GridFilter<T> createDefault(final Grid<T> grid)

vaadin-grid-filter/src/main/java/software/xdev/vaadin/gridfilter/business/operation/ContainsOp.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ public ContainsOp()
2828
@Override
2929
public boolean testTyped(final String input, final SingleValue<String> filterValue)
3030
{
31-
if(input == null)
31+
if(input == null || filterValue.getValue() == null)
3232
{
3333
return false;
3434
}
35-
return input.contains(filterValue.getValue());
35+
return input.toLowerCase().contains(filterValue.getValue().toLowerCase());
3636
}
3737
}

vaadin-grid-filter/src/main/java/software/xdev/vaadin/gridfilter/filtercomponents/FilterComponentSupplier.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,15 @@ public interface FilterComponentSupplier
3333

3434
String serializationPrefix();
3535

36+
boolean canCreateNested();
37+
38+
@SuppressWarnings("java:S1452")
3639
<T> FilterComponent<T, ?> create(
3740
List<FilterableField<T, ?>> filterableFields,
3841
Function<FilterableField<T, ?>, Map<Operation<?>, TypeValueComponentProvider<?>>> fieldDataResolver,
3942
Map<Class<? extends ValueContainer>, Set<ValueReUseAdapter<?>>> valueReUseAdapters,
4043
List<FilterComponentSupplier> filterComponentSuppliers,
41-
Runnable onValueUpdated);
44+
Runnable onValueUpdated,
45+
int nestedDepth,
46+
int maxNestedDepth);
4247
}

vaadin-grid-filter/src/main/java/software/xdev/vaadin/gridfilter/filtercomponents/block/FilterANDComponentSupplier.java

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,18 @@
1515
*/
1616
package software.xdev.vaadin.gridfilter.filtercomponents.block;
1717

18-
import java.util.List;
19-
import java.util.Map;
20-
import java.util.Set;
21-
import java.util.function.Function;
18+
import java.util.function.Predicate;
2219
import java.util.stream.Stream;
2320

24-
import software.xdev.vaadin.gridfilter.FilterableField;
25-
import software.xdev.vaadin.gridfilter.business.operation.Operation;
26-
import software.xdev.vaadin.gridfilter.business.typevaluecomp.TypeValueComponentProvider;
27-
import software.xdev.vaadin.gridfilter.business.value.ValueContainer;
28-
import software.xdev.vaadin.gridfilter.business.value.reuse.ValueReUseAdapter;
2921
import software.xdev.vaadin.gridfilter.filtercomponents.FilterComponent;
30-
import software.xdev.vaadin.gridfilter.filtercomponents.FilterComponentSupplier;
3122

3223

33-
public class FilterANDComponentSupplier implements FilterComponentSupplier
24+
public class FilterANDComponentSupplier extends FilterBlockComponentSupplier
3425
{
3526
@Override
3627
public String display()
3728
{
38-
return "AND block";
29+
return "AND";
3930
}
4031

4132
@Override
@@ -45,21 +36,10 @@ public String serializationPrefix()
4536
}
4637

4738
@Override
48-
public <T> FilterComponent<T, ?> create(
49-
final List<FilterableField<T, ?>> filterableFields,
50-
final Function<FilterableField<T, ?>, Map<Operation<?>, TypeValueComponentProvider<?>>> fieldDataResolver,
51-
final Map<Class<? extends ValueContainer>, Set<ValueReUseAdapter<?>>> valueReUseAdapters,
52-
final List<FilterComponentSupplier> filterComponentSuppliers,
53-
final Runnable onValueUpdated)
39+
protected <T> boolean testAggregate(
40+
final Stream<FilterComponent<T, ?>> stream,
41+
final Predicate<FilterComponent<T, ?>> predicate)
5442
{
55-
return new FilterBlockComponent<>(
56-
filterableFields,
57-
fieldDataResolver,
58-
valueReUseAdapters,
59-
filterComponentSuppliers,
60-
onValueUpdated,
61-
Stream::allMatch,
62-
"AND",
63-
this::serializationPrefix);
43+
return stream.allMatch(predicate);
6444
}
6545
}

vaadin-grid-filter/src/main/java/software/xdev/vaadin/gridfilter/filtercomponents/block/FilterBlockComponent.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,15 @@ public class FilterBlockComponent<T>
5454
protected final List<FilterComponentSupplier> filterComponentSuppliers;
5555
protected final Runnable onValueUpdated;
5656
protected final Supplier<String> serializationPrefixSupplier;
57+
protected final int nestedDepth;
58+
protected final int maxNestedDepth;
5759

5860
protected final BiPredicate<Stream<FilterComponent<T, ?>>, Predicate<FilterComponent<T, ?>>> testAggregate;
5961

6062
protected final FilterContainerComponent<T> filterContainerComponent;
6163
protected final AddFilterComponentsButtons addFilterComponentButtons = new AddFilterComponentsButtons();
6264

65+
@SuppressWarnings("java:S107")
6366
public FilterBlockComponent(
6467
final List<FilterableField<T, ?>> filterableFields,
6568
final Function<FilterableField<T, ?>, Map<Operation<?>, TypeValueComponentProvider<?>>> fieldDataResolver,
@@ -68,7 +71,9 @@ public FilterBlockComponent(
6871
final Runnable onValueUpdated,
6972
final BiPredicate<Stream<FilterComponent<T, ?>>, Predicate<FilterComponent<T, ?>>> testAggregate,
7073
final String identifierName,
71-
final Supplier<String> serializationPrefixSupplier)
74+
final Supplier<String> serializationPrefixSupplier,
75+
final int nestedDepth,
76+
final int maxNestedDepth)
7277
{
7378
this.filterableFields = filterableFields;
7479
this.fieldDataResolver = fieldDataResolver;
@@ -77,10 +82,12 @@ public FilterBlockComponent(
7782
this.onValueUpdated = onValueUpdated;
7883
this.testAggregate = testAggregate;
7984
this.serializationPrefixSupplier = serializationPrefixSupplier;
85+
this.nestedDepth = nestedDepth;
86+
this.maxNestedDepth = maxNestedDepth;
8087

8188
final Span spBlockIdentifier = new Span(identifierName);
8289
spBlockIdentifier.setMinWidth("2.5em");
83-
spBlockIdentifier.getStyle().set("overflow-wrap", "anywhere");
90+
spBlockIdentifier.getStyle().set("overflow-wrap", "break-word");
8491

8592
this.filterContainerComponent = new FilterContainerComponent<>(onValueUpdated, true);
8693

@@ -107,15 +114,21 @@ public FilterBlockComponent(
107114
this.fieldDataResolver,
108115
this.valueReUseAdapters,
109116
this.filterComponentSuppliers,
110-
this.onValueUpdated);
117+
this.onValueUpdated,
118+
this.nestedDepth + 1,
119+
this.maxNestedDepth);
111120
this.filterContainerComponent.addFilterComponent(filterConditionComponent);
112121
return filterConditionComponent;
113122
}
114123

115124
@Override
116125
protected void onAttach(final AttachEvent attachEvent)
117126
{
118-
this.addFilterComponentButtons.update(this.filterComponentSuppliers, this::addFilterComponent);
127+
this.addFilterComponentButtons.update(
128+
this.filterComponentSuppliers,
129+
this::addFilterComponent,
130+
this.nestedDepth,
131+
this.maxNestedDepth);
119132
}
120133

121134
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package software.xdev.vaadin.gridfilter.filtercomponents.block;
2+
3+
import java.util.List;
4+
import java.util.Map;
5+
import java.util.Set;
6+
import java.util.function.Function;
7+
import java.util.function.Predicate;
8+
import java.util.stream.Stream;
9+
10+
import software.xdev.vaadin.gridfilter.FilterableField;
11+
import software.xdev.vaadin.gridfilter.business.operation.Operation;
12+
import software.xdev.vaadin.gridfilter.business.typevaluecomp.TypeValueComponentProvider;
13+
import software.xdev.vaadin.gridfilter.business.value.ValueContainer;
14+
import software.xdev.vaadin.gridfilter.business.value.reuse.ValueReUseAdapter;
15+
import software.xdev.vaadin.gridfilter.filtercomponents.FilterComponent;
16+
import software.xdev.vaadin.gridfilter.filtercomponents.FilterComponentSupplier;
17+
18+
19+
public abstract class FilterBlockComponentSupplier implements FilterComponentSupplier
20+
{
21+
@Override
22+
public String display()
23+
{
24+
return "AND";
25+
}
26+
27+
@Override
28+
public boolean canCreateNested()
29+
{
30+
return true;
31+
}
32+
33+
protected abstract <T> boolean testAggregate(
34+
final Stream<FilterComponent<T, ?>> stream,
35+
final Predicate<FilterComponent<T, ?>> predicate);
36+
37+
@Override
38+
public <T> FilterComponent<T, ?> create(
39+
final List<FilterableField<T, ?>> filterableFields,
40+
final Function<FilterableField<T, ?>, Map<Operation<?>, TypeValueComponentProvider<?>>> fieldDataResolver,
41+
final Map<Class<? extends ValueContainer>, Set<ValueReUseAdapter<?>>> valueReUseAdapters,
42+
final List<FilterComponentSupplier> filterComponentSuppliers,
43+
final Runnable onValueUpdated,
44+
final int nestedDepth,
45+
final int maxNestedDepth)
46+
{
47+
return new FilterBlockComponent<>(
48+
filterableFields,
49+
fieldDataResolver,
50+
valueReUseAdapters,
51+
filterComponentSuppliers,
52+
onValueUpdated,
53+
this::testAggregate,
54+
this.display(),
55+
this::serializationPrefix,
56+
nestedDepth,
57+
maxNestedDepth);
58+
}
59+
}

vaadin-grid-filter/src/main/java/software/xdev/vaadin/gridfilter/filtercomponents/block/FilterNOTComponentSupplier.java

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,26 +15,18 @@
1515
*/
1616
package software.xdev.vaadin.gridfilter.filtercomponents.block;
1717

18-
import java.util.List;
19-
import java.util.Map;
20-
import java.util.Set;
21-
import java.util.function.Function;
18+
import java.util.function.Predicate;
19+
import java.util.stream.Stream;
2220

23-
import software.xdev.vaadin.gridfilter.FilterableField;
24-
import software.xdev.vaadin.gridfilter.business.operation.Operation;
25-
import software.xdev.vaadin.gridfilter.business.typevaluecomp.TypeValueComponentProvider;
26-
import software.xdev.vaadin.gridfilter.business.value.ValueContainer;
27-
import software.xdev.vaadin.gridfilter.business.value.reuse.ValueReUseAdapter;
2821
import software.xdev.vaadin.gridfilter.filtercomponents.FilterComponent;
29-
import software.xdev.vaadin.gridfilter.filtercomponents.FilterComponentSupplier;
3022

3123

32-
public class FilterNOTComponentSupplier implements FilterComponentSupplier
24+
public class FilterNOTComponentSupplier extends FilterBlockComponentSupplier
3325
{
3426
@Override
3527
public String display()
3628
{
37-
return "NOT block";
29+
return "NOT";
3830
}
3931

4032
@Override
@@ -44,21 +36,10 @@ public String serializationPrefix()
4436
}
4537

4638
@Override
47-
public <T> FilterComponent<T, ?> create(
48-
final List<FilterableField<T, ?>> filterableFields,
49-
final Function<FilterableField<T, ?>, Map<Operation<?>, TypeValueComponentProvider<?>>> fieldDataResolver,
50-
final Map<Class<? extends ValueContainer>, Set<ValueReUseAdapter<?>>> valueReUseAdapters,
51-
final List<FilterComponentSupplier> filterComponentSuppliers,
52-
final Runnable onValueUpdated)
39+
protected <T> boolean testAggregate(
40+
final Stream<FilterComponent<T, ?>> stream,
41+
final Predicate<FilterComponent<T, ?>> predicate)
5342
{
54-
return new FilterBlockComponent<>(
55-
filterableFields,
56-
fieldDataResolver,
57-
valueReUseAdapters,
58-
filterComponentSuppliers,
59-
onValueUpdated,
60-
(stream, predicate) -> !stream.allMatch(predicate),
61-
"NOT",
62-
this::serializationPrefix);
43+
return !stream.allMatch(predicate);
6344
}
6445
}

0 commit comments

Comments
 (0)