X-Git-Url: https://code.grnet.gr/git/pithos-web-client/blobdiff_plain/fd1da2eb30ec22ed8cb969a596d1fa905f0516c8..6abe26f26aa44e8c6ac979a8a8c15bc93d1adc1f:/src/gr/grnet/pithos/web/client/InvitationsDialog.java diff --git a/src/gr/grnet/pithos/web/client/InvitationsDialog.java b/src/gr/grnet/pithos/web/client/InvitationsDialog.java index 97dd954..3b11130 100644 --- a/src/gr/grnet/pithos/web/client/InvitationsDialog.java +++ b/src/gr/grnet/pithos/web/client/InvitationsDialog.java @@ -52,22 +52,32 @@ import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; /** * A dialog box that displays info about invitations */ public class InvitationsDialog extends DialogBox { - - private final String WIDTH_FIELD = "35em"; - private final String WIDTH_TEXT = "42em"; - + private static final int INV_PER_PAGE = 5; + + Pithos app; + VerticalPanel messagesPanel; + int rows = 0; + FlexTable sentInvitationsTable; + /** + * The current displayed page of sent invitations + */ + int currentPage = 0; + HorizontalPanel pagerPanel; /** * The widget constructor. */ - public InvitationsDialog(final Pithos app, Invitations inv) { + public InvitationsDialog(Pithos _app, final Invitations inv) { + this.app = _app; Anchor close = new Anchor(); close.addStyleName("close"); close.addClickHandler(new ClickHandler() { @@ -78,80 +88,270 @@ public class InvitationsDialog extends DialogBox { } }); // Set the dialog's caption. - setText("Invite people (" + inv.getInvitationsLeft() + " invitations left)"); + setText("Invite friends"); setAnimationEnabled(true); setGlassEnabled(true); setStyleName("pithos-DialogBox"); VerticalPanel outer = new VerticalPanel(); - outer.add(close); + outer.addStyleName("outer"); + outer.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT); VerticalPanel inner = new VerticalPanel(); inner.addStyleName("inner"); // Create the text and set a style name so we can style it with CSS. - HTML text = new HTML("You have " + inv.getInvitationsLeft() + " invitations left in your account."); - text.setStyleName("pithos-credentialsText"); - text.setWidth(WIDTH_TEXT); + HTML text = new HTML("You have " + inv.getInvitationsLeft() + " invitations left"); + text.addStyleName("pithos-invitationsLeft"); inner.add(text); - FlexTable table = new FlexTable(); - table.setText(0, 0, "Name"); - table.setText(1, 0, "E-mail"); - final TextBox name = new TextBox(); - name.setWidth(WIDTH_FIELD); - table.setWidget(0, 1, name); + + HorizontalPanel split = new HorizontalPanel(); + split.addStyleName("pithos-invitationsSplitPanel"); - final TextBox emailBox = new TextBox(); - emailBox.setWidth(WIDTH_FIELD); - table.setWidget(1, 1, emailBox); + VerticalPanel left = new VerticalPanel(); + left.addStyleName("pithos-sendInvitationsPanel"); + left.setVisible(inv.getInvitationsLeft() > 0); - table.getFlexCellFormatter().setStyleName(0, 0, "props-labels"); - table.getFlexCellFormatter().setStyleName(0, 1, "props-values"); - table.getFlexCellFormatter().setStyleName(1, 0, "props-labels"); - table.getFlexCellFormatter().setStyleName(1, 1, "props-values"); - inner.add(table); + HorizontalPanel sendLabelPanel = new HorizontalPanel(); + HTML sendLabel = new HTML("Send new invitations"); + sendLabel.addStyleName("pithos-sendInvitationsTitle"); + sendLabelPanel.add(sendLabel); + Image plus = new Image("images/plus.png"); + plus.addStyleName("pithos-addInvitationImg"); + sendLabelPanel.add(plus); + left.add(sendLabelPanel); - Button confirm = new Button("Send", new ClickHandler() { + messagesPanel = new VerticalPanel(); + messagesPanel.setSpacing(5); + left.add(messagesPanel); + + final FlexTable table = new FlexTable(); + table.setCellSpacing(0); + if (inv.getInvitationsLeft() > 0) { + table.setHTML(0, 0, "Name e.g. John Smith"); + table.getFlexCellFormatter().setStyleName(0, 0, "props-labels"); + table.setText(0, 1, "Email"); + table.getFlexCellFormatter().setStyleName(0, 1, "props-labels"); + rows = 1; + addFormLine(table); + } + left.add(table); + plus.addClickHandler(new ClickHandler() { + @Override public void onClick(ClickEvent event) { - PostRequest sendInvitation = new PostRequest("/im/", "", "invitations?uniq=" + emailBox.getText().trim() + "&realname=" + name.getText().trim()) { - - @Override - protected void onUnauthorized(Response response) { - app.sessionExpired(); - } - - @Override - public void onSuccess(Resource result) { - } - - @Override - public void onError(Throwable t) { - GWT.log("", t); - } - }; - sendInvitation.setHeader("X-Auth-Token", app.getToken()); - Scheduler.get().scheduleDeferred(sendInvitation); - hide(); + if (rows == 0) { + table.setHTML(0, 0, "Name e.g. John Smith"); + table.getFlexCellFormatter().setStyleName(0, 0, "props-labels"); + table.setText(0, 1, "Email"); + table.getFlexCellFormatter().setStyleName(0, 1, "props-labels"); + rows++; + } + addFormLine(table); + } + }); + + Button send = new Button("send invitations", new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + int rowCount = table.getRowCount(); + + for (int i = 1; i 0); + left.add(send); + + split.add(left); + split.setCellWidth(left, "50%"); + + VerticalPanel right = new VerticalPanel(); + right.addStyleName("pithos-sentInvitationsPanel"); + + HTML sentLabel = new HTML("Invitations sent"); + sentLabel.addStyleName("pithos-sentInvitationsTitle"); + right.add(sentLabel); + + sentInvitationsTable = new FlexTable(); + sentInvitationsTable.setCellSpacing(0); + sentInvitationsTable.addStyleName("pithos-sentInvitationsTable"); + fillSentInvitationsTable(inv); + right.add(sentInvitationsTable); + + pagerPanel = new HorizontalPanel(); + pagerPanel.setSpacing(5); + Button prev = new Button("Prev"); + prev.addStyleName("pithos-pagerButton"); + prev.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + if (currentPage > 0) { + pagerPanel.getWidget(currentPage + 1).removeStyleName("pithos-pagerButtonCurrent"); + currentPage--; + fillSentInvitationsTable(inv); + pagerPanel.getWidget(currentPage + 1).addStyleName("pithos-pagerButtonCurrent"); + } + } + }); + pagerPanel.add(prev); + Button next = new Button("Next"); + next.addStyleName("pithos-pagerButton"); + next.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + int numOfInvs = inv.getSentInvitations().size(); + int numOfPages = numOfInvs / INV_PER_PAGE + (numOfInvs % INV_PER_PAGE == 0 ? 0 : 1); + if (currentPage < numOfPages - 1) { + pagerPanel.getWidget(currentPage + 1).removeStyleName("pithos-pagerButtonCurrent"); + currentPage++; + pagerPanel.getWidget(currentPage + 1).addStyleName("pithos-pagerButtonCurrent"); + fillSentInvitationsTable(inv); + } + } + }); + pagerPanel.add(next); + right.add(pagerPanel); + updatePagerPanel(inv); + + split.add(right); + + inner.add(split); + outer.add(inner); + outer.add(close); outer.setCellHorizontalAlignment(inner, HasHorizontalAlignment.ALIGN_CENTER); setWidget(outer); } - @Override - protected void onPreviewNativeEvent(NativePreviewEvent preview) { - super.onPreviewNativeEvent(preview); - NativeEvent evt = preview.getNativeEvent(); - if (evt.getType().equals("keydown")) - // Use the popup's key preview hooks to close the dialog when - // either enter or escape is pressed. - switch (evt.getKeyCode()) { - case KeyCodes.KEY_ENTER: - case KeyCodes.KEY_ESCAPE: - hide(); - break; + private void addFormLine(final FlexTable table) { + table.setWidget(rows, 0, new TextBox()); + table.getFlexCellFormatter().setStyleName(1, 0, "props-values"); + + table.setWidget(rows, 1, new TextBox()); + table.getFlexCellFormatter().setStyleName(1, 1, "props-values"); + + Image delete = new Image("images/delete.png"); + delete.addStyleName("pithos-invitationDeleteImg"); + delete.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + int rowIndex = table.getCellForEvent(event).getRowIndex(); + table.removeRow(rowIndex); + if (rowIndex == 1 && table.getRowCount() > 1) { + table.getCellFormatter().removeStyleName(rowIndex, 0, "pithos-invitationFormRow"); + table.getCellFormatter().removeStyleName(rowIndex, 1, "pithos-invitationFormRow"); + table.getCellFormatter().removeStyleName(rowIndex, 2, "pithos-invitationFormRow"); + } + rows--; + } + }); + table.setWidget(rows, 2, delete); + + if (rows > 1) { + table.getCellFormatter().addStyleName(rows, 0, "pithos-invitationFormRow"); + table.getCellFormatter().addStyleName(rows, 1, "pithos-invitationFormRow"); + table.getCellFormatter().addStyleName(rows, 2, "pithos-invitationFormRow"); + } + rows++; + } + + void sendInvitation(String email, final String realname) { + if (realname == null || realname.length() == 0) { + HTML msg = new HTML("Name cannot be empty"); + msg.addStyleName("pithos-invitationResponseError"); + messagesPanel.add(msg); + } + else if (email == null || email.length() == 0 || !email.contains("@") || + email.substring(email.indexOf("@")).length() < 3 || !email.substring(email.indexOf("@") + 2).contains(".")) { + HTML msg = new HTML("Invalid email"); + msg.addStyleName("pithos-invitationResponseError"); + messagesPanel.add(msg); + } + else { + PostRequest sendInvitation = new PostRequest("/im/", "", "invite", "uniq=" + email + "&realname=" + realname) { + + @Override + protected void onUnauthorized(Response response) { + app.sessionExpired(); + } + + @Override + public void onSuccess(Resource result) { + HTML msg = new HTML("Invitation to " + realname + " was sent."); + msg.addStyleName("pithos-invitationResponse"); + messagesPanel.add(msg); + } + + @Override + public void onError(Throwable t) { + GWT.log("", t); + } + }; + sendInvitation.setHeader("X-Auth-Token", app.getToken()); + Scheduler.get().scheduleDeferred(sendInvitation); + } + } + + void fillSentInvitationsTable(Invitations inv) { + sentInvitationsTable.removeAllRows(); + int row = 0; + for (int j=currentPage * INV_PER_PAGE + 0; j