Skip to content

Instantly share code, notes, and snippets.

@vegegoku
Created November 18, 2019 15:02
Show Gist options
  • Save vegegoku/78b64fc4a226c0c5a1b00d5d4defde93 to your computer and use it in GitHub Desktop.
Save vegegoku/78b64fc4a226c0c5a1b00d5d4defde93 to your computer and use it in GitHub Desktop.
a sample domino-ui remote data store
package com.progressoft.alpha.commons.client.store;
import com.progressoft.alpha.commons.client.Formats;
import com.progressoft.alpha.commons.shared.store.CanLoadItems;
import com.progressoft.alpha.commons.shared.store.LoadContext;
import org.dominokit.domino.ui.datatable.events.SearchEvent;
import org.dominokit.domino.ui.datatable.events.SortEvent;
import org.dominokit.domino.ui.datatable.events.TableEvent;
import org.dominokit.domino.ui.datatable.events.TablePageChangeEvent;
import org.dominokit.domino.ui.datatable.model.Filter;
import org.dominokit.domino.ui.datatable.model.FilterTypes;
import org.dominokit.domino.ui.datatable.store.DataChangedEvent;
import org.dominokit.domino.ui.datatable.store.DataStore;
import org.dominokit.domino.ui.datatable.store.StoreDataChangeListener;
import org.dominokit.domino.ui.pagination.HasPagination;
import org.gwtproject.i18n.client.DateTimeFormat;
import java.util.*;
import static java.util.Objects.nonNull;
import static org.dominokit.domino.ui.datatable.events.SearchEvent.SEARCH_EVENT;
import static org.dominokit.domino.ui.datatable.events.SortEvent.SORT_EVENT;
public class RemoteDataStore<T> implements DataStore<T> {
private List<StoreDataChangeListener<T>> listeners = new ArrayList<>();
private HasPagination pagination;
private CanLoadItems<T> uiHandlers;
private String propertyName;
private String sortDirection;
private int activePage = 0;
private Map<String, String> searchProperties = new HashMap<>();
private List<T> items;
public RemoteDataStore(CanLoadItems<T> uiHandlers) {
this.uiHandlers = uiHandlers;
}
@Override
public void onDataChanged(StoreDataChangeListener<T> dataChangeListener) {
listeners.add(dataChangeListener);
}
@Override
public void removeDataChangeListener(StoreDataChangeListener<T> dataChangeListener) {
listeners.remove(dataChangeListener);
}
@Override
public void load() {
uiHandlers.load(getLoadContext(), loadResult -> {
this.items = loadResult.getResourceList();
if (nonNull(loadResult.getPage())) {
pagination.updatePagesByTotalCount(loadResult.getPage().getTotalElements(), loadResult.getPage().getSize());
pagination.gotoPage(loadResult.getPage().getNumber() + 1, true);
}
fireUpdate();
});
}
private LoadContext getLoadContext() {
return new LoadContext(propertyName, sortDirection, activePage, searchProperties);
}
@Override
public void handleEvent(TableEvent event) {
switch (event.getType()) {
case TablePageChangeEvent.PAGINATION_EVENT:
activePage = pagination.activePage() - 1;
load();
break;
case SORT_EVENT:
propertyName = ((SortEvent<?>) event).getColumnConfig().getName();
sortDirection = ((SortEvent<?>) event).getSortDirection().toString();
load();
break;
case SEARCH_EVENT:
searchProperties = new HashMap<>();
List<Filter> filters = ((SearchEvent) event).getFilters();
this.activePage = 0;
for (Filter filter : filters) {
if (!filter.getValues().isEmpty()) {
if (filter.getType().equals(FilterTypes.DATE)) {
String longDate = filter.getValues().get(0);
String formattedDate = DateTimeFormat.getFormat(Formats.DEFAULT_DATE_PATTERN)
.format(new Date(Long.parseLong(longDate)));
searchProperties.put(filter.getFieldName(), formattedDate);
} else {
searchProperties.put(filter.getFieldName(), filter.getValues().get(0));
}
}
}
load();
break;
}
}
private void fireUpdate() {
listeners.forEach(dataChangeListener -> dataChangeListener.onDataChanged(new DataChangedEvent<>(items, items.size())));
}
public HasPagination getPagination() {
return pagination;
}
public void setPagination(HasPagination pagination) {
this.pagination = pagination;
}
public int getActivePage() {
return activePage;
}
public void load(int pageNumber) {
this.activePage = pageNumber;
load();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment