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.OldPasswordNotCorrectException; import com.andreiolar.abms.client.rpc.ChangePassword; import com.andreiolar.abms.client.rpc.ChangePasswordAsync; import com.andreiolar.abms.client.rpc.DBGetContactInfo; import com.andreiolar.abms.client.rpc.DBGetContactInfoAsync; import com.andreiolar.abms.client.view.UserView; import com.andreiolar.abms.client.widgets.ComplaintsWidget; import com.andreiolar.abms.client.widgets.ConsumptionWidget; import com.andreiolar.abms.client.widgets.GeneralCostsWidget; import com.andreiolar.abms.client.widgets.MessengerWidget; import com.andreiolar.abms.client.widgets.ModalCreator; import com.andreiolar.abms.client.widgets.PersonalCostsWidget; import com.andreiolar.abms.client.widgets.ProfileInfoWidget; import com.andreiolar.abms.client.widgets.VoteResultsWidget; import com.andreiolar.abms.client.widgets.VoteWidget; 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.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.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.fileuploader.MaterialFileUploader; import gwt.material.design.addins.client.fileuploader.MaterialUploadLabel; import gwt.material.design.addins.client.fileuploader.base.UploadFile; import gwt.material.design.addins.client.fileuploader.events.SuccessEvent; import gwt.material.design.addins.client.fileuploader.events.SuccessEvent.SuccessHandler; 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.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.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 UserPanel extends Composite implements UserView { private MaterialContainer container; private Presenter presenter; private UserDetails userDetails; public UserPanel() { 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 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; } } 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.setHref("javascript:window.location.reload()"); 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: " + userDetails.getFirstName() + " " + userDetails.getLastName()); 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("Complaints"); complaintsLink.setTextColor(Color.BLUE); complaintsLink.setIconType(IconType.SENTIMENT_VERY_DISSATISFIED); complaintsLink.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { container.clear(); ComplaintsWidget widget = new ComplaintsWidget(userDetails); container.add(widget); } }); materialSideNav.add(complaintsLink); /** 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); /** Self Readings **/ MaterialLink selfReadingsLink = new MaterialLink(); selfReadingsLink.setText("Consumption Reading"); selfReadingsLink.setTextColor(Color.BLUE_DARKEN_2); selfReadingsLink.setWaves(WavesType.DEFAULT); selfReadingsLink.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { container.clear(); ConsumptionWidget consumptionWidget = new ConsumptionWidget(userDetails); container.add(consumptionWidget); } }); administrationListItems.add(selfReadingsLink); /** General Costs View **/ MaterialLink generalCostsViewLink = new MaterialLink(); generalCostsViewLink.setText("General Costs View"); generalCostsViewLink.setTextColor(Color.BLUE_DARKEN_2); generalCostsViewLink.setWaves(WavesType.DEFAULT); generalCostsViewLink.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { container.clear(); GeneralCostsWidget generalCostWidget = new GeneralCostsWidget(userDetails); container.add(generalCostWidget); } }); administrationListItems.add(generalCostsViewLink); /** Personal Costs View **/ MaterialLink personalCostsViewLink = new MaterialLink(); personalCostsViewLink.setText("Personal Costs View"); personalCostsViewLink.setTextColor(Color.BLUE_DARKEN_2); personalCostsViewLink.setWaves(WavesType.DEFAULT); personalCostsViewLink.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { container.clear(); PersonalCostsWidget personalCostsWidget = new PersonalCostsWidget(userDetails); container.add(personalCostsWidget); } }); administrationListItems.add(personalCostsViewLink); 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) { container.clear(); VoteWidget voteWidget = new VoteWidget(userDetails); container.add(voteWidget); } }); 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(false); container.add(voteResultsWidget); } }); votingListItems.add(viewVoteResultsLink); votingBody.add(votingListItems); votingCollapsibleItem.add(votingBody); votingCollapsible.add(votingCollapsibleItem); materialSideNav.add(votingCollapsible); /** Messenger **/ MaterialLink messengerLink = new MaterialLink(); messengerLink.setText("Messenger"); messengerLink.setTextColor(Color.BLUE); messengerLink.setIconType(IconType.MESSAGE); messengerLink.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { container.clear(); MessengerWidget widget = new MessengerWidget(userDetails); container.add(widget); } }); materialSideNav.add(messengerLink); /** Financial **/ MaterialCollapsible financialCollapsible = new MaterialCollapsible(); MaterialCollapsibleItem financialCollapsibleItem = new MaterialCollapsibleItem(); MaterialCollapsibleHeader financialCollapsibleHeader = new MaterialCollapsibleHeader(); financialCollapsibleHeader.setWaves(WavesType.DEFAULT); MaterialLink financialLink = new MaterialLink(); financialLink.setText("Financial"); financialLink.setIconType(IconType.EURO_SYMBOL); financialLink.setTextColor(Color.BLUE); financialCollapsibleHeader.add(financialLink); financialCollapsibleItem.add(financialCollapsibleHeader); MaterialCollapsibleBody financialBody = new MaterialCollapsibleBody(); UnorderedList financialListItems = new UnorderedList(); /** Pay **/ MaterialLink payLink = new MaterialLink(); payLink.setText("Pay"); payLink.setTextColor(Color.BLUE_DARKEN_2); payLink.setWaves(WavesType.DEFAULT); payLink.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { container.clear(); } }); financialListItems.add(payLink); /** View Payment History **/ MaterialLink viewPaymentHistoryLink = new MaterialLink(); viewPaymentHistoryLink.setText("View Payment History"); viewPaymentHistoryLink.setTextColor(Color.BLUE_DARKEN_2); viewPaymentHistoryLink.setWaves(WavesType.DEFAULT); viewPaymentHistoryLink.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { container.clear(); } }); financialListItems.add(viewPaymentHistoryLink); financialBody.add(financialListItems); financialCollapsibleItem.add(financialBody); financialCollapsible.add(financialCollapsibleItem); materialSideNav.add(financialCollapsible); header.add(materialSideNav); /** 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(); ProfileInfoWidget profileInfoWidget = new ProfileInfoWidget(userDetails); container.add(profileInfoWidget); } }); dropDown.add(editAccountSettingsLink); MaterialLink changePasswordLink = new MaterialLink(); changePasswordLink.setText("Change Password"); changePasswordLink.setFontSize("1em"); changePasswordLink.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { MaterialModal changePasswordModal = createChangePasswordModal(); RootPanel.get().add(changePasswordModal); changePasswordModal.open(); } }); 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) { MaterialModal changeProfilePictureModal = createChangeProfilePictureModal(materialImage); RootPanel.get().add(changeProfilePictureModal); changeProfilePictureModal.open(); } }); 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 createChangeProfilePictureModal(MaterialImage materialImage) { 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("Change Profile Picture"); materialTitle.setTextColor(Color.BLUE); materialTitle.setDescription("Please choose a new profile picture."); materialModalContent.add(materialTitle); // Content MaterialFileUploader fileUploader = new MaterialFileUploader(); fileUploader.setUrl(GWT.getModuleBaseURL() + "uploader"); fileUploader.setMaxFileSize(10); fileUploader.setShadow(1); fileUploader.addSuccessHandler(new SuccessHandler<UploadFile>() { @Override public void onSuccess(SuccessEvent<UploadFile> event) { materialModal.close(); RootPanel.get().remove(materialModal); MaterialToast.fireToast("Profile picture uploaded successfully!", "rounded"); String profilePictureUsername = userDetails.getUsername().replaceAll("\\.", ""); 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"); } } }); } }); fileUploader.addErrorHandler(new gwt.material.design.addins.client.fileuploader.events.ErrorEvent.ErrorHandler<UploadFile>() { @Override public void onError(gwt.material.design.addins.client.fileuploader.events.ErrorEvent<UploadFile> event) { MaterialToast.fireToast("Error uploading profile picture: " + event.getResponse().getCode() + ": " + event.getResponse().getMessage(), "rounded"); } }); MaterialUploadLabel label = new MaterialUploadLabel("Profile Picture Uploader", "Selcect or drag and drop files to upload."); fileUploader.add(label); materialModalContent.add(fileUploader); MaterialModalFooter materialModalFooter = new MaterialModalFooter(); MaterialButton closeButton = new MaterialButton(); closeButton.setText("Close"); closeButton.setType(ButtonType.FLAT); closeButton.addClickHandler(h -> { materialModal.close(); RootPanel.get().remove(materialModal); }); materialModalFooter.add(closeButton); materialModal.add(materialModalContent); materialModal.add(materialModalFooter); return materialModal; } protected MaterialModal createChangePasswordModal() { 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("Change Password"); materialTitle.setTextColor(Color.BLUE); materialTitle.setDescription("Please provide necessary information in order to change your password!"); materialModalContent.add(materialTitle); // Content MaterialTextBox oldPasswordBox = new MaterialTextBox(); oldPasswordBox.setMarginTop(25.0); oldPasswordBox.setType(InputType.PASSWORD); oldPasswordBox.setPlaceholder("Old Password"); oldPasswordBox.setLength(10); oldPasswordBox.setMaxLength(10); oldPasswordBox.setIconType(IconType.LOCK); materialModalContent.add(oldPasswordBox); MaterialTextBox newPasswordBox = new MaterialTextBox(); newPasswordBox.setType(InputType.PASSWORD); newPasswordBox.setPlaceholder("New Password"); newPasswordBox.setLength(10); newPasswordBox.setMaxLength(10); newPasswordBox.setIconType(IconType.LOCK); materialModalContent.add(newPasswordBox); MaterialTextBox repeatPasswordBox = new MaterialTextBox(); repeatPasswordBox.setType(InputType.PASSWORD); repeatPasswordBox.setPlaceholder("Repeat New Password"); repeatPasswordBox.setLength(10); repeatPasswordBox.setMaxLength(10); repeatPasswordBox.setIconType(IconType.LOCK); materialModalContent.add(repeatPasswordBox); MaterialModalFooter materialModalFooter = new MaterialModalFooter(); MaterialButton submitButton = new MaterialButton(); submitButton.setText("Change Password"); submitButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { String oldPassword = oldPasswordBox.getText(); String newPassword = newPasswordBox.getText(); String repeatedPassword = repeatPasswordBox.getText(); boolean canProceed = true; if (!oldPassword.matches("[A-Za-z0-9]{5,10}")) { canProceed = false; oldPasswordBox.setError( "Password can only contain uppercase, lowercase letters and 0-9 digits. Password has to be between 5 and 10 characters long."); } else { oldPasswordBox.setSuccess(""); } if (!newPassword.matches("[A-Za-z0-9]{5,10}")) { canProceed = false; newPasswordBox.setError( "Password can only contain uppercase, lowercase letters and 0-9 digits. Password has to be between 5 and 10 characters long."); } else { newPasswordBox.setSuccess(""); } if (!repeatedPassword.matches("[A-Za-z0-9]{5,10}")) { canProceed = false; repeatPasswordBox.setError( "Password can only contain uppercase, lowercase letters and 0-9 digits. Password has to be between 5 and 10 characters long."); } else { repeatPasswordBox.setSuccess(""); } if (canProceed) { if (newPassword.equals(repeatedPassword)) { submitButton.setEnabled(false); newPasswordBox.setSuccess(""); repeatPasswordBox.setSuccess(""); // Send to server ChangePasswordAsync changePasswordRpc = (ChangePasswordAsync) GWT.create(ChangePassword.class); ServiceDefTarget changePasswordTar = (ServiceDefTarget) changePasswordRpc; String changePasswordUrl = GWT.getModuleBaseURL() + "ChangePasswordImpl"; changePasswordTar.setServiceEntryPoint(changePasswordUrl); changePasswordRpc.changePassword(userDetails.getUsername(), oldPassword, newPassword, new AsyncCallback<Void>() { @Override public void onFailure(Throwable caught) { submitButton.setEnabled(true); if (caught instanceof OldPasswordNotCorrectException) { oldPasswordBox.setError("Old password is not correct."); } else { materialModal.close(); RootPanel.get().remove(materialModal); MaterialToast.fireToast("Error changing password: " + caught.getMessage() + ".", "rounded"); } } @Override public void onSuccess(Void result) { submitButton.setEnabled(true); materialModal.close(); RootPanel.get().remove(materialModal); Cookies.removeCookie("sid"); int cookieDuration = 5000; Date expires = new Date(System.currentTimeMillis() + cookieDuration); Cookies.setCookie("passwordChanged", "Password changed successfully. Log In required.", expires, null, "/", false); Window.Location.replace(GWT.getHostPageBaseURL()); } }); } else { newPasswordBox.setError("Passwords do not match!"); repeatPasswordBox.setError("Passwords do not match!"); } } } }); 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; } /** * 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 setUsername(String username) { } @Override public void setPresenter(Presenter presenter) { this.presenter = presenter; } }