Skip to content

Commit 38674a6

Browse files
committed
feat: Add lazy support to available items grid
Close #130
1 parent 5b04684 commit 38674a6

24 files changed

+1265
-581
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<modelVersion>4.0.0</modelVersion>
44
<groupId>com.flowingcode.vaadin.addons</groupId>
55
<artifactId>twincolgrid</artifactId>
6-
<version>2.9.3-SNAPSHOT</version>
6+
<version>3.0.0-SNAPSHOT</version>
77
<name>TwinColGrid add-on</name>
88
<properties>
99
<vaadin.version>14.8.1</vaadin.version>
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: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.flowingcode.vaadin.addons.twincolgrid;
2+
3+
import com.flowingcode.vaadin.addons.twincolgrid.TwinColModel.TwinColModelMode;
4+
5+
public class EagerFilterConfiguration<T> extends FilterConfiguration<T, EagerFilterableColumn<T>> {
6+
7+
@SafeVarargs
8+
public EagerFilterConfiguration(EagerFilterableColumn<T>... columns) {
9+
super(columns);
10+
}
11+
12+
void apply(TwinColGrid<T> grid) {
13+
filteredColumns.forEach(grid::addFilterableColumn);
14+
}
15+
16+
@Override
17+
boolean supports(TwinColModelMode mode) {
18+
return TwinColModelMode.EAGER.equals(mode);
19+
}
20+
21+
}
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,
68+
T dropOverItem, GridDropLocation dropLocation) {
69+
if (dropOverItem != null) {
70+
Collection<T> collection = getDataProvider().getItems();
71+
List<T> list = new ArrayList<>(collection);
72+
int dropIndex = list.indexOf(dropOverItem) + (dropLocation == GridDropLocation.BELOW ? 1 : 0);
73+
list.addAll(dropIndex, draggedItems);
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+
}
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: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.flowingcode.vaadin.addons.twincolgrid;
2+
3+
import com.flowingcode.vaadin.addons.twincolgrid.TwinColModel.TwinColModelMode;
4+
import lombok.RequiredArgsConstructor;
5+
6+
@RequiredArgsConstructor
7+
public class LazyFilterConfiguration<T> extends FilterConfiguration<T, LazyFilterableColumn<T>> {
8+
9+
private final LazyFilter<T> lazyFilter;
10+
11+
@SafeVarargs
12+
public LazyFilterConfiguration(LazyFilter<T> lazyFilter, LazyFilterableColumn<T>... columns) {
13+
super(columns);
14+
this.lazyFilter = lazyFilter;
15+
}
16+
17+
@Override
18+
void apply(TwinColGrid<T> grid) {
19+
filteredColumns.forEach(grid::addFilterableColumn);
20+
grid.setLazyFilter(lazyFilter);
21+
}
22+
23+
@Override
24+
boolean supports(TwinColModelMode mode) {
25+
return TwinColModelMode.LAZY.equals(mode);
26+
}
27+
28+
}
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)