From 909a27d17e09eefbfe9054e3cd3fb8e0b499d0ce Mon Sep 17 00:00:00 2001 From: Massimiliano Assante Date: Tue, 16 Apr 2013 21:49:16 +0000 Subject: [PATCH] seems working, need to implement share with people tags now git-svn-id: https://svn.research-infrastructures.eu/d4science/gcube/trunk/portlets/user/share-updates@73467 82a268e6-3cf1-43bd-a215-b396298e98cf --- .classpath | 4 +- .settings/com.google.gdt.eclipse.core.prefs | 4 +- .settings/org.eclipse.wst.common.component | 3 + pom.xml | 21 +- .../client/ShareUpdateService.java | 5 + .../client/ShareUpdateServiceAsync.java | 5 + .../client/dialog/PickUsersDialog.java | 204 ------------------ .../shareupdates/client/elements/TagBox.java | 2 +- .../client/events/PickedUserEvent.java | 31 --- .../client/events/PickedUserEventHandler.java | 7 - .../client/form/ShareUpdateForm.java | 41 ++-- .../client/form/SingleUserTemplate.java | 55 ----- .../client/form/SingleUserTemplate.ui.xml | 22 -- .../client/form/SmartTextArea.java | 64 +++++- .../server/ShareUpdateServiceImpl.java | 81 ++++++- .../user/shareupdates/shared/PickingUser.java | 54 ----- .../user/shareupdates/ShareUpdates.gwt.xml | 2 +- src/main/webapp/ShareUpdates.css | 86 +------- 18 files changed, 194 insertions(+), 497 deletions(-) delete mode 100644 src/main/java/org/gcube/portlets/user/shareupdates/client/dialog/PickUsersDialog.java delete mode 100644 src/main/java/org/gcube/portlets/user/shareupdates/client/events/PickedUserEvent.java delete mode 100644 src/main/java/org/gcube/portlets/user/shareupdates/client/events/PickedUserEventHandler.java delete mode 100644 src/main/java/org/gcube/portlets/user/shareupdates/client/form/SingleUserTemplate.java delete mode 100644 src/main/java/org/gcube/portlets/user/shareupdates/client/form/SingleUserTemplate.ui.xml delete mode 100644 src/main/java/org/gcube/portlets/user/shareupdates/shared/PickingUser.java diff --git a/.classpath b/.classpath index 0a035c7..1221d1e 100644 --- a/.classpath +++ b/.classpath @@ -1,6 +1,6 @@ - + @@ -31,5 +31,5 @@ - + diff --git a/.settings/com.google.gdt.eclipse.core.prefs b/.settings/com.google.gdt.eclipse.core.prefs index 0b3b05c..d986405 100644 --- a/.settings/com.google.gdt.eclipse.core.prefs +++ b/.settings/com.google.gdt.eclipse.core.prefs @@ -1,6 +1,6 @@ -#Thu Apr 11 19:01:38 CEST 2013 +#Tue Apr 16 18:09:11 CEST 2013 eclipse.preferences.version=1 jarsExcludedFromWebInfLib= -lastWarOutDir=/Users/massi/Documents/workspace/share-updates/target/share-updates-0.2.1-SNAPSHOT +lastWarOutDir=/Users/massi/Documents/workspace/share-updates/target/share-updates-0.3.0-SNAPSHOT warSrcDir=src/main/webapp warSrcDirIsOutput=false diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component index fe006d9..a7f437d 100644 --- a/.settings/org.eclipse.wst.common.component +++ b/.settings/org.eclipse.wst.common.component @@ -5,6 +5,9 @@ + + uses + diff --git a/pom.xml b/pom.xml index 6deb1d1..4185805 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ org.gcube.portlets.user share-updates war - 0.2.1-SNAPSHOT + 0.3.0-SNAPSHOT gCube Share Updates Portlet @@ -58,7 +58,7 @@ gwt-servlet ${gwtVersion} provided - + org.gcube.portal social-networking-library @@ -77,6 +77,11 @@ [1.4.0-SNAPSHOT, 2.0.0-SNAPSHOT) provided + + org.gcube.portlets.user + pickuser-widget + [0.1.0-SNAPSHOT, 1.0.0-SNAPSHOT) + org.gcube.portal custom-portal-handler @@ -89,6 +94,18 @@ [3.2.0-SNAPSHOT, 4.0.0-SNAPSHOT) provided + + org.gcube.portlets.user + home-library + [4.3.0-SNAPSHOT, 5.0.0-SNAPSHOT) + provided + + + org.gcube.dvos + usermanagement-core + [1.3.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + com.google gwt-jsonmaker diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/client/ShareUpdateService.java b/src/main/java/org/gcube/portlets/user/shareupdates/client/ShareUpdateService.java index d79fb9b..5260558 100644 --- a/src/main/java/org/gcube/portlets/user/shareupdates/client/ShareUpdateService.java +++ b/src/main/java/org/gcube/portlets/user/shareupdates/client/ShareUpdateService.java @@ -1,8 +1,11 @@ package org.gcube.portlets.user.shareupdates.client; +import java.util.ArrayList; + import org.gcube.portal.databook.shared.ClientFeed; import org.gcube.portal.databook.shared.FeedType; import org.gcube.portal.databook.shared.PrivacyLevel; +import org.gcube.portlets.user.pickuser.shared.PickingUser; import org.gcube.portlets.user.shareupdates.shared.LinkPreview; import org.gcube.portlets.user.shareupdates.shared.UserSettings; @@ -19,4 +22,6 @@ public interface ShareUpdateService extends RemoteService { UserSettings getUserSettings(); LinkPreview checkLink(String linkToCheck); + + ArrayList getPortalUsers(); } diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/client/ShareUpdateServiceAsync.java b/src/main/java/org/gcube/portlets/user/shareupdates/client/ShareUpdateServiceAsync.java index 5e77ec3..2facd55 100644 --- a/src/main/java/org/gcube/portlets/user/shareupdates/client/ShareUpdateServiceAsync.java +++ b/src/main/java/org/gcube/portlets/user/shareupdates/client/ShareUpdateServiceAsync.java @@ -1,8 +1,11 @@ package org.gcube.portlets.user.shareupdates.client; +import java.util.ArrayList; + import org.gcube.portal.databook.shared.ClientFeed; import org.gcube.portal.databook.shared.FeedType; import org.gcube.portal.databook.shared.PrivacyLevel; +import org.gcube.portlets.user.pickuser.shared.PickingUser; import org.gcube.portlets.user.shareupdates.shared.LinkPreview; import org.gcube.portlets.user.shareupdates.shared.UserSettings; @@ -19,4 +22,6 @@ public interface ShareUpdateServiceAsync { void checkLink(String linkToCheck, AsyncCallback callback); void getUserSettings(AsyncCallback callback); + + void getPortalUsers(AsyncCallback> callback); } diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/client/dialog/PickUsersDialog.java b/src/main/java/org/gcube/portlets/user/shareupdates/client/dialog/PickUsersDialog.java deleted file mode 100644 index 84d0498..0000000 --- a/src/main/java/org/gcube/portlets/user/shareupdates/client/dialog/PickUsersDialog.java +++ /dev/null @@ -1,204 +0,0 @@ -package org.gcube.portlets.user.shareupdates.client.dialog; - -import java.util.ArrayList; -import java.util.Date; - -import org.gcube.portal.databook.shared.Like; -import org.gcube.portlets.user.shareupdates.client.events.PickedUserEvent; -import org.gcube.portlets.user.shareupdates.client.form.SingleUserTemplate; -import org.gcube.portlets.user.shareupdates.shared.PickingUser; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.event.dom.client.KeyCodes; -import com.google.gwt.event.dom.client.KeyDownEvent; -import com.google.gwt.event.dom.client.KeyDownHandler; -import com.google.gwt.event.dom.client.MouseOutEvent; -import com.google.gwt.event.dom.client.MouseOutHandler; -import com.google.gwt.event.dom.client.MouseOverEvent; -import com.google.gwt.event.dom.client.MouseOverHandler; -import com.google.gwt.event.shared.HandlerManager; -import com.google.gwt.user.client.Event; -import com.google.gwt.user.client.ui.FocusPanel; -import com.google.gwt.user.client.ui.MultiWordSuggestOracle; -import com.google.gwt.user.client.ui.PopupPanel; -import com.google.gwt.user.client.ui.SuggestOracle.Callback; -import com.google.gwt.user.client.ui.SuggestOracle.Request; -import com.google.gwt.user.client.ui.SuggestOracle.Response; -import com.google.gwt.user.client.ui.SuggestOracle.Suggestion; -import com.google.gwt.user.client.ui.VerticalPanel; - -public class PickUsersDialog extends PopupPanel { - - public final static int ARROW_UP = 38; - public final static int ARROW_DOWN = 40; - - public final static int DELETE = KeyCodes.KEY_DELETE; - public final static int ENTER = KeyCodes.KEY_ENTER; - public final static int ESCAPE = KeyCodes.KEY_ESCAPE; - public final static int TAB = KeyCodes.KEY_TAB; - - private HandlerManager eventBus; - - private int limit = 10; - - private final MultiWordSuggestOracle oracle = new MultiWordSuggestOracle(); - - private ArrayList users = new ArrayList(); - private int displayIndexSelected; - - private FocusPanel focusPanel = new FocusPanel(); - private VerticalPanel mainPanel = new VerticalPanel(); - - //needed because is selected when it popups - private SingleUserTemplate first; - - public PickUsersDialog(HandlerManager eventBus) { - super(true, false); - this.eventBus = eventBus; - focusPanel.setWidth("525px"); - mainPanel.setWidth("525px"); - setWidth("525px"); - focusPanel.add(mainPanel); - setWidget(focusPanel); - setStyleName("pickDialog"); - - oracle.add("Massimiliano Assante"); - oracle.add("Pasquale Pagano"); - oracle.add("Leonardo Candela"); - oracle.add("Anton Ellenbroek"); - oracle.add("Ward Appeltans"); - oracle.add("Gianpaolo Coro"); - oracle.add("Federico De Faveri"); - oracle.add("Marco Pozzi"); - oracle.add("Marino Marini"); - oracle.add("Franco Zoppi"); - oracle.add("Valentina Marioli"); - oracle.add("Antonio Gioia"); - - //remove the first selected when hovering - focusPanel.addMouseOverHandler(new MouseOverHandler() { - @Override - public void onMouseOver(MouseOverEvent event) { - if (first != null) - first.removeStyleName("pickperson-selected"); - } - }); - - focusPanel.addMouseOutHandler(new MouseOutHandler() { - @Override - public void onMouseOut(MouseOutEvent event) { - select(displayIndexSelected); - } - }); - } - - /** - * called for each keyUp event from the user - * @param event - * @param x - * @param y - * @param currText - */ - public void onKeyUp(Event event, int x, int y, String currText) { - if (currText.endsWith("@")) { //the only way i found to intercept @ - setPopupPosition(x, y); - hide(); - } else if (currText.contains("@")) { - if (pickingUser(currText)) { - handleNonCharKeys(event); - } - } else if (!currText.contains("@")) - hide(); - } - - /** - * split the text and keeps listening for user keyboard events - * @param currText the text being typed - */ - private boolean pickingUser(String currText) { - String[] toSplit = currText.split("@"); //get the interesting part - if (toSplit[1].trim().length() > 0) { - showSuggestions(toSplit[1]); - return true; - } - hide(); - return false; - } - /** - * handles the nonchar events (arrows, esc, enter etc) - * @param event - */ - private void handleNonCharKeys(Event event) { - switch (event.getKeyCode()) { - case ARROW_UP: - if (displayIndexSelected > 0) - select(--displayIndexSelected); - break; - case ARROW_DOWN: - case TAB: - if (displayIndexSelected+1 < mainPanel.getWidgetCount()) - select(displayIndexSelected+1); - break; - case ESCAPE: - case DELETE: - hide(); - case ENTER: //selectd with keyboard - SingleUserTemplate ut = null; - if (mainPanel.getWidgetCount() > 0) { - if (displayIndexSelected < 0 || displayIndexSelected >= mainPanel.getWidgetCount()) //when there's only one left sometimes here i get -sth, no time to see why :) - ut = (SingleUserTemplate) mainPanel.getWidget(0); - else - ut = (SingleUserTemplate) mainPanel.getWidget(displayIndexSelected); - eventBus.fireEvent(new PickedUserEvent(new PickingUser("id", "username", ut.getFullName(), "thumb"))); - hide(); - } - break; - default: - break; - } - } - - public void showSuggestions(String query) { - if (query.length() > 0) { - oracle.requestSuggestions(new Request(query, limit), new Callback() { - public void onSuggestionsReady(Request request, Response response) { - mainPanel.clear(); - int i = 0; - for (Suggestion s : response.getSuggestions()) { - if (i == 0) { - first = getUserTemplate(new PickingUser("", "", s.getDisplayString(), ""), i); - first.addStyleName("pickperson-selected"); - mainPanel.add(first); - } - else - mainPanel.add(getUserTemplate(new PickingUser("", "", s.getDisplayString(), ""), i)); - i++; - } - if (i > 0) - show(); - } - }); - } - } - - private SingleUserTemplate getUserTemplate(PickingUser user, int displayIndex) { - return new SingleUserTemplate(this, user, displayIndex); - } - - /** - * select the user in the model and in the view - * @param displayIndex - */ - public void select(int displayIndex) { - for (int i = 0; i < mainPanel.getWidgetCount(); i++) { - SingleUserTemplate ut = (SingleUserTemplate) mainPanel.getWidget(i); - if (i == displayIndex) { - ut.addStyleName("pickperson-selected"); - displayIndexSelected = i; - //GWT.log("Selected: "+ut.getFullName()); - } - else - ut.removeStyleName("pickperson-selected"); - } - } -} diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/client/elements/TagBox.java b/src/main/java/org/gcube/portlets/user/shareupdates/client/elements/TagBox.java index d6f4d91..f14083f 100644 --- a/src/main/java/org/gcube/portlets/user/shareupdates/client/elements/TagBox.java +++ b/src/main/java/org/gcube/portlets/user/shareupdates/client/elements/TagBox.java @@ -17,7 +17,7 @@ public class TagBox extends TextBox { this.setStylePrimaryName("user-token"); getElement().setAttribute("value", text); //random heuristic, the "i" and "l" char occupies very few px :) - int iCounter = 12 - 2*(text.split("i").length + (text.split("l").length)); + int iCounter = 14 - 2*(text.split("i").length + (text.split("l").length)); setWidth((text.length()*6+iCounter)+"px"); setReadOnly(true); } diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/client/events/PickedUserEvent.java b/src/main/java/org/gcube/portlets/user/shareupdates/client/events/PickedUserEvent.java deleted file mode 100644 index 56644b4..0000000 --- a/src/main/java/org/gcube/portlets/user/shareupdates/client/events/PickedUserEvent.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.gcube.portlets.user.shareupdates.client.events; - -import org.gcube.portlets.user.shareupdates.shared.PickingUser; - -import com.google.gwt.event.shared.GwtEvent; - - - -public class PickedUserEvent extends GwtEvent { - public static Type TYPE = new Type(); - - private PickingUser user; - - - public PickingUser getSelectedUser() { - return user; - } - public PickedUserEvent(PickingUser user) { - this.user = user; - } - - @Override - public Type getAssociatedType() { - return TYPE; - } - - @Override - protected void dispatch(PickedUserEventHandler handler) { - handler.onSelectedUser(this); - } -} diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/client/events/PickedUserEventHandler.java b/src/main/java/org/gcube/portlets/user/shareupdates/client/events/PickedUserEventHandler.java deleted file mode 100644 index 4cf308f..0000000 --- a/src/main/java/org/gcube/portlets/user/shareupdates/client/events/PickedUserEventHandler.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.gcube.portlets.user.shareupdates.client.events; - -import com.google.gwt.event.shared.EventHandler; - -public interface PickedUserEventHandler extends EventHandler { - void onSelectedUser(PickedUserEvent event); -} diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/client/form/ShareUpdateForm.java b/src/main/java/org/gcube/portlets/user/shareupdates/client/form/ShareUpdateForm.java index 9adab63..69439b1 100644 --- a/src/main/java/org/gcube/portlets/user/shareupdates/client/form/ShareUpdateForm.java +++ b/src/main/java/org/gcube/portlets/user/shareupdates/client/form/ShareUpdateForm.java @@ -129,26 +129,27 @@ public class ShareUpdateForm extends Composite { @UiHandler("submitButton") void onClick(ClickEvent e) { - shareupdateService.getUserSettings(new AsyncCallback() { - public void onFailure(Throwable caught) { - Window.alert("Ops! we encountered some problems delivering your message, server is not responding, please try again in a short while."); - } - public void onSuccess(UserSettings result) { - if (result.getUserInfo().getUsername().equals("test.user")) { - Window.alert("Your session has expired, please log out and login again"); - return; - } - myUserInfo = result.getUserInfo(); - String toShare = shareTextArea.getText().trim(); - if (toShare.equals(SHARE_UPDATE_TEXT) || toShare.equals(ERROR_UPDATE_TEXT) || toShare.equals("")) { - shareTextArea.addStyleName("error"); - shareTextArea.setText(ERROR_UPDATE_TEXT); - return; - } - //then you can post - postTweet(toShare); - } - }); + Window.alert("Please wait, Implementation to be completed"); +// shareupdateService.getUserSettings(new AsyncCallback() { +// public void onFailure(Throwable caught) { +// Window.alert("Ops! we encountered some problems delivering your message, server is not responding, please try again in a short while."); +// } +// public void onSuccess(UserSettings result) { +// if (result.getUserInfo().getUsername().equals("test.user")) { +// Window.alert("Your session has expired, please log out and login again"); +// return; +// } +// myUserInfo = result.getUserInfo(); +// String toShare = shareTextArea.getText().trim(); +// if (toShare.equals(SHARE_UPDATE_TEXT) || toShare.equals(ERROR_UPDATE_TEXT) || toShare.equals("")) { +// shareTextArea.addStyleName("error"); +// shareTextArea.setText(ERROR_UPDATE_TEXT); +// return; +// } +// //then you can post +// postTweet(toShare); +// } +// }); } /** * diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/client/form/SingleUserTemplate.java b/src/main/java/org/gcube/portlets/user/shareupdates/client/form/SingleUserTemplate.java deleted file mode 100644 index ca9b83d..0000000 --- a/src/main/java/org/gcube/portlets/user/shareupdates/client/form/SingleUserTemplate.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.gcube.portlets.user.shareupdates.client.form; - -import org.gcube.portlets.user.shareupdates.client.dialog.PickUsersDialog; -import org.gcube.portlets.user.shareupdates.shared.PickingUser; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.event.dom.client.MouseOverEvent; -import com.google.gwt.uibinder.client.UiBinder; -import com.google.gwt.uibinder.client.UiField; -import com.google.gwt.uibinder.client.UiHandler; -import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.FocusPanel; -import com.google.gwt.user.client.ui.HTML; -import com.google.gwt.user.client.ui.Image; -import com.google.gwt.user.client.ui.Widget; - -public class SingleUserTemplate extends Composite { - - private static LikedTemplateUiBinder uiBinder = GWT - .create(LikedTemplateUiBinder.class); - - interface LikedTemplateUiBinder extends UiBinder { - } - PickUsersDialog owner; - private int currDisplayIndex; - - @UiField - FocusPanel focusDiv; - @UiField - Image avatarImage; - @UiField - HTML contentArea; - - public SingleUserTemplate(PickUsersDialog owner, PickingUser user, int displayIndex) { - initWidget(uiBinder.createAndBindUi(this)); - this.owner = owner; - currDisplayIndex = displayIndex; - if (user.getThumbnailURL() != null) - avatarImage.setUrl(user.getThumbnailURL()); - - avatarImage.setPixelSize(30, 30); - contentArea.setHTML(user.getFullName()); - - - } - - @UiHandler("focusDiv") - void onMouseOver(MouseOverEvent e) { - owner.select(currDisplayIndex); - } - - public String getFullName() { - return contentArea.getText(); - } -} diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/client/form/SingleUserTemplate.ui.xml b/src/main/java/org/gcube/portlets/user/shareupdates/client/form/SingleUserTemplate.ui.xml deleted file mode 100644 index f22ad8d..0000000 --- a/src/main/java/org/gcube/portlets/user/shareupdates/client/form/SingleUserTemplate.ui.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - -
-
- - - -
- -
-
- -
-
-
-
-
-
\ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/client/form/SmartTextArea.java b/src/main/java/org/gcube/portlets/user/shareupdates/client/form/SmartTextArea.java index 57cd60b..f39e7eb 100644 --- a/src/main/java/org/gcube/portlets/user/shareupdates/client/form/SmartTextArea.java +++ b/src/main/java/org/gcube/portlets/user/shareupdates/client/form/SmartTextArea.java @@ -3,12 +3,17 @@ */ package org.gcube.portlets.user.shareupdates.client.form; -import org.gcube.portlets.user.shareupdates.client.dialog.PickUsersDialog; +import java.util.ArrayList; + +import org.gcube.portlets.user.pickuser.client.dialog.PickUsersDialog; +import org.gcube.portlets.user.pickuser.client.events.PickedUserEvent; +import org.gcube.portlets.user.pickuser.client.events.PickedUserEventHandler; +import org.gcube.portlets.user.pickuser.shared.PickingUser; +import org.gcube.portlets.user.shareupdates.client.ShareUpdateService; +import org.gcube.portlets.user.shareupdates.client.ShareUpdateServiceAsync; import org.gcube.portlets.user.shareupdates.client.elements.ContentEditDiv; import org.gcube.portlets.user.shareupdates.client.elements.Span; import org.gcube.portlets.user.shareupdates.client.elements.TagBox; -import org.gcube.portlets.user.shareupdates.client.events.PickedUserEvent; -import org.gcube.portlets.user.shareupdates.client.events.PickedUserEventHandler; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.DomEvent; @@ -17,17 +22,27 @@ import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Timer; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.HTML; /** - * @author massi + * + * @author Massimiliano Assante, ISTI-CNR + * + * SmartTextArea allows pasting of links with preview generation and tagging of people * */ public class SmartTextArea extends ContentEditDiv { + /** + * Create a remote service proxy to talk to the server-side Greeting service. + */ + private final ShareUpdateServiceAsync shareupdateService = GWT + .create(ShareUpdateService.class); private final HandlerManager eventBus = new HandlerManager(null); - + public final static int ARROW_UP = 38; public final static int ARROW_DOWN = 40; - PickUsersDialog pickUserDlg = new PickUsersDialog(eventBus); + PickUsersDialog pickUserDlg; /** * */ @@ -37,6 +52,18 @@ public class SmartTextArea extends ContentEditDiv { sinkEvents(Event.ONCONTEXTMENU); sinkEvents(Event.ONKEYUP); sinkEvents(Event.ONKEYDOWN); + + shareupdateService.getPortalUsers(new AsyncCallback>() { + + @Override + public void onSuccess(ArrayList users) { + pickUserDlg = new PickUsersDialog(users, eventBus, 525); + } + + @Override + public void onFailure(Throwable caught) { + } + }); } /** @@ -55,6 +82,17 @@ public class SmartTextArea extends ContentEditDiv { } }); } + + private String extractLink(String textToCheck) { + String [] parts = textToCheck.split("\\s"); + // Attempt to convert each item into an URL. + for( String item : parts ) { + if (item.startsWith("http")) { + return item; + } + } + return null; + } /** * paste and other events overridden */ @@ -62,13 +100,19 @@ public class SmartTextArea extends ContentEditDiv { super.onBrowserEvent(event); switch (event.getTypeInt()) { case Event.ONPASTE: { - final String before = getText(); + final String before = getHTML(); GWT.log("BEFORE:" + before); Timer t = new Timer() { @Override public void run() { - String toCheck = getText().replaceAll(before, ""); - ShareUpdateForm.get().checkLink(toCheck); + String toCheck = extractLink(getText()); + if (toCheck != null) { + GWT.log("toCheck1:" + toCheck); + ShareUpdateForm.get().checkLink(new HTML(toCheck).getText()); + String sanitized = before + toCheck; + setHTML(sanitized); + setEndOfContenteditable(); + } } }; t.schedule(100); @@ -79,7 +123,7 @@ public class SmartTextArea extends ContentEditDiv { break; } case Event.ONKEYUP: { - pickUserDlg.onKeyUp(event, this.getAbsoluteLeft(), this.getAbsoluteTop()+65, getText()); + pickUserDlg.onKeyUp(event.getKeyCode(), this.getAbsoluteLeft(), this.getAbsoluteTop()+65, getText()); break; } case Event.ONKEYDOWN: { //avoid the arrow up to move the cursor at the beginning of the textbox and the TAB to move around inputs and enter to go newline diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/server/ShareUpdateServiceImpl.java b/src/main/java/org/gcube/portlets/user/shareupdates/server/ShareUpdateServiceImpl.java index 74ef431..0f17e17 100644 --- a/src/main/java/org/gcube/portlets/user/shareupdates/server/ShareUpdateServiceImpl.java +++ b/src/main/java/org/gcube/portlets/user/shareupdates/server/ShareUpdateServiceImpl.java @@ -30,14 +30,25 @@ import org.gcube.portal.databook.shared.FeedType; import org.gcube.portal.databook.shared.PrivacyLevel; import org.gcube.portal.databook.shared.UserInfo; import org.gcube.portal.databook.shared.ex.FeedIDNotFoundException; +import org.gcube.portlets.user.homelibrary.home.HomeLibrary; +import org.gcube.portlets.user.homelibrary.home.User; +import org.gcube.portlets.user.homelibrary.home.exceptions.HomeNotFoundException; +import org.gcube.portlets.user.homelibrary.home.exceptions.InternalErrorException; +import org.gcube.portlets.user.homelibrary.home.workspace.Workspace; +import org.gcube.portlets.user.homelibrary.home.workspace.exceptions.WorkspaceFolderNotFoundException; +import org.gcube.portlets.user.pickuser.shared.PickingUser; import org.gcube.portlets.user.shareupdates.client.ShareUpdateService; import org.gcube.portlets.user.shareupdates.server.metaseeker.MetaSeeker; import org.gcube.portlets.user.shareupdates.server.opengraph.OpenGraph; import org.gcube.portlets.user.shareupdates.shared.LinkPreview; import org.gcube.portlets.user.shareupdates.shared.UserSettings; import org.gcube.vomanagement.usermanagement.GroupManager; +import org.gcube.vomanagement.usermanagement.UserManager; +import org.gcube.vomanagement.usermanagement.exception.UserManagementPortalException; import org.gcube.vomanagement.usermanagement.impl.liferay.LiferayGroupManager; +import org.gcube.vomanagement.usermanagement.impl.liferay.LiferayUserManager; import org.gcube.vomanagement.usermanagement.model.GroupModel; +import org.gcube.vomanagement.usermanagement.model.UserModel; import org.htmlparser.beans.StringBean; import org.w3c.dom.Document; import org.w3c.dom.NodeList; @@ -49,8 +60,6 @@ import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.kernel.util.WebKeys; import com.liferay.portal.model.Organization; import com.liferay.portal.model.Role; -import com.liferay.portal.model.User; -import com.liferay.portal.model.UserModel; import com.liferay.portal.service.OrganizationLocalServiceUtil; import com.liferay.portal.service.UserLocalServiceUtil; import com.liferay.portal.theme.ThemeDisplay; @@ -228,7 +237,7 @@ public class ShareUpdateServiceImpl extends RemoteServiceServlet implements Shar if (withinPortal) { getUserVREs(username); - UserModel user = UserLocalServiceUtil.getUserByScreenName(OrganizationsUtil.getCompany().getCompanyId(), username); + com.liferay.portal.model.UserModel user = UserLocalServiceUtil.getUserByScreenName(OrganizationsUtil.getCompany().getCompanyId(), username); thumbnailURL = "/image/user_male_portrait?img_id="+user.getPortraitId(); fullName = user.getFirstName() + " " + user.getLastName(); email = user.getEmailAddress(); @@ -285,7 +294,7 @@ public class ShareUpdateServiceImpl extends RemoteServiceServlet implements Shar * @throws PortalException */ private boolean isAdmin() throws PortalException, SystemException { - User currUser = OrganizationsUtil.validateUser(getASLSession().getUsername()); + com.liferay.portal.model.User currUser = OrganizationsUtil.validateUser(getASLSession().getUsername()); List organizations = OrganizationLocalServiceUtil.getOrganizations(0, OrganizationLocalServiceUtil.getOrganizationsCount()); Organization rootOrganization = null; for (Organization organization : organizations) { @@ -312,7 +321,7 @@ public class ShareUpdateServiceImpl extends RemoteServiceServlet implements Shar * @return * @throws SystemException */ - private boolean hasRole(String rolename, String organizationName, User user) throws SystemException { + private boolean hasRole(String rolename, String organizationName, com.liferay.portal.model.User user) throws SystemException { for (Role role : user.getRoles()) if (role.getName().compareTo(rolename) == 0 ) return true; @@ -325,7 +334,7 @@ public class ShareUpdateServiceImpl extends RemoteServiceServlet implements Shar */ private ArrayList getUserVREs(String username) { ArrayList toReturn = new ArrayList(); - User currUser; + com.liferay.portal.model.User currUser; try { GroupManager gm = new LiferayGroupManager(); currUser = OrganizationsUtil.validateUser(username); @@ -587,4 +596,64 @@ public class ShareUpdateServiceImpl extends RemoteServiceServlet implements Shar private boolean isInfrastructureScope() { return getASLSession().getScope().isInfrastructure(); } + + @Override + public ArrayList getPortalUsers() { + ArrayList portalUsers = new ArrayList(); + try { + if (withinPortal) { + UserManager um = new LiferayUserManager(); + Workspace workspace = getWorkspace(); + List users = workspace.getHome().getHomeManager().getUsers(); + for (User user : users) { + _log.trace("Trying to get additional info for "+user.getPortalLogin()); + if (user.getPortalLogin().compareTo("test.user") != 0) { //skip test.user + UserModel curr = null; + String thumbnailURL = ""; + try { + curr = um.getUserByScreenName(user.getPortalLogin()); + com.liferay.portal.model.UserModel lifeUser = UserLocalServiceUtil.getUserByScreenName(OrganizationsUtil.getCompany().getCompanyId(), user.getPortalLogin()); + thumbnailURL = "/image/user_male_portrait?img_id="+lifeUser.getPortraitId(); + } catch (UserManagementPortalException ume) { + _log.error("Error while getUserByScreenName for " + user.getPortalLogin()); + portalUsers.add(new PickingUser(user.getId(), user.getPortalLogin(), user.getPortalLogin(), "unknown image")); + } + if (curr != null) + portalUsers.add(new PickingUser(user.getId(), curr.getScreenName(), curr.getFullname(), thumbnailURL)); + + + } + } + } + else { //test users + portalUsers.add(new PickingUser("11111", "massimiliano.assante", "Massimiliano Assante", "image")); + portalUsers.add(new PickingUser("11111", "massimiliano.assante", "Massimiliano Pazzante", "image")); + portalUsers.add(new PickingUser("11111", "massimiliano.assante", "Massimiliano Ruzzante", "image")); + portalUsers.add(new PickingUser("11111", "massimiliano.assante", "Massimiliano Cantante", "image")); + portalUsers.add(new PickingUser("11111", "massimiliano.assante", "Massimiliano Ballerino", "image")); + portalUsers.add(new PickingUser("11111", "massimiliano.assante", "Massimiliano Violante", "image")); + portalUsers.add(new PickingUser("11111", "giogio.giorgi", "Giorgio Giorgietti", "image")); + portalUsers.add(new PickingUser("2222", "pino.pinetti", "Pino Dall'ara", "image")); + portalUsers.add(new PickingUser("11333111", "rino.gattuso", "Rino Gattuso", "image")); + portalUsers.add(new PickingUser("114444111", "alex.delpiero", "Alessandro Del Piero", "image")); + portalUsers.add(new PickingUser("3462", "sandro.nesta", "Alessandro Nesta", "image")); + portalUsers.add(new PickingUser("11464321", "samsung.mobile", "Samsung Mobile", "image")); + } + } catch (Exception e) { + _log.error("Error in server get all contacts ", e); + } + return portalUsers; + } + /** + * + * @return the workspace instance + * @throws InternalErrorException + * @throws HomeNotFoundException + * @throws WorkspaceFolderNotFoundException + */ + private Workspace getWorkspace() throws InternalErrorException, HomeNotFoundException, WorkspaceFolderNotFoundException { + final ASLSession session = getASLSession(); + Workspace workspace = HomeLibrary.getUserWorkspace(session); + return workspace; + } } diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/shared/PickingUser.java b/src/main/java/org/gcube/portlets/user/shareupdates/shared/PickingUser.java deleted file mode 100644 index c0a6f8e..0000000 --- a/src/main/java/org/gcube/portlets/user/shareupdates/shared/PickingUser.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.gcube.portlets.user.shareupdates.shared; - -import java.io.Serializable; - -@SuppressWarnings("serial") -public class PickingUser implements Serializable { - private String id; - private String username; - private String fullName; - private String thumbnailURL; - - public PickingUser() { - super(); - } - public PickingUser(String id, String username, String fullName, String thumbnailURL) { - super(); - this.id = id; - this.username = username; - this.fullName = fullName; - this.thumbnailURL = thumbnailURL; - } - public String getId() { - return id; - } - public void setId(String id) { - this.id = id; - } - public String getUsername() { - return username; - } - public void setUsername(String username) { - this.username = username; - } - public String getFullName() { - return fullName; - } - public void setFullName(String fullName) { - this.fullName = fullName; - } - - public String getThumbnailURL() { - return thumbnailURL; - } - public void setThumbnailURL(String thumbnailURL) { - this.thumbnailURL = thumbnailURL; - } - @Override - public String toString() { - return "PickingUser [id=" + id + ", username=" + username - + ", fullName=" + fullName + ", thumbnailURL=" + thumbnailURL - + "]"; - } - -} diff --git a/src/main/resources/org/gcube/portlets/user/shareupdates/ShareUpdates.gwt.xml b/src/main/resources/org/gcube/portlets/user/shareupdates/ShareUpdates.gwt.xml index d3ff540..4872966 100644 --- a/src/main/resources/org/gcube/portlets/user/shareupdates/ShareUpdates.gwt.xml +++ b/src/main/resources/org/gcube/portlets/user/shareupdates/ShareUpdates.gwt.xml @@ -18,7 +18,7 @@ - + diff --git a/src/main/webapp/ShareUpdates.css b/src/main/webapp/ShareUpdates.css index 158429f..aa194c1 100644 --- a/src/main/webapp/ShareUpdates.css +++ b/src/main/webapp/ShareUpdates.css @@ -142,6 +142,7 @@ a.link:hover { -webkit-border-radius: 4px; border-radius: 4px; letter-spacing: normal; + overflow: hidden; } .dark-color { @@ -186,89 +187,14 @@ a.link:hover { -webkit-transition: background .45s ease-in-out; } +/* smart textarea */ -/* Pick User Dialog part */ - -.pickDialog { - border: 1px solid #333; - background-color: #FFF; -} - -.pick-label { - font-family: 'Helvetica Neue', Arial, sans-serif; - font-size: 15x; - line-height: 18px; - color: inherit; -} - - -.pickperson { - color: #0B61A4; - cursor: pointer; - cursor: hand; - background: #FFF; - - -webkit-transition: background-color .25s ease-in-out; - -moz-transition: background-color .25s ease-in-out; - -o-transition: background-color .25s ease-in-out; - transition: background-color .25s ease-in-out; -} - -.pickperson-selected { - background-color: #033E6B; - color: whitesmoke; -} - -.pickperson:active,.pickperson:focus,.pickperson:hover { - background-color: #033E6B; - color: whitesmoke; -} - -.pickperson-photo { - display: block; - padding: 2px; - border: 1px solid #E6E6E6; - margin-left: 2px; -} - -.user-table { - margin: 1px 0px; - display: table; - width: 100%; - background-clip: border-box; - background-image: none; - background-origin: padding-box; -} - -.user-table-row { - display: table-row; - text-align: left; -} - -.user-table-col { - display: table-cell; - text-align: left; -} - -.user-table-col.content { - padding: 10px 0px 0px 10px; - vertical-align: top; -} - -.user-table-col.smallphoto { - width: 40px; -} - -.user-token { - margin: 3px; - height: auto !important; - padding: 1px 3px; - background-color: #E2E6F0 !important; - border: 1px solid #9DACCC; - color: #1C2A47; - cursor: default; +#mycontentEditableElement input[type="text"] { font-family: verdana, arial, sans-serif; font-size: 11px; + padding: 1px 3px; + color: #1C2A47; + border: 1px solid #9DACCC; border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;