package com.andreiolar.abms.client.view.impl;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import com.andreiolar.abms.client.exception.AptNumberUnavailableException;
import com.andreiolar.abms.client.exception.EmailUnavailableException;
import com.andreiolar.abms.client.exception.NoReadingsFoundForDateException;
import com.andreiolar.abms.client.rpc.DBGetContactInfo;
import com.andreiolar.abms.client.rpc.DBGetContactInfoAsync;
import com.andreiolar.abms.client.rpc.DBGetReadingsForDate;
import com.andreiolar.abms.client.rpc.DBGetReadingsForDateAsync;
import com.andreiolar.abms.client.rpc.DBRegisterTenant;
import com.andreiolar.abms.client.rpc.DBRegisterTenantAsync;
import com.andreiolar.abms.client.rpc.DBRetreiveSubmittedComplaints;
import com.andreiolar.abms.client.rpc.DBRetreiveSubmittedComplaintsAsync;
import com.andreiolar.abms.client.view.AdminView;
import com.andreiolar.abms.client.widgets.ModalCreator;
import com.andreiolar.abms.client.widgets.UploadUpkeepWidget;
import com.andreiolar.abms.client.widgets.VoteResultsWidget;
import com.andreiolar.abms.shared.ContactInfo;
import com.andreiolar.abms.shared.SelfReading;
import com.andreiolar.abms.shared.SubmittedComplaint;
import com.andreiolar.abms.shared.UserDetails;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Cursor;
import com.google.gwt.dom.client.Style.Float;
import com.google.gwt.dom.client.Style.FontWeight;
import com.google.gwt.dom.client.Style.TextDecoration;
import com.google.gwt.dom.client.Style.Unit;
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.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
import gwt.material.design.addins.client.combobox.MaterialComboBox;
import gwt.material.design.addins.client.sideprofile.MaterialSideProfile;
import gwt.material.design.client.constants.ButtonType;
import gwt.material.design.client.constants.Color;
import gwt.material.design.client.constants.Display;
import gwt.material.design.client.constants.FooterType;
import gwt.material.design.client.constants.IconPosition;
import gwt.material.design.client.constants.IconType;
import gwt.material.design.client.constants.InputType;
import gwt.material.design.client.constants.ModalType;
import gwt.material.design.client.constants.Position;
import gwt.material.design.client.constants.SideNavType;
import gwt.material.design.client.constants.TextAlign;
import gwt.material.design.client.constants.WavesType;
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.MaterialCollapsible;
import gwt.material.design.client.ui.MaterialCollapsibleBody;
import gwt.material.design.client.ui.MaterialCollapsibleHeader;
import gwt.material.design.client.ui.MaterialCollapsibleItem;
import gwt.material.design.client.ui.MaterialContainer;
import gwt.material.design.client.ui.MaterialDropDown;
import gwt.material.design.client.ui.MaterialFooter;
import gwt.material.design.client.ui.MaterialFooterCopyright;
import gwt.material.design.client.ui.MaterialImage;
import gwt.material.design.client.ui.MaterialLabel;
import gwt.material.design.client.ui.MaterialLink;
import gwt.material.design.client.ui.MaterialLoader;
import gwt.material.design.client.ui.MaterialModal;
import gwt.material.design.client.ui.MaterialModalContent;
import gwt.material.design.client.ui.MaterialModalFooter;
import gwt.material.design.client.ui.MaterialNavBar;
import gwt.material.design.client.ui.MaterialNavBrand;
import gwt.material.design.client.ui.MaterialNavSection;
import gwt.material.design.client.ui.MaterialPanel;
import gwt.material.design.client.ui.MaterialSideNav;
import gwt.material.design.client.ui.MaterialTextBox;
import gwt.material.design.client.ui.MaterialTitle;
import gwt.material.design.client.ui.MaterialToast;
import gwt.material.design.client.ui.MaterialTooltip;
import gwt.material.design.client.ui.html.Anchor;
import gwt.material.design.client.ui.html.Div;
import gwt.material.design.client.ui.html.Header;
import gwt.material.design.client.ui.html.Hr;
import gwt.material.design.client.ui.html.UnorderedList;
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 class AdminPanel extends Composite implements AdminView {
private MaterialContainer container;
private Presenter presenter;
private UserDetails userDetails;
public AdminPanel() {
String sid = Cookies.getCookie("sid");
if (sid == null) {
int cookieDuration = 5000;
Date expires = new Date(System.currentTimeMillis() + cookieDuration);
Cookies.setCookie("sessionExpired", "Session expired. Please log in again.", expires, null, "/", false);
Window.Location.replace(GWT.getHostPageBaseURL());
}
setUserInfo();
if (userDetails == null) {
int cookieDuration = 5000;
Date expires = new Date(System.currentTimeMillis() + cookieDuration);
Cookies.setCookie("badUserInfo", "Something bad happened. Please log in again.", expires, null, "/", false);
Window.Location.replace(GWT.getHostPageBaseURL());
}
container = new MaterialContainer();
container.setFontSize("1em");
container.addStyleName("main-container");
Widget mainMenu = createMenu();
initWidget(mainMenu);
}
private Widget createMenu() {
HTMLPanel htmlPanel = new HTMLPanel("");
Header header = new Header();
/** Creating the NavBar **/
MaterialNavBar materialNavBar = new MaterialNavBar();
materialNavBar.setActivates("sideNav");
materialNavBar.setPaddingLeft(20.0);
materialNavBar.setBackgroundColor(Color.BLUE);
MaterialNavBrand materialNavBrand = new MaterialNavBrand();
materialNavBrand.setText("ABMS");
materialNavBrand.getElement().getStyle().setCursor(Cursor.POINTER);
materialNavBrand.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
container.clear();
MaterialImage backgroundImage = new MaterialImage("images/icons/city_1.png");
backgroundImage.setWidth("100%");
backgroundImage.setHeight("100%");
backgroundImage.setTop(0.0);
backgroundImage.setBottom(0.0);
backgroundImage.setOpacity(0.5);
container.add(backgroundImage);
}
});
Anchor a = new Anchor();
a.add(materialNavBrand);
materialNavBar.add(a);
MaterialNavSection materialNavSection = new MaterialNavSection();
materialNavSection.setFloat(Float.RIGHT);
/** Log Out **/
MaterialLink logoutLink = new MaterialLink();
logoutLink.setIconType(IconType.POWER_SETTINGS_NEW);
logoutLink.setIconPosition(IconPosition.NONE);
logoutLink.setMarginRight(10.0);
logoutLink.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
userDetails = null;
Cookies.removeCookie("sid");
Window.Location.replace(GWT.getHostPageBaseURL());
}
});
MaterialTooltip logoutTooltip = new MaterialTooltip(logoutLink, "Log Out");
logoutTooltip.setPosition(Position.BOTTOM);
/** Help **/
MaterialLink aboutLink = new MaterialLink();
aboutLink.setIconType(IconType.HELP_OUTLINE);
aboutLink.setIconPosition(IconPosition.NONE);
aboutLink.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
try {
new RequestBuilder(RequestBuilder.GET, "pages/about.html").sendRequest("", new RequestCallback() {
@Override
public void onResponseReceived(Request req, Response resp) {
HTML html = new HTML(resp.getText());
MaterialModal aboutModal = ModalCreator.createWidgetModal("About", html);
RootPanel.get().add(aboutModal);
aboutModal.open();
}
@Override
public void onError(Request res, Throwable throwable) {
MaterialModal errorModal = ModalCreator.createModal(throwable);
RootPanel.get().add(errorModal);
errorModal.open();
}
});
} catch (RequestException e) {
MaterialModal errorModal = ModalCreator.createModal(e);
RootPanel.get().add(errorModal);
errorModal.open();
}
}
});
MaterialTooltip helpTooltip = new MaterialTooltip(aboutLink, "About");
helpTooltip.setPosition(Position.BOTTOM);
/** Institution Information **/
MaterialLink instLink = new MaterialLink();
instLink.setIconType(IconType.INFO_OUTLINE);
instLink.setIconPosition(IconPosition.NONE);
instLink.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
try {
new RequestBuilder(RequestBuilder.GET, "pages/institution_information.html").sendRequest("", new RequestCallback() {
@Override
public void onResponseReceived(Request req, Response resp) {
HTML html = new HTML(resp.getText());
MaterialModal aboutModal = ModalCreator.createWidgetModal("Institution Information", html);
RootPanel.get().add(aboutModal);
aboutModal.open();
}
@Override
public void onError(Request res, Throwable throwable) {
MaterialModal errorModal = ModalCreator.createModal(throwable);
RootPanel.get().add(errorModal);
errorModal.open();
}
});
} catch (RequestException e) {
MaterialModal errorModal = ModalCreator.createModal(e);
RootPanel.get().add(errorModal);
errorModal.open();
}
}
});
MaterialTooltip instTooltip = new MaterialTooltip(instLink, "Institution Information");
instTooltip.setPosition(Position.BOTTOM);
/** Contact Information **/
MaterialLink contactLink = new MaterialLink();
contactLink.setIconType(IconType.CONTACT_PHONE);
contactLink.setIconPosition(IconPosition.NONE);
contactLink.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
try {
new RequestBuilder(RequestBuilder.GET, "pages/contact_info.html").sendRequest("", new RequestCallback() {
@Override
public void onResponseReceived(Request req, Response resp) {
HTML html = new HTML(resp.getText());
MaterialModal contactInformationModal = ModalCreator.createWidgetModal("Contact Information", html);
contactInformationModal.setWidth("400px");
RootPanel.get().add(contactInformationModal);
contactInformationModal.open();
}
@Override
public void onError(Request res, Throwable throwable) {
MaterialModal errorModal = ModalCreator.createModal(throwable);
RootPanel.get().add(errorModal);
errorModal.open();
}
});
} catch (RequestException e) {
MaterialModal errorModal = ModalCreator.createModal(e);
RootPanel.get().add(errorModal);
errorModal.open();
}
}
});
MaterialTooltip contactTooltip = new MaterialTooltip(contactLink, "Contact Information");
contactTooltip.setPosition(Position.BOTTOM);
/** Refresh **/
MaterialLink homeLink = new MaterialLink();
homeLink.setIconType(IconType.HOME);
homeLink.setIconPosition(IconPosition.NONE);
homeLink.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
container.clear();
MaterialImage backgroundImage = new MaterialImage("images/icons/city_1.png");
backgroundImage.setWidth("100%");
backgroundImage.setHeight("100%");
backgroundImage.setTop(0.0);
backgroundImage.setBottom(0.0);
backgroundImage.setOpacity(0.5);
container.add(backgroundImage);
}
});
MaterialTooltip homeTooltip = new MaterialTooltip(homeLink, "Home");
homeTooltip.setPosition(Position.BOTTOM);
materialNavSection.add(homeLink);
materialNavSection.add(contactLink);
materialNavSection.add(instLink);
materialNavSection.add(aboutLink);
materialNavSection.add(logoutLink);
materialNavBar.add(materialNavSection);
header.add(materialNavBar);
/** Creating the SideNav **/
MaterialSideNav materialSideNav = new MaterialSideNav();
materialSideNav.setType(SideNavType.FIXED);
materialSideNav.setId("sideNav");
materialSideNav.setCloseOnClick(false);
materialSideNav.setWidth(280);
materialSideNav.setBackgroundColor(Color.GREY_LIGHTEN_5);
MaterialSideProfile profile = new MaterialSideProfile();
profile.setUrl("images/icons/profile.png");
String profilePictureUsername = userDetails.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 (userDetails.getGender().equals("Female")) {
materialImage.setUrl("images/icons/female.png");
} else {
materialImage.setUrl("images/icons/male.png");
}
}
});
profile.add(materialImage);
MaterialLabel label = new MaterialLabel("Logged in as: Administrator");
label.setTextColor(Color.WHITE);
profile.add(label);
MaterialLink link = new MaterialLink();
link.setText(userDetails.getUsername());
link.setActivates("dropProfile");
link.setIconType(IconType.ARROW_DROP_DOWN);
link.setIconPosition(IconPosition.RIGHT);
link.setTextColor(Color.WHITE);
profile.add(link);
materialSideNav.add(profile);
/** Complaints **/
MaterialLink complaintsLink = new MaterialLink();
complaintsLink.setText("View Submitted Complaints");
complaintsLink.setTextColor(Color.BLUE);
complaintsLink.setIconType(IconType.SENTIMENT_VERY_DISSATISFIED);
complaintsLink.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
constructComplaintsWidget();
}
});
materialSideNav.add(complaintsLink);
header.add(materialSideNav);
/** Administration **/
MaterialCollapsible administrationCollapsible = new MaterialCollapsible();
MaterialCollapsibleItem administrationCollapsibleItem = new MaterialCollapsibleItem();
MaterialCollapsibleHeader administrationCollapsibleHeader = new MaterialCollapsibleHeader();
administrationCollapsibleHeader.setWaves(WavesType.DEFAULT);
MaterialLink administrationLink = new MaterialLink();
administrationLink.setText("Administration");
administrationLink.setIconType(IconType.LOCATION_CITY);
administrationLink.setTextColor(Color.BLUE);
administrationCollapsibleHeader.add(administrationLink);
administrationCollapsibleItem.add(administrationCollapsibleHeader);
MaterialCollapsibleBody administrationBody = new MaterialCollapsibleBody();
UnorderedList administrationListItems = new UnorderedList();
/** Contact Information **/
MaterialLink contactInformationLink = new MaterialLink();
contactInformationLink.setText("Contact Information");
contactInformationLink.setTextColor(Color.BLUE_DARKEN_2);
contactInformationLink.setWaves(WavesType.DEFAULT);
contactInformationLink.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
constructContactInformationWidget();
}
});
administrationListItems.add(contactInformationLink);
/** View Readings **/
MaterialLink viewReadingsLink = new MaterialLink();
viewReadingsLink.setText("View Readings");
viewReadingsLink.setTextColor(Color.BLUE_DARKEN_2);
viewReadingsLink.setWaves(WavesType.DEFAULT);
viewReadingsLink.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
constructViewReadingsWidget();
}
});
administrationListItems.add(viewReadingsLink);
/** Add Tenants **/
MaterialLink addTenantLink = new MaterialLink();
addTenantLink.setText("Add Tenant");
addTenantLink.setTextColor(Color.BLUE_DARKEN_2);
addTenantLink.setWaves(WavesType.DEFAULT);
addTenantLink.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
MaterialModal tenantModal = constructAddTenantModal();
RootPanel.get().add(tenantModal);
tenantModal.open();
}
});
administrationListItems.add(addTenantLink);
/** Upload Upkeep Report **/
MaterialLink uploadUpkeepReportLink = new MaterialLink();
uploadUpkeepReportLink.setText("Upload Upkeep Report");
uploadUpkeepReportLink.setTextColor(Color.BLUE_DARKEN_2);
uploadUpkeepReportLink.setWaves(WavesType.DEFAULT);
uploadUpkeepReportLink.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
container.clear();
UploadUpkeepWidget uploadUpkeepWidget = new UploadUpkeepWidget();
container.add(uploadUpkeepWidget);
}
});
administrationListItems.add(uploadUpkeepReportLink);
administrationBody.add(administrationListItems);
administrationCollapsibleItem.add(administrationBody);
administrationCollapsible.add(administrationCollapsibleItem);
materialSideNav.add(administrationCollapsible);
/** Voting **/
MaterialCollapsible votingCollapsible = new MaterialCollapsible();
MaterialCollapsibleItem votingCollapsibleItem = new MaterialCollapsibleItem();
MaterialCollapsibleHeader votingCollapsibleHeader = new MaterialCollapsibleHeader();
votingCollapsibleHeader.setWaves(WavesType.DEFAULT);
MaterialLink votingLink = new MaterialLink();
votingLink.setText("Voting");
votingLink.setIconType(IconType.ACCOUNT_BALANCE);
votingLink.setTextColor(Color.BLUE);
votingCollapsibleHeader.add(votingLink);
votingCollapsibleItem.add(votingCollapsibleHeader);
MaterialCollapsibleBody votingBody = new MaterialCollapsibleBody();
UnorderedList votingListItems = new UnorderedList();
/** Vote **/
MaterialLink voteLink = new MaterialLink();
voteLink.setText("Vote");
voteLink.setTextColor(Color.BLUE_DARKEN_2);
voteLink.setWaves(WavesType.DEFAULT);
voteLink.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
}
});
votingListItems.add(voteLink);
/** View Vote Results **/
MaterialLink viewVoteResultsLink = new MaterialLink();
viewVoteResultsLink.setText("View Vote Results");
viewVoteResultsLink.setTextColor(Color.BLUE_DARKEN_2);
viewVoteResultsLink.setWaves(WavesType.DEFAULT);
viewVoteResultsLink.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
container.clear();
VoteResultsWidget voteResultsWidget = new VoteResultsWidget(true);
container.add(voteResultsWidget);
}
});
votingListItems.add(viewVoteResultsLink);
votingBody.add(votingListItems);
votingCollapsibleItem.add(votingBody);
votingCollapsible.add(votingCollapsibleItem);
materialSideNav.add(votingCollapsible);
/** Dropdown **/
MaterialDropDown dropDown = new MaterialDropDown("dropProfile");
MaterialLink editAccountSettingsLink = new MaterialLink();
editAccountSettingsLink.setText("View Profile Information");
editAccountSettingsLink.setFontSize("1em");
editAccountSettingsLink.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
container.clear();
}
});
dropDown.add(editAccountSettingsLink);
MaterialLink changePasswordLink = new MaterialLink();
changePasswordLink.setText("Change Password");
changePasswordLink.setFontSize("1em");
changePasswordLink.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
}
});
dropDown.add(changePasswordLink);
MaterialLink changeProfilePictureLink = new MaterialLink();
changeProfilePictureLink.setText("Change Profile Picture");
changeProfilePictureLink.setFontSize("1em");
changeProfilePictureLink.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
}
});
dropDown.add(changeProfilePictureLink);
header.add(dropDown);
htmlPanel.add(header);
/** Creating the main container **/
MaterialImage backgroundImage = new MaterialImage("images/icons/city_1.png");
backgroundImage.setWidth("100%");
backgroundImage.setHeight("100%");
backgroundImage.setTop(0.0);
backgroundImage.setBottom(0.0);
backgroundImage.setOpacity(0.5);
container.add(backgroundImage);
htmlPanel.add(container);
/** Creating the footer **/
MaterialFooter footer = new MaterialFooter();
footer.setBackgroundColor(Color.BLUE);
footer.setType(FooterType.FIXED);
MaterialFooterCopyright copyright = new MaterialFooterCopyright();
MaterialLabel copyrightLabel = new MaterialLabel();
copyrightLabel.getElement().setInnerHTML("© 2016-2017 Copyright Andrei Olar");
copyright.add(copyrightLabel);
footer.add(copyright);
htmlPanel.add(footer);
return htmlPanel;
}
protected MaterialModal constructAddTenantModal() {
MaterialModal materialModal = new MaterialModal();
materialModal.setType(ModalType.DEFAULT);
materialModal.setDismissible(false);
materialModal.setInDuration(500);
materialModal.setOutDuration(500);
MaterialModalContent materialModalContent = new MaterialModalContent();
MaterialTitle materialTitle = new MaterialTitle("Add Tenant");
materialTitle.setTextColor(Color.BLUE);
materialTitle.setDescription("Please provide necessary information in order to add a tenant to be eligible for registration!");
materialModalContent.add(materialTitle);
// Content
MaterialTextBox emailTextBox = new MaterialTextBox();
emailTextBox.setMarginTop(25.0);
emailTextBox.setType(InputType.EMAIL);
emailTextBox.setPlaceholder("E-Mail");
emailTextBox.setIconType(IconType.ACCOUNT_CIRCLE);
materialModalContent.add(emailTextBox);
MaterialTextBox aptNumberBox = new MaterialTextBox();
aptNumberBox.setType(InputType.NUMBER);
aptNumberBox.setPlaceholder("Apt. Number");
aptNumberBox.setIconType(IconType.FORMAT_LIST_NUMBERED);
materialModalContent.add(aptNumberBox);
MaterialModalFooter materialModalFooter = new MaterialModalFooter();
MaterialButton submitButton = new MaterialButton();
submitButton.setText("Add");
submitButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
String email = emailTextBox.getText();
String aptNumber = aptNumberBox.getText();
boolean canProceed = true;
if (!email.matches("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.(?:[a-zA-Z]{2,6})$")) {
canProceed = false;
emailTextBox.setError("Not a valid E-Mail Address");
} else {
emailTextBox.setSuccess("");
}
if (!aptNumber.matches("[1-9][0-9]{0,1}")) {
canProceed = false;
aptNumberBox.setError("Not a valid apartment number");
} else {
aptNumberBox.setSuccess("");
}
if (canProceed) {
MaterialLoader.showLoading(true);
DBRegisterTenantAsync registerTenantRpc = (DBRegisterTenantAsync) GWT.create(DBRegisterTenant.class);
ServiceDefTarget registerTenantTarget = (ServiceDefTarget) registerTenantRpc;
String registerTenantUrl = GWT.getModuleBaseURL() + "DBRegisterTenantImpl";
registerTenantTarget.setServiceEntryPoint(registerTenantUrl);
registerTenantRpc.registerTenant(email, aptNumber, new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
MaterialLoader.showLoading(false);
if (caught instanceof EmailUnavailableException) {
emailTextBox.setError("E-Mail Address already in registration queue.");
} else if (caught instanceof AptNumberUnavailableException) {
aptNumberBox.setError("Aptartment Number already in use.");
} else {
MaterialModal errorModal = ModalCreator.createModal(caught);
RootPanel.get().add(errorModal);
errorModal.open();
}
}
@Override
public void onSuccess(Void result) {
MaterialLoader.showLoading(false);
MaterialToast.fireToast("Tenant successfully added to registration queue.");
materialModal.close();
RootPanel.get().remove(materialModal);
}
});
}
}
});
MaterialButton closeButton = new MaterialButton();
closeButton.setText("Close");
closeButton.setType(ButtonType.FLAT);
closeButton.addClickHandler(h -> {
materialModal.close();
RootPanel.get().remove(materialModal);
});
materialModalFooter.add(submitButton);
materialModalFooter.add(closeButton);
materialModal.add(materialModalContent);
materialModal.add(materialModalFooter);
return materialModal;
}
protected void constructViewReadingsWidget() {
container.clear();
MaterialPanel panel = new MaterialPanel();
MaterialPanel tablePanel = new MaterialPanel();
MaterialLabel title = new MaterialLabel("View Readings");
title.setTextColor(Color.BLUE);
title.setTextAlign(TextAlign.CENTER);
title.setFontSize("36px");
title.setFontWeight(FontWeight.BOLD);
panel.add(title);
panel.add(new Hr());
MaterialComboBox<String> months = new MaterialComboBox<String>();
months.setWidth("36%");
months.getElement().getStyle().setMarginRight(2, Unit.PCT);
months.addItem("January");
months.addItem("February");
months.addItem("March");
months.addItem("April");
months.addItem("May");
months.addItem("June");
months.addItem("July");
months.addItem("August");
months.addItem("September");
months.addItem("October");
months.addItem("November");
months.addItem("December");
DateTimeFormat df = DateTimeFormat.getFormat("yyyy");
String formattedDate = df.format(new Date());
int year = Integer.parseInt(formattedDate);
MaterialComboBox<String> years = new MaterialComboBox<String>();
years.setWidth("36%");
years.getElement().getStyle().setMarginRight(2, Unit.PCT);
for (int i = year; i >= 2016; i--) {
years.addItem(String.valueOf(i));
}
MaterialButton searchButton = new MaterialButton();
searchButton.setText("Search");
searchButton.setWidth("24%");
searchButton.getElement().getStyle().setMarginTop(1, Unit.EM);
searchButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
String month = months.getSelectedValue();
String year = years.getSelectedValue();
MaterialLoader.showLoading(true);
DBGetReadingsForDateAsync readingsRpc = (DBGetReadingsForDateAsync) GWT.create(DBGetReadingsForDate.class);
ServiceDefTarget readingsTarget = (ServiceDefTarget) readingsRpc;
String readingsUrl = GWT.getModuleBaseURL() + "DBGetReadingsForDateImpl";
readingsTarget.setServiceEntryPoint(readingsUrl);
readingsRpc.getReadingsForDate(month + " " + year, new AsyncCallback<List<SelfReading>>() {
@Override
public void onFailure(Throwable caught) {
MaterialLoader.showLoading(false);
if (caught instanceof NoReadingsFoundForDateException) {
tablePanel.clear();
MaterialPanel errorPanel = new MaterialPanel();
errorPanel.addStyleName("no-readings-found-panel");
MaterialLabel label = new MaterialLabel();
label.setTextColor(Color.BLUE);
label.setTextAlign(TextAlign.CENTER);
label.setFontSize("18px");
label.setText("No readings found for " + month + " " + year);
errorPanel.add(label);
tablePanel.add(errorPanel);
} else {
MaterialModal errorModal = ModalCreator.createModal(caught);
RootPanel.get().add(errorModal);
errorModal.open();
}
}
@Override
public void onSuccess(List<SelfReading> result) {
MaterialLoader.showLoading(false);
tablePanel.clear();
MaterialDataTable<SelfReading> table = new MaterialDataTable<SelfReading>();
table.setUseStickyHeader(true);
table.setUseCategories(false);
table.setUseRowExpansion(false);
table.setSelectionType(SelectionType.NONE);
table.setRedraw(true);
table.setStyleName("readings-table");
tablePanel.add(table);
table.getTableTitle().setText("Readings for " + month + " " + year);
table.addColumn(new TextColumn<SelfReading>() {
@Override
public String getHeaderWidth() {
return "20%";
}
@Override
public Comparator<? super RowComponent<SelfReading>> getSortComparator() {
return (o1, o2) -> Integer.compare(Integer.parseInt(o1.getData().getAptNumber()),
Integer.parseInt(o2.getData().getAptNumber()));
}
@Override
public String getValue(SelfReading object) {
return object.getAptNumber();
}
}, "Apt. Number");
table.addColumn(new TextColumn<SelfReading>() {
@Override
public String getHeaderWidth() {
return "20%";
};
@Override
public Comparator<? super RowComponent<SelfReading>> getSortComparator() {
return (o1, o2) -> Integer.compare(Integer.parseInt(o1.getData().getColdWater()),
Integer.parseInt(o2.getData().getColdWater()));
}
@Override
public String getValue(SelfReading object) {
return object.getColdWater();
}
}, "Cold Water");
table.addColumn(new TextColumn<SelfReading>() {
@Override
public String getHeaderWidth() {
return "20%";
};
@Override
public Comparator<? super RowComponent<SelfReading>> getSortComparator() {
return (o1, o2) -> Integer.compare(Integer.parseInt(o1.getData().getHotWater()),
Integer.parseInt(o2.getData().getHotWater()));
}
@Override
public String getValue(SelfReading object) {
return object.getHotWater();
}
}, "Hot Water");
table.addColumn(new TextColumn<SelfReading>() {
@Override
public String getHeaderWidth() {
return "20%";
};
@Override
public Comparator<? super RowComponent<SelfReading>> getSortComparator() {
return (o1, o2) -> Integer.compare(Integer.parseInt(o1.getData().getElectricity()),
Integer.parseInt(o2.getData().getElectricity()));
}
@Override
public String getValue(SelfReading object) {
return object.getElectricity();
}
}, "Electricity");
table.addColumn(new TextColumn<SelfReading>() {
@Override
public String getHeaderWidth() {
return "20%";
};
@Override
public Comparator<? super RowComponent<SelfReading>> getSortComparator() {
return (o1, o2) -> Integer.compare(Integer.parseInt(o1.getData().getGaz()), Integer.parseInt(o2.getData().getGaz()));
}
@Override
public String getValue(SelfReading object) {
return object.getGaz();
}
}, "Gas");
table.setRowData(0, result);
table.setRowCount(result.size());
table.refreshView();
}
});
}
});
Div dateSelectionDiv = new Div();
dateSelectionDiv.setDisplay(Display.FLEX);
dateSelectionDiv.addStyleName("date-selection");
dateSelectionDiv.add(months);
dateSelectionDiv.add(years);
dateSelectionDiv.add(searchButton);
panel.add(dateSelectionDiv);
panel.add(tablePanel);
container.add(panel);
}
/**
* Used to construct the {@link MaterialDataTable} representing the Complaints Widget.
**/
private void constructComplaintsWidget() {
container.clear();
MaterialPanel panel = new MaterialPanel();
MaterialLabel title = new MaterialLabel("View Submitted Complaints");
title.setTextColor(Color.BLUE);
title.setTextAlign(TextAlign.CENTER);
title.setFontSize("36px");
title.setFontWeight(FontWeight.BOLD);
panel.add(title);
panel.add(new Hr());
MaterialDataTable<SubmittedComplaint> table = new MaterialDataTable<SubmittedComplaint>();
table.setUseStickyHeader(true);
table.setUseCategories(false);
table.setUseRowExpansion(false);
table.setSelectionType(SelectionType.NONE);
table.setRedraw(true);
table.setStyleName("submitted-complaints-table");
panel.add(table);
container.add(panel);
table.getTableTitle().setText("Submitted Complaints");
table.addColumn(new TextColumn<SubmittedComplaint>() {
@Override
public String getHeaderWidth() {
return "25%";
}
@Override
public Comparator<? super RowComponent<SubmittedComplaint>> getSortComparator() {
return (o1, o2) -> Integer.compare(o1.getData().getAptNumber(), o2.getData().getAptNumber());
}
@Override
public String getValue(SubmittedComplaint object) {
return String.valueOf(object.getAptNumber());
}
}, "Apt. Number");
table.addColumn(new TextColumn<SubmittedComplaint>() {
@Override
public String getHeaderWidth() {
return "25%";
};
@Override
public java.util.Comparator<? super gwt.material.design.client.data.component.RowComponent<SubmittedComplaint>> getSortComparator() {
return (o1, o2) -> Long.compare(o1.getData().getDateSubmitted().getTime(), o2.getData().getDateSubmitted().getTime());
};
@Override
public String getValue(SubmittedComplaint object) {
DateTimeFormat df = DateTimeFormat.getFormat("yyyy-MM-dd");
String formattedDate = df.format(object.getDateSubmitted());
return formattedDate;
}
}, "Date Submitted");
table.addColumn(new TextColumn<SubmittedComplaint>() {
@Override
public String getHeaderWidth() {
return "25%";
};
@Override
public java.util.Comparator<? super gwt.material.design.client.data.component.RowComponent<SubmittedComplaint>> getSortComparator() {
return (o1, o2) -> o1.getData().getComplaintTo().compareTo(o2.getData().getComplaintTo());
};
@Override
public String getValue(SubmittedComplaint object) {
return object.getComplaintTo();
}
}, "Complaint To");
table.addColumn(new TextColumn<SubmittedComplaint>() {
@Override
public String getHeaderWidth() {
return "25%";
};
@Override
public boolean isSortable() {
return false;
}
@Override
public String getValue(SubmittedComplaint object) {
return object.getPhoneNumber();
}
}, "Phone Number");
MaterialLoader.showLoading(true);
DBRetreiveSubmittedComplaintsAsync rpcService = (DBRetreiveSubmittedComplaintsAsync) GWT.create(DBRetreiveSubmittedComplaints.class);
ServiceDefTarget target = (ServiceDefTarget) rpcService;
String moduleRelativeURL = GWT.getModuleBaseURL() + "DBRetreiveSubmittedComplaintsImpl";
target.setServiceEntryPoint(moduleRelativeURL);
rpcService.retreiveSubmittedComplaints(new AsyncCallback<List<SubmittedComplaint>>() {
@Override
public void onSuccess(List<SubmittedComplaint> result) {
MaterialLoader.showLoading(false);
table.setRowData(0, result);
table.setRowCount(result.size());
table.refreshView();
}
@Override
public void onFailure(Throwable caught) {
MaterialLoader.showLoading(false);
MaterialModal errorModal = ModalCreator.createModal(caught);
RootPanel.get().add(errorModal);
errorModal.open();
}
});
}
private void setUserInfo() {
String token = History.getToken();
String json = token.substring(token.indexOf(":") + 1, token.length());
try {
JSONObject userInfoObject;
JSONValue jsonValue = JSONParser.parseStrict(json);
if ((userInfoObject = jsonValue.isObject()) == null) {
Window.alert("Error parsing JSON");
}
JSONValue firstName = userInfoObject.get("firstName");
JSONValue lastName = userInfoObject.get("lastName");
JSONValue dateOfBirth = userInfoObject.get("dateOfBirth");
JSONValue email = userInfoObject.get("email");
JSONValue mobileNumber = userInfoObject.get("mobileNumber");
JSONValue gender = userInfoObject.get("gender");
JSONValue address = userInfoObject.get("address");
JSONValue city = userInfoObject.get("city");
JSONValue country = userInfoObject.get("country");
JSONValue personalNumber = userInfoObject.get("personalNumber");
JSONValue idSeries = userInfoObject.get("idSeries");
JSONValue apartmentNumber = userInfoObject.get("apartmentNumber");
JSONValue username = userInfoObject.get("username");
DateTimeFormat df = DateTimeFormat.getFormat("yyyy-MM-dd");
Date date = df.parse(dateOfBirth.toString().replaceAll("\"", ""));
userDetails = new UserDetails(firstName.toString().replaceAll("\"", ""), lastName.toString().replaceAll("\"", ""), date,
email.toString().replaceAll("\"", ""), mobileNumber.toString().replaceAll("\"", ""), gender.toString().replaceAll("\"", ""),
address.toString().replaceAll("\"", ""), city.toString().replaceAll("\"", ""), country.toString().replaceAll("\"", ""),
personalNumber.toString().replaceAll("\"", ""), idSeries.toString().replaceAll("\"", ""),
username.toString().replaceAll("\"", ""), null, apartmentNumber.toString().replaceAll("\"", ""));
} catch (Exception e) {
userDetails = null;
}
}
/**
* Used to construct the {@link MaterialDataTable} representing the Contact Information Widget.
**/
protected void constructContactInformationWidget() {
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");
}
});
}
@Override
public void setName(String username) {
// TODO Auto-generated method stub
}
@Override
public void setPresenter(Presenter presenter) {
// TODO Auto-generated method stub
}
}