Skip to content

Commit 67b4f0a

Browse files
KochTobisven1103
andcommitted
Apply other way of filter grid configuration
Co-authored-by: Sven F. <sven1103@users.noreply.github.com>
1 parent 226d47b commit 67b4f0a

File tree

11 files changed

+224
-410
lines changed

11 files changed

+224
-410
lines changed

datamanager-app/src/main/java/life/qbic/datamanager/views/demo/ComponentDemo.java

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,11 @@
4545
import life.qbic.datamanager.views.general.grid.Filter;
4646
import life.qbic.datamanager.views.general.grid.PredicateFilter;
4747
import life.qbic.datamanager.views.general.grid.component.FilterGrid;
48+
import life.qbic.datamanager.views.general.grid.component.FilterGridConfigurations;
4849
import life.qbic.datamanager.views.general.grid.component.FilterGridTab;
4950
import life.qbic.datamanager.views.general.grid.component.FilterGridTabSheet;
5051
import life.qbic.datamanager.views.general.grid.component.FilterGridTabSheet.TabAction;
51-
import life.qbic.datamanager.views.general.grid.component.GridFilterStrategyFactory;
52-
import life.qbic.datamanager.views.general.grid.component.GridFilterStrategyFactory.FilterTester;
52+
import life.qbic.datamanager.views.general.grid.component.GridConfiguration.FilterTester;
5353
import life.qbic.datamanager.views.general.icon.IconFactory;
5454
import life.qbic.datamanager.views.notifications.MessageSourceNotificationFactory;
5555
import life.qbic.datamanager.views.projects.project.experiments.experiment.components.experimentalvariable.ExperimentalVariablesInput;
@@ -144,15 +144,15 @@ private Div filterGridShowCase() {
144144
gridPerson.addColumn(Person::lastName).setHeader("Last Name").setKey("lastName");
145145
gridPerson.addColumn(Person::age).setHeader("Age").setKey("age");
146146

147-
var personConfiguration = GridFilterStrategyFactory.configureLazy(
148-
gridPerson,
149-
contactFetchCallback, contactCountCallback);
147+
var lazyConfiguration = FilterGridConfigurations.lazy(contactFetchCallback,
148+
contactCountCallback);
150149
var personGrid = FilterGrid.create(
151150
Person.class,
152151
SimplePersonFilter.class,
152+
gridPerson,
153153
() -> new SimplePersonFilter(""),
154154
(searchTerm, filter) -> new SimplePersonFilter(searchTerm),
155-
personConfiguration
155+
lazyConfiguration
156156
);
157157

158158
personGrid.addFilterUpdateListener(
@@ -169,17 +169,14 @@ private Div filterGridShowCase() {
169169
gridContact.addColumn(Person::lastName).setHeader("Last Name").setKey("lastName");
170170
gridContact.addColumn(Person::age).setHeader("Age").setKey("age");
171171

172-
var contactConfiguration = GridFilterStrategyFactory.configureLazy(
173-
gridContact,
174-
contactFetchCallback,
175-
contactCountCallback
176-
);
172+
177173
var contactGrid = FilterGrid.create(
178174
Person.class,
179175
SimplePersonFilter.class,
176+
gridContact,
180177
() -> new SimplePersonFilter(""),
181178
(searchTerm, filter) -> new SimplePersonFilter(searchTerm),
182-
contactConfiguration
179+
lazyConfiguration
183180
);
184181
var filterTabContacts = new FilterGridTab<>("Contacts", contactGrid);
185182

@@ -188,15 +185,15 @@ private Div filterGridShowCase() {
188185
gridMemoryPerson.addColumn(Person::lastName).setHeader("Last Name").setKey("lastName");
189186
gridMemoryPerson.addColumn(Person::age).setHeader("Age").setKey("age");
190187

191-
var contactInMemoryConfiguration = GridFilterStrategyFactory.configureInMemory(
192-
gridMemoryPerson,
188+
var contactInMemoryConfiguration = FilterGridConfigurations.inMemory(
193189
examples,
194190
nameContainsFilterTerm::test
195191
);
196192

197193
var inMemoryPersonGrid = FilterGrid.create(
198194
Person.class,
199195
SimplePersonFilter.class,
196+
gridMemoryPerson,
200197
() -> new SimplePersonFilter(""),
201198
(searchTerm, filter) -> new SimplePersonFilter(searchTerm),
202199
contactInMemoryConfiguration

datamanager-app/src/main/java/life/qbic/datamanager/views/general/grid/component/FilterGrid.java

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,8 @@ public final class FilterGrid<T, F> extends Div {
115115
private final Class<T> type;
116116
private final Class<F> filterType;
117117

118-
private final GridFilterStrategy<T, F> gridFilterStrategy;
118+
private final Grid<T> grid;
119+
private final GridConfiguration<T, F> gridConfiguration;
119120
private final Div selectionDisplay = new SelectionNotification();
120121
private final Div secondaryActionGroup = createSecondaryActionGroup();
121122

@@ -128,28 +129,34 @@ public final class FilterGrid<T, F> extends Div {
128129
public static <T, F> FilterGrid<T, F> create(
129130
Class<T> itemType,
130131
Class<F> filterType,
132+
Grid<T> grid,
131133
Supplier<F> filterSupplier,
132134
SearchTermFilterCombiner<F> searchTermFilterCombiner,
133-
GridFilterStrategy<T, F> gridFilterStrategy) {
134-
return new FilterGrid<>(itemType, filterType, filterSupplier,
135-
searchTermFilterCombiner, gridFilterStrategy);
135+
GridConfiguration<T, F> gridConfiguration) {
136+
137+
return new FilterGrid<>(itemType, filterType, grid, filterSupplier,
138+
searchTermFilterCombiner, gridConfiguration);
136139
}
137140

138141

139142
private FilterGrid(
140143
Class<T> itemType,
141144
Class<F> filterType,
145+
Grid<T> grid,
142146
Supplier<F> filterSupplier,
143147
SearchTermFilterCombiner<F> searchTermFilterUpdater,
144-
GridFilterStrategy<T, F> gridFilterStrategy) {
148+
GridConfiguration<T, F> gridConfiguration) {
145149
//assign fields
146150
this.type = Objects.requireNonNull(itemType);
147151
this.filterType = Objects.requireNonNull(filterType);
148-
this.gridFilterStrategy = gridFilterStrategy;
152+
this.grid = Objects.requireNonNull(grid);
153+
this.gridConfiguration = gridConfiguration;
149154

150-
configureGrid(gridFilterStrategy.getGrid());
155+
configureGridForMultiSelect(grid);
156+
optimizeGrid(grid, DEFAULT_QUERY_SIZE);
157+
gridConfiguration.applyConfiguration(grid);
151158
//construct filter Grid component
152-
constructComponent(gridFilterStrategy.getGrid());
159+
constructComponent(grid);
153160

154161
listenToSelection();
155162
//update the filter
@@ -161,8 +168,8 @@ private FilterGrid(
161168
* Refreshes the grid and clears the selection.
162169
*/
163170
public void refreshAll() {
164-
this.gridFilterStrategy.getGrid().getDataProvider().refreshAll();
165-
this.gridFilterStrategy.getGrid().deselectAll();
171+
this.grid.getDataProvider().refreshAll();
172+
this.grid.deselectAll();
166173
}
167174

168175

@@ -242,15 +249,10 @@ private void constructComponent(Grid<T> grid) {
242249

243250
private void listenToSelection() {
244251
updateSelectionDisplay(
245-
this.gridFilterStrategy.getGrid().getSelectionModel().getSelectedItems().size());
252+
this.grid.getSelectionModel().getSelectedItems().size());
246253
addSelectionListener(event -> updateSelectionDisplay(event.selectedItems().size()));
247254
}
248255

249-
private static <T> void configureGrid(Grid<T> grid) {
250-
configureGridForMultiSelect(grid);
251-
optimizeGrid(grid, DEFAULT_QUERY_SIZE);
252-
}
253-
254256
/**
255257
* Updates the filter and fires a
256258
* {@link life.qbic.datamanager.views.general.grid.component.FilterGrid.FilterUpdateEvent}
@@ -263,7 +265,7 @@ private void updateFilter(SearchTermFilterCombiner<F> searchTermFilterCombiner,
263265
F filter,
264266
String searchTerm) {
265267
F updatedFilter = searchTermFilterCombiner.apply(searchTerm, filter);
266-
gridFilterStrategy.setFilter(updatedFilter);
268+
gridConfiguration.applyConfiguration(grid).setFilter(updatedFilter);
267269
fireEvent(new FilterUpdateEvent<>(this.filterType, this, false, filter, updatedFilter));
268270
}
269271

@@ -280,7 +282,8 @@ public Registration addItemCountListener(
280282
ComponentEventListener<ItemCountChangeEvent<FilterGrid<T, F>>> listener) {
281283
ComponentEventListener<ItemCountChangeEvent<?>> itemCountComponentListener = it -> listener.onComponentEvent(
282284
new ItemCountChangeEvent<>(this, it.getItemCount(), it.isItemCountEstimated()));
283-
return gridFilterStrategy.addItemCountChangeListener(itemCountComponentListener);
285+
return gridConfiguration.applyConfiguration(grid).addItemCountChangeListener(
286+
itemCountComponentListener);
284287
}
285288

286289
/**
@@ -289,7 +292,7 @@ public Registration addItemCountListener(
289292
* @return the assumed number of items.
290293
*/
291294
public int getItemCount() {
292-
return gridFilterStrategy.getGrid().getDataCommunicator().getItemCount();
295+
return grid.getDataCommunicator().getItemCount();
293296
}
294297

295298
/**
@@ -534,7 +537,7 @@ public void setSecondaryActionGroup(Button firstButton, Button... buttons) {
534537
* @since 1.12.0
535538
*/
536539
public @NonNull Set<T> selectedElements() {
537-
return gridFilterStrategy.getGrid().getSelectedItems();
540+
return grid.getSelectedItems();
538541
}
539542

540543
/**
@@ -570,7 +573,7 @@ public void itemDisplayLabel(String label) {
570573
* @see Grid#deselectAll()
571574
*/
572575
public void deselectAll() {
573-
gridFilterStrategy.getGrid().deselectAll();
576+
grid.deselectAll();
574577
}
575578

576579
/**
@@ -585,7 +588,7 @@ public void deselectAll() {
585588
*/
586589
public Registration addSelectionListener(
587590
ComponentEventListener<FilterGridSelectionEvent<T>> listener) {
588-
return gridFilterStrategy.getGrid().addSelectionListener(it -> listener.onComponentEvent(
591+
return grid.addSelectionListener(it -> listener.onComponentEvent(
589592
new FilterGridSelectionEvent<>(this, it.getAllSelectedItems(), it.isFromClient())));
590593
}
591594

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package life.qbic.datamanager.views.general.grid.component;
2+
3+
import com.vaadin.flow.component.grid.Grid;
4+
import com.vaadin.flow.data.provider.CallbackDataProvider.CountCallback;
5+
import com.vaadin.flow.data.provider.CallbackDataProvider.FetchCallback;
6+
import com.vaadin.flow.data.provider.ConfigurableFilterDataProvider;
7+
import com.vaadin.flow.data.provider.DataProvider;
8+
import java.util.List;
9+
import java.util.Objects;
10+
import life.qbic.datamanager.views.general.grid.component.GridConfiguration.FilterTester;
11+
import org.springframework.lang.NonNull;
12+
13+
public class FilterGridConfigurations {
14+
15+
private FilterGridConfigurations() {
16+
17+
}
18+
19+
public static <T, F> GridConfiguration<T, F> lazy(
20+
FetchCallback<T, F> fetchCallback,
21+
CountCallback<T, F> countCallback
22+
) {
23+
return new LazyFilterGridConfiguration<>(fetchCallback, countCallback);
24+
}
25+
26+
public static <T, F> GridConfiguration<T, F> inMemory(
27+
List<T> items, FilterTester<T, F> filterTester) {
28+
return new InMemoryFilterGridConfiguration<>(items, filterTester);
29+
}
30+
31+
32+
static class LazyFilterGridConfiguration<T, F> implements
33+
GridConfiguration<T, F> {
34+
35+
private final ConfigurableFilterDataProvider<T, Void, F> dataProvider;
36+
37+
public LazyFilterGridConfiguration(
38+
@NonNull FetchCallback<T, F> fetchCallback,
39+
@NonNull CountCallback<T, F> countCallback) {
40+
41+
Objects.requireNonNull(fetchCallback);
42+
Objects.requireNonNull(countCallback);
43+
44+
this.dataProvider = DataProvider.fromFilteringCallbacks(fetchCallback, countCallback)
45+
.withConfigurableFilter();
46+
}
47+
48+
@Override
49+
public ConfiguredGrid<T, F> applyConfiguration(Grid<T> grid) {
50+
return new LazyGrid<>(grid, dataProvider);
51+
}
52+
}
53+
54+
static class InMemoryFilterGridConfiguration<T, F> implements
55+
GridConfiguration<T, F> {
56+
57+
private final List<T> items;
58+
private final FilterTester<T, F> filterTester;
59+
60+
InMemoryFilterGridConfiguration(List<T> items, FilterTester<T, F> filterTester) {
61+
this.items = Objects.requireNonNull(items);
62+
this.filterTester = Objects.requireNonNull(filterTester);
63+
}
64+
65+
@Override
66+
public ConfiguredGrid<T, F> applyConfiguration(Grid<T> grid) {
67+
return new InMemoryGrid<>(grid, items, filterTester);
68+
}
69+
}
70+
71+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package life.qbic.datamanager.views.general.grid.component;
2+
3+
public interface Filterable<F> {
4+
5+
void setFilter(F filter);
6+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package life.qbic.datamanager.views.general.grid.component;
2+
3+
import com.vaadin.flow.component.ComponentEventListener;
4+
import com.vaadin.flow.component.grid.Grid;
5+
import com.vaadin.flow.data.provider.ConfigurableFilterDataProvider;
6+
import com.vaadin.flow.data.provider.ItemCountChangeEvent;
7+
import com.vaadin.flow.shared.Registration;
8+
import java.util.List;
9+
import java.util.Objects;
10+
import java.util.function.BiPredicate;
11+
12+
public interface GridConfiguration<T, F> {
13+
14+
sealed interface ConfiguredGrid<T, F> extends Filterable<F>, ItemCountChangePublisher permits
15+
InMemoryGrid, LazyGrid {
16+
17+
18+
}
19+
20+
interface FilterTester<T, F> extends BiPredicate<T, F> {
21+
22+
}
23+
24+
final class InMemoryGrid<T, F> implements ConfiguredGrid<T, F> {
25+
26+
private final Grid<T> grid;
27+
private final FilterTester<T, F> filterTester;
28+
29+
public InMemoryGrid(Grid<T> grid, List<T> items, FilterTester<T, F> filterTester) {
30+
this.grid = Objects.requireNonNull(grid);
31+
this.filterTester = Objects.requireNonNull(filterTester);
32+
Objects.requireNonNull(items);
33+
grid.setItems(items);
34+
}
35+
36+
@Override
37+
public void setFilter(F filter) {
38+
grid.getListDataView().setFilter(item -> filterTester.test(item, filter));
39+
}
40+
41+
@Override
42+
public Registration addItemCountChangeListener(
43+
ComponentEventListener<ItemCountChangeEvent<?>> listener) {
44+
return grid.getListDataView().addItemCountChangeListener(listener);
45+
}
46+
}
47+
48+
final class LazyGrid<T, F> implements ConfiguredGrid<T, F> {
49+
50+
private final Grid<T> grid;
51+
private final ConfigurableFilterDataProvider<T, Void, F> dataProvider;
52+
53+
public LazyGrid(Grid<T> grid,
54+
ConfigurableFilterDataProvider<T, Void, F> dataProvider) {
55+
this.grid = Objects.requireNonNull(grid);
56+
this.dataProvider = Objects.requireNonNull(dataProvider);
57+
grid.setItems(dataProvider);
58+
}
59+
60+
@Override
61+
public void setFilter(F filter) {
62+
dataProvider.setFilter(filter);
63+
}
64+
65+
@Override
66+
public Registration addItemCountChangeListener(
67+
ComponentEventListener<ItemCountChangeEvent<?>> listener) {
68+
return grid.getLazyDataView().addItemCountChangeListener(listener);
69+
}
70+
}
71+
72+
ConfiguredGrid<T, F> applyConfiguration(Grid<T> grid);
73+
74+
}

0 commit comments

Comments
 (0)