Skip to content

Commit bb6ac81

Browse files
committed
feat: Add lazy support to available items grid
Close #130
1 parent fe6230d commit bb6ac81

24 files changed

+1207
-357
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.flowingcode.vaadin.addons.twincolgrid;
2+
3+
import com.vaadin.flow.data.provider.SortOrder;
4+
import java.util.ArrayList;
5+
import java.util.Collection;
6+
import java.util.HashSet;
7+
import java.util.List;
8+
import lombok.Getter;
9+
import lombok.Setter;
10+
11+
@Getter
12+
@Setter
13+
public class BaseLazyFilter<T> implements LazyFilter<T> {
14+
15+
private Collection<T> selectedItems = new HashSet<>();
16+
17+
private List<SortOrder<String>> sorting = new ArrayList<>();
18+
19+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.flowingcode.vaadin.addons.twincolgrid;
2+
3+
import com.flowingcode.vaadin.addons.twincolgrid.TwinColModel.TwinColModelMode;
4+
5+
/**
6+
* Eager filter configuration for {@link TwinColGrid}.
7+
*
8+
* @param <T>
9+
*/
10+
public class EagerFilterConfiguration<T> extends FilterConfiguration<T, EagerFilterableColumn<T>> {
11+
12+
@SafeVarargs
13+
public EagerFilterConfiguration(EagerFilterableColumn<T>... columns) {
14+
super(columns);
15+
}
16+
17+
void apply(TwinColGrid<T> grid) {
18+
filteredColumns.forEach(grid::addFilterableColumn);
19+
}
20+
21+
@Override
22+
boolean supports(TwinColModelMode mode) {
23+
return TwinColModelMode.EAGER.equals(mode);
24+
}
25+
26+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.flowingcode.vaadin.addons.twincolgrid;
2+
3+
import com.vaadin.flow.function.SerializableBiPredicate;
4+
import lombok.Getter;
5+
6+
/**
7+
* Enables in memory filtering support to column.
8+
*
9+
* @param <T>
10+
*/
11+
@Getter
12+
public class EagerFilterableColumn<T> extends FilterableColumn<T> {
13+
14+
/**
15+
* filter condition to apply to column values.
16+
*/
17+
private final SerializableBiPredicate<T, String> filterCondition;
18+
19+
public EagerFilterableColumn(TwinColumn<T> column, String filterPlaceholder,
20+
boolean enableClearButton, SerializableBiPredicate<T, String> filterCondition) {
21+
super(column, filterPlaceholder, enableClearButton);
22+
this.filterCondition = filterCondition;
23+
}
24+
25+
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package com.flowingcode.vaadin.addons.twincolgrid;
2+
3+
import com.vaadin.flow.component.grid.Grid;
4+
import com.vaadin.flow.component.grid.Grid.Column;
5+
import com.vaadin.flow.component.grid.dnd.GridDropLocation;
6+
import com.vaadin.flow.component.textfield.TextField;
7+
import com.vaadin.flow.data.provider.DataProvider;
8+
import com.vaadin.flow.data.provider.InMemoryDataProvider;
9+
import com.vaadin.flow.data.provider.ListDataProvider;
10+
import com.vaadin.flow.data.value.ValueChangeMode;
11+
import java.util.ArrayList;
12+
import java.util.Collection;
13+
import java.util.List;
14+
import lombok.NonNull;
15+
16+
/**
17+
* Model that supports {@link InMemoryDataProvider} for {@link TwinColGrid} available and selection
18+
* grids.
19+
*
20+
* @param <T>
21+
*/
22+
class EagerTwinColModel<T> extends TwinColModel<T, EagerFilterableColumn<T>> {
23+
24+
EagerTwinColModel(@NonNull Grid<T> grid, String className) {
25+
super(grid, className);
26+
this.grid.setDataProvider(DataProvider.ofCollection(new ArrayList<>()));
27+
}
28+
29+
@Override
30+
@SuppressWarnings("unchecked")
31+
ListDataProvider<T> getDataProvider() {
32+
return (ListDataProvider<T>) grid.getDataProvider();
33+
}
34+
35+
@Override
36+
void addAll(Collection<T> items) {
37+
getDataProvider().getItems().addAll(items);
38+
}
39+
40+
@Override
41+
void removeAll(Collection<T> items) {
42+
getDataProvider().getItems().removeAll(items);
43+
}
44+
45+
@Override
46+
void addFilterableColumn(Column<T> column, EagerFilterableColumn<T> filter) {
47+
TextField filterField = new TextField();
48+
filterField.setClearButtonVisible(filter.isEnableClearButton());
49+
filterField.setValueChangeMode(ValueChangeMode.EAGER);
50+
filterField.setSizeFull();
51+
filterField.setPlaceholder(filter.getFilterPlaceholder());
52+
filterField.addValueChangeListener(
53+
event -> getDataProvider()
54+
.addFilter(item -> filter.getFilterCondition().test(item, filterField.getValue())));
55+
56+
if (headerRow == null) {
57+
setHeaderRow(grid.appendHeaderRow());
58+
}
59+
60+
headerRow.getCell(column).setComponent(filterField);
61+
}
62+
63+
void clear() {
64+
getDataProvider().getItems().clear();
65+
}
66+
67+
void addItems(Collection<T> draggedItems, T dropOverItem, GridDropLocation dropLocation) {
68+
if (dropOverItem != null) {
69+
Collection<T> collection = getDataProvider().getItems();
70+
List<T> list = new ArrayList<>(collection);
71+
int dropIndex = list.indexOf(dropOverItem) + (dropLocation == GridDropLocation.BELOW ? 1 : 0);
72+
list.addAll(dropIndex, draggedItems);
73+
getDataProvider().getItems().clear();
74+
addAll(list);
75+
} else {
76+
addAll(draggedItems);
77+
}
78+
getDataProvider().refreshAll();
79+
}
80+
81+
Collection<T> getItems() {
82+
return getDataProvider().getItems();
83+
}
84+
85+
@Override
86+
TwinColModelMode getMode() {
87+
return TwinColModelMode.EAGER;
88+
}
89+
90+
@Override
91+
boolean supportsAddAll() {
92+
return true;
93+
}
94+
95+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.flowingcode.vaadin.addons.twincolgrid;
2+
3+
import com.flowingcode.vaadin.addons.twincolgrid.TwinColModel.TwinColModelMode;
4+
import java.util.ArrayList;
5+
import java.util.Arrays;
6+
import java.util.Collection;
7+
8+
public abstract class FilterConfiguration<T, C extends FilterableColumn<T>> {
9+
10+
protected final Collection<C> filteredColumns = new ArrayList<>();
11+
12+
@SafeVarargs
13+
public FilterConfiguration(C... columns) {
14+
filteredColumns.addAll(Arrays.asList(columns));
15+
}
16+
17+
public void addFilteredColumn(C column) {
18+
filteredColumns.add(column);
19+
}
20+
21+
/**
22+
* Applies this {@link FilterConfiguration} to grid.
23+
*
24+
* @param grid
25+
*/
26+
abstract void apply(TwinColGrid<T> grid);
27+
28+
/**
29+
* Checks if {@link FilterConfiguration} supports the given {@link TwinColModelMode}
30+
*
31+
* @param mode mode to check.
32+
* @return true mode is supported.
33+
*/
34+
abstract boolean supports(TwinColModelMode mode);
35+
36+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.flowingcode.vaadin.addons.twincolgrid;
2+
3+
import lombok.Getter;
4+
import lombok.RequiredArgsConstructor;
5+
6+
@RequiredArgsConstructor
7+
@Getter
8+
public abstract class FilterableColumn<T> {
9+
10+
private final TwinColumn<T> column;
11+
private final String filterPlaceholder;
12+
private final boolean enableClearButton;
13+
14+
}

src/main/java/com/flowingcode/vaadin/addons/twincolgrid/FilterableTwinColumn.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ public FilterableTwinColumn(Column<T> availableColumn, Column<T> selectionColumn
2222
* @see TextField#setPlaceholder(String)
2323
*/
2424
public FilterableTwinColumn<T> setFilterPlaceholder(String filterPlaceholder) {
25-
TwinColGrid.getFilterTextField(getAvailableColumn()).setPlaceholder(filterPlaceholder);
26-
TwinColGrid.getFilterTextField(getSelectionColumn()).setPlaceholder(filterPlaceholder);
25+
LegacyTwinColGrid.getFilterTextField(getAvailableColumn()).setPlaceholder(filterPlaceholder);
26+
LegacyTwinColGrid.getFilterTextField(getSelectionColumn()).setPlaceholder(filterPlaceholder);
2727
return this;
2828
}
2929

@@ -33,8 +33,8 @@ public FilterableTwinColumn<T> setFilterPlaceholder(String filterPlaceholder) {
3333
* @see TextField#setClearButtonVisible(boolean)
3434
*/
3535
public FilterableTwinColumn<T> setClearButtonVisible(boolean clearButtonVisible) {
36-
TwinColGrid.getFilterTextField(getAvailableColumn()).setClearButtonVisible(clearButtonVisible);
37-
TwinColGrid.getFilterTextField(getSelectionColumn()).setClearButtonVisible(clearButtonVisible);
36+
LegacyTwinColGrid.getFilterTextField(getAvailableColumn()).setClearButtonVisible(clearButtonVisible);
37+
LegacyTwinColGrid.getFilterTextField(getSelectionColumn()).setClearButtonVisible(clearButtonVisible);
3838
return this;
3939
}
4040

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.flowingcode.vaadin.addons.twincolgrid;
2+
3+
import com.vaadin.flow.data.provider.SortOrder;
4+
import java.util.Collection;
5+
import java.util.List;
6+
7+
public interface LazyFilter<T> {
8+
9+
/**
10+
* Items already selected.
11+
*
12+
* @return
13+
*/
14+
Collection<T> getSelectedItems();
15+
16+
/**
17+
* Sorting criterias.
18+
*
19+
* @return
20+
*/
21+
List<SortOrder<String>> getSorting();
22+
23+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.flowingcode.vaadin.addons.twincolgrid;
2+
3+
import com.flowingcode.vaadin.addons.twincolgrid.TwinColModel.TwinColModelMode;
4+
import lombok.RequiredArgsConstructor;
5+
6+
/**
7+
* Lazy filter configuration for {@link TwinColGrid}.
8+
*
9+
* @param <T>
10+
*/
11+
@RequiredArgsConstructor
12+
public class LazyFilterConfiguration<T> extends FilterConfiguration<T, LazyFilterableColumn<T>> {
13+
14+
private final LazyFilter<T> lazyFilter;
15+
16+
@SafeVarargs
17+
public LazyFilterConfiguration(LazyFilter<T> lazyFilter, LazyFilterableColumn<T>... columns) {
18+
super(columns);
19+
this.lazyFilter = lazyFilter;
20+
}
21+
22+
@Override
23+
void apply(TwinColGrid<T> grid) {
24+
filteredColumns.forEach(grid::addFilterableColumn);
25+
grid.setLazyFilter(lazyFilter);
26+
}
27+
28+
@Override
29+
boolean supports(TwinColModelMode mode) {
30+
return TwinColModelMode.LAZY.equals(mode);
31+
}
32+
33+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.flowingcode.vaadin.addons.twincolgrid;
2+
3+
import com.vaadin.flow.function.SerializableBiPredicate;
4+
import com.vaadin.flow.function.SerializableConsumer;
5+
import lombok.Getter;
6+
7+
/**
8+
* Enables lazy filtering support to column.
9+
*
10+
* @param <T>
11+
*/
12+
@Getter
13+
public class LazyFilterableColumn<T> extends FilterableColumn<T> {
14+
15+
/**
16+
* filter bean field to store the query string.
17+
*/
18+
private final SerializableConsumer<String> lazyFilterField;
19+
20+
/**
21+
* filter condition to apply to column values in selection grid.
22+
*/
23+
private final SerializableBiPredicate<T, String> eagerFilterCondition;
24+
25+
public LazyFilterableColumn(TwinColumn<T> column, String filterPlaceholder,
26+
boolean enableClearButton, SerializableConsumer<String> lazyFilterField,
27+
SerializableBiPredicate<T, String> eagerFilterCondition) {
28+
super(column, filterPlaceholder, enableClearButton);
29+
this.lazyFilterField = lazyFilterField;
30+
this.eagerFilterCondition = eagerFilterCondition;
31+
}
32+
33+
public EagerFilterableColumn<T> asEager() {
34+
return new EagerFilterableColumn<>(super.getColumn(), super.getFilterPlaceholder(),
35+
super.isEnableClearButton(), eagerFilterCondition);
36+
}
37+
38+
}

0 commit comments

Comments
 (0)