partially implemented
git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/user/social-profile@79311 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
parent
8fe9beb56f
commit
9e33972e5e
1
pom.xml
1
pom.xml
|
@ -63,6 +63,7 @@
|
|||
<version>[1.4.0,1.6.0]</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.gcube.portlets.user</groupId>
|
||||
<artifactId>gcube-widgets</artifactId>
|
||||
|
|
|
@ -11,4 +11,8 @@ import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
|
|||
@RemoteServiceRelativePath("socialService")
|
||||
public interface SocialService extends RemoteService {
|
||||
UserContext getUserContext(String userid);
|
||||
|
||||
Boolean saveHeadline(String newHeadline);
|
||||
|
||||
Boolean saveIsti(String institution);
|
||||
}
|
||||
|
|
|
@ -8,4 +8,8 @@ public interface SocialServiceAsync {
|
|||
|
||||
void getUserContext(String userid, AsyncCallback<UserContext> callback);
|
||||
|
||||
void saveHeadline(String newHeadline, AsyncCallback<Boolean> callback);
|
||||
|
||||
void saveIsti(String institution, AsyncCallback<Boolean> callback);
|
||||
|
||||
}
|
||||
|
|
|
@ -6,17 +6,25 @@ import org.gcube.portlets.user.socialprofile.client.SocialServiceAsync;
|
|||
import org.gcube.portlets.user.socialprofile.shared.UserContext;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
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.uibinder.client.UiBinder;
|
||||
import com.google.gwt.uibinder.client.UiField;
|
||||
import com.google.gwt.user.client.Window;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.Button;
|
||||
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.Image;
|
||||
import com.google.gwt.user.client.ui.TextBox;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
|
||||
public class DisplayProfile extends Composite {
|
||||
protected final static String HEADLINE_TEXT = "Professional Headline";
|
||||
protected final static String HEADLINE_ERROR = "Your Headline please";
|
||||
protected final static String ISTI_TEXT = "Company";
|
||||
|
||||
private static DisplayProfileUiBinder uiBinder = GWT
|
||||
.create(DisplayProfileUiBinder.class);
|
||||
|
@ -25,14 +33,25 @@ public class DisplayProfile extends Composite {
|
|||
}
|
||||
public static final String avatar_default = GWT.getModuleBaseURL() + "../images/Avatar_default.png";
|
||||
public static final String loading = GWT.getModuleBaseURL() + "../images/avatarLoader.gif";
|
||||
public static final String savingImage = GWT.getModuleBaseURL() + "../images/saving.gif";
|
||||
public static final String GET_OID_PARAMETER = "oid";
|
||||
private final SocialServiceAsync socialService = GWT.create(SocialService.class);
|
||||
|
||||
@UiField HTMLPanel mainPanel;
|
||||
@UiField Image avatarImage;
|
||||
@UiField HTML userFullName;
|
||||
@UiField HTML headline;
|
||||
@UiField HTML institution;
|
||||
@UiField TextBox headline;
|
||||
@UiField TextBox institution;
|
||||
|
||||
@UiField HTML editHeadline;
|
||||
@UiField HTML editIsti;
|
||||
|
||||
@UiField Image savingHeadline;
|
||||
@UiField Button saveHead;
|
||||
@UiField Button cancelHead;
|
||||
@UiField Button messageButton;
|
||||
|
||||
private String currHeadLine;
|
||||
|
||||
private UserInfo myUserInfo;
|
||||
|
||||
|
@ -40,9 +59,8 @@ public class DisplayProfile extends Composite {
|
|||
initWidget(uiBinder.createAndBindUi(this));
|
||||
avatarImage.setUrl(loading);
|
||||
mainPanel.addStyleName("framed");
|
||||
|
||||
if (getUserToShowId() == null) { //its him seeing himself
|
||||
socialService.getUserContext(null, new AsyncCallback<UserContext>() {
|
||||
savingHeadline.setUrl(savingImage);
|
||||
socialService.getUserContext(getUserToShowId(), new AsyncCallback<UserContext>() {
|
||||
@Override
|
||||
public void onSuccess(UserContext result) {
|
||||
myUserInfo = result.getUserInfo();
|
||||
|
@ -50,8 +68,42 @@ public class DisplayProfile extends Composite {
|
|||
avatarImage.setSize("100px", "100px");
|
||||
avatarImage.setUrl(myUserInfo.getAvatarId());
|
||||
userFullName.setText(myUserInfo.getFullName());
|
||||
headline.setText(result.getHeadline());
|
||||
institution.setText(result.getInstitution());
|
||||
|
||||
if (getUserToShowId() == null) { //its him seeing his profile
|
||||
|
||||
String head = (result.getHeadline() == null || result.getHeadline().compareTo("") == 0) ? HEADLINE_TEXT : result.getHeadline();
|
||||
String isti = (result.getInstitution() == null ||result.getInstitution().compareTo("") == 0) ? ISTI_TEXT : result.getInstitution();
|
||||
headline.setText(head);
|
||||
institution.setText(isti);
|
||||
|
||||
editHeadline.setStyleName("editImage");
|
||||
editHeadline.setTitle("Edit your Professional Headline");
|
||||
headline.setMaxLength(35);
|
||||
|
||||
editIsti.setStyleName("editImage");
|
||||
editIsti.setTitle("Edit your Company");
|
||||
|
||||
messageButton.removeFromParent();
|
||||
currHeadLine = head;
|
||||
if (result.getHeadline() == null || result.getHeadline().compareTo("") == 0) {
|
||||
headline.getElement().getStyle().setOpacity(0.5);
|
||||
institution.getElement().getStyle().setOpacity(0.5);
|
||||
headline.getElement().getStyle().setWidth(270, Unit.PX);
|
||||
institution.getElement().getStyle().setWidth(270, Unit.PX);
|
||||
}
|
||||
} else { //its someone else
|
||||
String head = (result.getHeadline() == null || result.getHeadline().compareTo("") == 0) ? "" : result.getHeadline();
|
||||
String isti = (result.getInstitution() == null || result.getInstitution().compareTo("") == 0) ? "" : result.getInstitution();
|
||||
headline.setText(head);
|
||||
institution.setText(isti);
|
||||
|
||||
avatarImage.getElement().getParentElement().setAttribute("href", "");
|
||||
avatarImage.setTitle(myUserInfo.getFullName());
|
||||
messageButton.setText("Private Message");
|
||||
messageButton.setVisible(true);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
|
@ -60,10 +112,68 @@ public class DisplayProfile extends Composite {
|
|||
avatarImage.setUrl(avatar_default);
|
||||
}
|
||||
});
|
||||
|
||||
editHeadline.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
headline.addStyleName("edit");
|
||||
headline.setReadOnly(false);
|
||||
headline.setFocus(true);
|
||||
headline.selectAll();
|
||||
editHeadline.setVisible(false);
|
||||
saveHead.setVisible(true);
|
||||
cancelHead.setVisible(true);
|
||||
}
|
||||
});
|
||||
|
||||
saveHead.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
String toShare = escapeHtml(headline.getText());
|
||||
if (toShare.equals("") || toShare.equals(HEADLINE_TEXT) || toShare.equals(HEADLINE_ERROR)) {
|
||||
headline.setText(HEADLINE_ERROR);
|
||||
} else {
|
||||
currHeadLine = toShare;
|
||||
saveHead.setVisible(false);
|
||||
cancelHead.setVisible(false);
|
||||
savingHeadline.setVisible(true);
|
||||
headline.setReadOnly(true);
|
||||
socialService.saveHeadline(currHeadLine, new AsyncCallback<Boolean>() {
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
Window.alert("Sorry, an error occurred");
|
||||
cancelHeadline();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(Boolean result) {
|
||||
headline.removeStyleName("edit");
|
||||
editHeadline.setVisible(true);
|
||||
headline.getElement().getStyle().setOpacity(1.0);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
cancelHead.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
cancelHeadline();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void cancelHeadline() {
|
||||
headline.removeStyleName("edit");
|
||||
headline.setReadOnly(true);
|
||||
editHeadline.setVisible(true);
|
||||
saveHead.setVisible(false);
|
||||
cancelHead.setVisible(false);
|
||||
headline.setText(currHeadLine);
|
||||
}
|
||||
/**
|
||||
* check if it has to show just one feed
|
||||
* @return
|
||||
|
@ -71,4 +181,19 @@ public class DisplayProfile extends Composite {
|
|||
private String getUserToShowId() {
|
||||
return Window.Location.getParameter(GET_OID_PARAMETER);
|
||||
}
|
||||
|
||||
/**
|
||||
* Escape an html string. Escaping data received from the client helps to
|
||||
* prevent cross-site script vulnerabilities.
|
||||
*
|
||||
* @param html the html string to escape
|
||||
* @return the escaped string
|
||||
*/
|
||||
private String escapeHtml(String html) {
|
||||
if (html == null) {
|
||||
return null;
|
||||
}
|
||||
return html.replaceAll("&", "&").replaceAll("<", "<")
|
||||
.replaceAll(">", ">");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,11 +11,38 @@
|
|||
</a>
|
||||
</td>
|
||||
|
||||
<td width="350px;" valign="top">
|
||||
<td width="420px;" valign="top">
|
||||
<div class="user-details">
|
||||
<g:HTML styleName="full-name" ui:field="userFullName"></g:HTML>
|
||||
<g:HTML styleName="headline" ui:field="headline"></g:HTML>
|
||||
<g:HTML styleName="institution" ui:field="institution"></g:HTML>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<g:TextBox styleName="headline" ui:field="headline"
|
||||
readOnly="true"></g:TextBox>
|
||||
</td>
|
||||
<td style="width:200px">
|
||||
<g:Button ui:field="saveHead" visible="false">Save</g:Button>
|
||||
<g:Button ui:field="cancelHead" visible="false">Cancel</g:Button>
|
||||
<g:HTML height="15px" width="15px" ui:field="editHeadline"></g:HTML>
|
||||
<g:Image height="16px" width="16px" visible="false" ui:field="savingHeadline"></g:Image>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<g:TextBox styleName="institution" ui:field="institution"
|
||||
readOnly="true"></g:TextBox>
|
||||
</td>
|
||||
<td>
|
||||
<g:HTML height="15px" width="15px" ui:field="editIsti"></g:HTML>
|
||||
|
||||
</td>
|
||||
|
||||
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="user-details">
|
||||
<g:Button ui:field="messageButton" visible="false"></g:Button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
|
|
@ -10,6 +10,11 @@ import org.gcube.portal.custom.scopemanager.scopehelper.ScopeHelper;
|
|||
import org.gcube.portal.databook.shared.UserInfo;
|
||||
import org.gcube.portlets.user.socialprofile.client.SocialService;
|
||||
import org.gcube.portlets.user.socialprofile.shared.UserContext;
|
||||
import org.gcube.vomanagement.usermanagement.UserManager;
|
||||
import org.gcube.vomanagement.usermanagement.exception.UserManagementPortalException;
|
||||
import org.gcube.vomanagement.usermanagement.exception.UserManagementSystemException;
|
||||
import org.gcube.vomanagement.usermanagement.exception.UserRetrievalFault;
|
||||
import org.gcube.vomanagement.usermanagement.impl.liferay.LiferayUserManager;
|
||||
|
||||
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
|
||||
import com.liferay.portal.kernel.exception.PortalException;
|
||||
|
@ -64,8 +69,38 @@ public class SocialServiceImpl extends RemoteServiceServlet implements SocialSer
|
|||
else {
|
||||
System.out.println("Reading Profile");
|
||||
_log.info(userid + " Reading Profile");
|
||||
return getUserProfile(userid);
|
||||
}
|
||||
}
|
||||
|
||||
private UserContext getUserProfile(String username) {
|
||||
ASLSession session = getASLSession();
|
||||
String email = username+"@isti.cnr.it";
|
||||
String fullName = username+" FULL";
|
||||
String thumbnailURL = "images/Avatar_default.png";
|
||||
if (withinPortal) {
|
||||
try {
|
||||
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();
|
||||
HashMap<String, String> vreNames = new HashMap<String, String>();
|
||||
UserInfo userInfo = new UserInfo(username, fullName, thumbnailURL, user.getEmailAddress(), "", true, false, vreNames);
|
||||
return new UserContext(userInfo, getHeadline(username), getInstitution(username), session.getScopeName(), true);
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return new UserContext();
|
||||
}
|
||||
} else {
|
||||
_log.info("Returning test USER");
|
||||
HashMap<String, String> fakeVreNames = new HashMap<String, String>();
|
||||
fakeVreNames.put("/gcube/devsec/devVRE","devVRE");
|
||||
//fakeVreNames.put("/gcube/devNext/NexNext","NexNext");
|
||||
|
||||
UserInfo user = new UserInfo(username, username+ "FULL", thumbnailURL, email, "fakeAccountUrl", true, false, fakeVreNames);
|
||||
return new UserContext(user, null, "Institution", session.getScopeName(), true);
|
||||
}
|
||||
}
|
||||
|
||||
private UserContext getOwnProfile() {
|
||||
|
@ -96,7 +131,7 @@ public class SocialServiceImpl extends RemoteServiceServlet implements SocialSer
|
|||
//fakeVreNames.put("/gcube/devNext/NexNext","NexNext");
|
||||
|
||||
UserInfo user = new UserInfo(getASLSession().getUsername(), fullName, thumbnailURL, email, "fakeAccountUrl", true, false, fakeVreNames);
|
||||
return new UserContext(user, "headline", "Institution", session.getScopeName(), true);
|
||||
return new UserContext(user, "", "", session.getScopeName(), true);
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
|
@ -114,4 +149,47 @@ public class SocialServiceImpl extends RemoteServiceServlet implements SocialSer
|
|||
User user = OrganizationsUtil.validateUser(userid);
|
||||
return user.getComments();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean saveHeadline(String newHeadline) {
|
||||
com.liferay.portal.model.User user;
|
||||
try {
|
||||
user = UserLocalServiceUtil.getUserByScreenName(OrganizationsUtil.getCompany().getCompanyId(), getASLSession().getUsername());
|
||||
user.setJobTitle(escapeHtml(newHeadline));
|
||||
return (UserLocalServiceUtil.updateUser(user) != null);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
@Override
|
||||
public Boolean saveIsti(String institution) {
|
||||
com.liferay.portal.model.User user;
|
||||
try {
|
||||
user = UserLocalServiceUtil.getUserByScreenName(OrganizationsUtil.getCompany().getCompanyId(), getASLSession().getUsername());
|
||||
user.setComments(escapeHtml(institution));
|
||||
return (UserLocalServiceUtil.updateUser(user) != null);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Escape an html string. Escaping data received from the client helps to
|
||||
* prevent cross-site script vulnerabilities.
|
||||
*
|
||||
* @param html the html string to escape
|
||||
* @return the escaped string
|
||||
*/
|
||||
private String escapeHtml(String html) {
|
||||
if (html == null) {
|
||||
return null;
|
||||
}
|
||||
return html.replaceAll("&", "&").replaceAll("<", "<")
|
||||
.replaceAll(">", ">");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -4,8 +4,6 @@
|
|||
<inherits name='com.google.gwt.user.User' />
|
||||
<!-- To Comment out -->
|
||||
<set-property name="user.agent" value="gecko1_8" />
|
||||
|
||||
|
||||
<!-- Other module inherits -->
|
||||
<!-- inherits GCUBE Widgets -->
|
||||
<inherits name='org.gcube.portlets.user.gcubewidgets.WidgetFactory' />
|
||||
|
|
|
@ -23,14 +23,42 @@
|
|||
font-weight: bold;
|
||||
}
|
||||
|
||||
.edit {
|
||||
border: 1px solid #999 !important;
|
||||
cursor: text !important;
|
||||
opacity: 1.0 !important;
|
||||
}
|
||||
|
||||
.headline {
|
||||
font-family: Helvetica, Arial, sans-serif;
|
||||
font-size: 16px;
|
||||
color: #444444;
|
||||
border: 0;
|
||||
cursor: default;
|
||||
width: 250px;
|
||||
}
|
||||
|
||||
.institution {
|
||||
font-family: Helvetica, Arial, sans-serif;
|
||||
font-size: 12px;
|
||||
font-size: 16px;
|
||||
color: #444444;
|
||||
border: 0;
|
||||
cursor: default;
|
||||
width: 250px;
|
||||
}
|
||||
|
||||
.editImage {
|
||||
background: url(images/edit.png) 0px 0px no-repeat;
|
||||
height: 15px;
|
||||
width: 15px;
|
||||
}
|
||||
|
||||
.editImage:hover {
|
||||
background: url(images/edit.png) 0px -16px no-repeat;
|
||||
cursor: pointer;
|
||||
cursor: hand;
|
||||
}
|
||||
|
||||
.editImage:active {
|
||||
background: url(images/edit.png) 0px -32px no-repeat;
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 301 B |
Binary file not shown.
After Width: | Height: | Size: 4.3 KiB |
Loading…
Reference in New Issue