package com.andreiolar.abms.client.widgets;
import java.util.Comparator;
import java.util.List;
import com.andreiolar.abms.client.rpc.DBGetContactInfo;
import com.andreiolar.abms.client.rpc.DBGetContactInfoAsync;
import com.andreiolar.abms.shared.ContactInfo;
import com.andreiolar.abms.shared.UserDetails;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.FontWeight;
import com.google.gwt.dom.client.Style.TextDecoration;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.ErrorEvent;
import com.google.gwt.event.dom.client.ErrorHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import gwt.material.design.client.constants.ButtonType;
import gwt.material.design.client.constants.Color;
import gwt.material.design.client.constants.TextAlign;
import gwt.material.design.client.data.SelectionType;
import gwt.material.design.client.data.component.RowComponent;
import gwt.material.design.client.ui.MaterialButton;
import gwt.material.design.client.ui.MaterialContainer;
import gwt.material.design.client.ui.MaterialImage;
import gwt.material.design.client.ui.MaterialLabel;
import gwt.material.design.client.ui.MaterialLoader;
import gwt.material.design.client.ui.MaterialPanel;
import gwt.material.design.client.ui.MaterialToast;
import gwt.material.design.client.ui.html.Hr;
import gwt.material.design.client.ui.table.MaterialDataTable;
import gwt.material.design.client.ui.table.cell.TextColumn;
import gwt.material.design.client.ui.table.cell.WidgetColumn;
public final class ContactInformationWidget {
private ContactInformationWidget() {
}
/**
* Used to construct the {@link MaterialDataTable} representing the Contact Information Widget.
**/
public static void constructContactInformationWidget(MaterialContainer container, UserDetails userDetails) {
container.clear();
MaterialPanel panel = new MaterialPanel();
MaterialLabel title = new MaterialLabel("Contact Information");
title.setTextColor(Color.BLUE);
title.setTextAlign(TextAlign.CENTER);
title.setFontSize("36px");
title.setFontWeight(FontWeight.BOLD);
panel.add(title);
panel.add(new Hr());
MaterialDataTable<ContactInfo> table = new MaterialDataTable<ContactInfo>();
table.setUseStickyHeader(true);
table.setUseCategories(false);
table.setUseRowExpansion(false);
table.setSelectionType(SelectionType.NONE);
table.setRedraw(true);
table.setStyleName("contact-info-table");
panel.add(table);
container.add(panel);
table.getTableTitle().setText("Neighbors Contact Information");
table.addColumn(new WidgetColumn<ContactInfo, MaterialImage>() {
@Override
public MaterialImage getValue(ContactInfo object) {
String profilePictureUsername = object.getUsername().replaceAll("\\.", "");
MaterialImage materialImage = new MaterialImage();
materialImage.setUrl("http://res.cloudinary.com/andreiolar/image/upload/" + profilePictureUsername + ".png");
materialImage.addErrorHandler(new ErrorHandler() {
@Override
public void onError(ErrorEvent event) {
if (object.getGender().equals("Female")) {
materialImage.setUrl("images/icons/female.png");
} else {
materialImage.setUrl("images/icons/male.png");
}
}
});
materialImage.setWidth("40px");
materialImage.setHeight("40px");
materialImage.setPadding(4);
materialImage.setMarginTop(8);
materialImage.setBackgroundColor(Color.GREY_LIGHTEN_2);
materialImage.setCircle(true);
return materialImage;
}
@Override
public String getHeaderWidth() {
return "10%";
}
});
table.addColumn(new TextColumn<ContactInfo>() {
@Override
public String getHeaderWidth() {
return "10%";
}
@Override
public Comparator<? super RowComponent<ContactInfo>> getSortComparator() {
return (o1, o2) -> o1.getData().getFamilyName().compareTo(o2.getData().getFamilyName());
}
@Override
public String getValue(ContactInfo object) {
return object.getFamilyName();
}
}, "Family Name");
table.addColumn(new TextColumn<ContactInfo>() {
@Override
public String getHeaderWidth() {
return "20%";
}
@Override
public Comparator<? super RowComponent<ContactInfo>> getSortComparator() {
return (o1, o2) -> o1.getData().getContactPerson().compareTo(o2.getData().getContactPerson());
}
@Override
public String getValue(ContactInfo object) {
return object.getContactPerson();
}
}, "Contact Person");
table.addColumn(new TextColumn<ContactInfo>() {
@Override
public String getHeaderWidth() {
return "10%";
}
@Override
public Comparator<? super RowComponent<ContactInfo>> getSortComparator() {
return (o1, o2) -> Integer.compare(Integer.parseInt(o1.getData().getApartmentNumber()),
Integer.parseInt(o2.getData().getApartmentNumber()));
}
@Override
public String getValue(ContactInfo object) {
return object.getApartmentNumber();
}
}, "Apt. Number");
table.addColumn(new TextColumn<ContactInfo>() {
@Override
public String getHeaderWidth() {
return "20%";
}
@Override
public Comparator<? super RowComponent<ContactInfo>> getSortComparator() {
return (o1, o2) -> o1.getData().getEmail().compareTo(o2.getData().getEmail());
}
@Override
public String getValue(ContactInfo object) {
return object.getEmail();
}
}, "E-Mail Address");
table.addColumn(new TextColumn<ContactInfo>() {
@Override
public String getHeaderWidth() {
return "10%";
}
@Override
public Comparator<? super RowComponent<ContactInfo>> getSortComparator() {
return (o1, o2) -> o1.getData().getPhoneNumber().compareTo(o2.getData().getPhoneNumber());
}
@Override
public String getValue(ContactInfo object) {
return object.getPhoneNumber();
}
}, "Phone Number");
table.addColumn(new WidgetColumn<ContactInfo, MaterialButton>() {
@Override
public String getHeaderWidth() {
return "20%";
}
@Override
public MaterialButton getValue(ContactInfo object) {
if (object.getUsername().equals(userDetails.getUsername())) {
MaterialButton sendMessageButton = new MaterialButton();
sendMessageButton.setType(ButtonType.FLAT);
return sendMessageButton;
}
MaterialButton sendMessageButton = new MaterialButton();
sendMessageButton.setText("SEND MESSAGE");
sendMessageButton.setTextColor(Color.BLUE);
sendMessageButton.setType(ButtonType.FLAT);
sendMessageButton.getElement().getStyle().setTextDecoration(TextDecoration.UNDERLINE);
sendMessageButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Window.alert("Test: " + object.getContactPerson());
}
});
return sendMessageButton;
}
});
MaterialLoader.showLoading(true);
DBGetContactInfoAsync rpcService = (DBGetContactInfoAsync) GWT.create(DBGetContactInfo.class);
ServiceDefTarget target = (ServiceDefTarget) rpcService;
String moduleRelativeURL = GWT.getModuleBaseURL() + "DBGetContactInfoImpl";
target.setServiceEntryPoint(moduleRelativeURL);
rpcService.getContacts(new AsyncCallback<List<ContactInfo>>() {
@Override
public void onSuccess(List<ContactInfo> result) {
MaterialLoader.showLoading(false);
table.setRowData(0, result);
table.setRowCount(result.size());
table.refreshView();
}
@Override
public void onFailure(Throwable caught) {
MaterialLoader.showLoading(false);
MaterialToast.fireToast("Unable to retrieve neighbors contact information.", "rounded");
}
});
}
}