/* * Copyright (c) 2010 Lockheed Martin Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.eurekastreams.web.client.ui.pages.profile.tabs; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.eurekastreams.server.domain.BackgroundItem; import org.eurekastreams.server.domain.BackgroundItemType; import org.eurekastreams.server.domain.Enrollment; import org.eurekastreams.server.domain.Job; import org.eurekastreams.server.domain.Page; import org.eurekastreams.server.search.modelview.PersonModelView; import org.eurekastreams.web.client.events.Observer; import org.eurekastreams.web.client.events.data.GotPersonalEducationResponseEvent; import org.eurekastreams.web.client.events.data.GotPersonalEmploymentResponseEvent; import org.eurekastreams.web.client.history.CreateUrlRequest; import org.eurekastreams.web.client.model.PersonalEducationModel; import org.eurekastreams.web.client.model.PersonalEmploymentModel; import org.eurekastreams.web.client.ui.Session; import org.eurekastreams.web.client.ui.pages.master.StaticResourceBundle; import org.eurekastreams.web.client.ui.pages.profile.settings.EducationPanel; import org.eurekastreams.web.client.ui.pages.profile.settings.EmploymentPanel; import org.eurekastreams.web.client.ui.pages.profile.widgets.BackgroundItemLinksPanel; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.NodeList; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.Hyperlink; import com.google.gwt.user.client.ui.Panel; /** * Panel used on the About tab of a personal profile to display information about the given user. */ public class PersonalProfileAboutTabPanel extends ProfileAboutTabPanel { /** * Constructor. * * @param person * Person whose data to display. */ public PersonalProfileAboutTabPanel(final PersonModelView person) { final HashMap<String, String> workHistoryTabURL = new HashMap<String, String>(); workHistoryTabURL.put("tab", "Work History & Education"); final HashMap<String, String> basicInfoTabURL = new HashMap<String, String>(); basicInfoTabURL.put("tab", "Basic Info"); final Panel biographyPanel = createTitledPanel("Biography"); final Panel interestsPanel = createTitledPanel("Interests"); final Panel workHistoryPanel = createTitledPanel("Work History"); final Panel educationPanel = createTitledPanel("Education"); final String currentViewerAccountId = Session.getInstance().getCurrentPerson().getAccountId(); addLeft(biographyPanel); addRight(interestsPanel); addRight(workHistoryPanel); addRight(educationPanel); if (person.getBiography() == null || stripHTML(person.getBiography()).trim().length() < 1) { if (currentViewerAccountId == person.getAccountId()) { CreateUrlRequest target = new CreateUrlRequest(Page.PERSONAL_SETTINGS, Session.getInstance() .getCurrentPerson().getAccountId()); target.setParameters(workHistoryTabURL); biographyPanel.add(new Hyperlink("Add a biography.", Session.getInstance().generateUrl(target))); } else { biographyPanel.add(new HTML("A biography has not been added.")); } } else { HTML bio = new HTML(person.getBiography()); bio.addStyleName(StaticResourceBundle.INSTANCE.coreCss().profileAboutBiography()); biographyPanel.add(bio); // force URLs to absolute NodeList<Element> links = bio.getElement().getElementsByTagName("a"); if (links.getLength() > 0) { for (int i = 0; i < links.getLength(); i++) { Element link = links.getItem(i); String href = link.getAttribute("href"); if (!href.isEmpty() && isRelativeUrl(href)) { link.setAttribute("href", "http://" + href); } } } } List<String> interests = person.getInterests(); if (interests == null || interests.isEmpty()) { if (currentViewerAccountId == person.getAccountId()) { CreateUrlRequest target = new CreateUrlRequest(Page.PERSONAL_SETTINGS, Session.getInstance() .getCurrentPerson().getAccountId()); target.setParameters(basicInfoTabURL); interestsPanel.add(new Hyperlink("Add a list of your interests.", Session.getInstance().generateUrl( target))); } else { interestsPanel.add(new HTML("Interests have not been added.")); } } else { // TODO: keep sending this as a list of background items - will be changed to a list of Strings List<BackgroundItem> bgitems = new ArrayList<BackgroundItem>(); for (String interest : interests) { bgitems.add(new BackgroundItem(interest, BackgroundItemType.NOT_SET)); } interestsPanel.add(new BackgroundItemLinksPanel("interests or hobbies", bgitems)); } Session.getInstance().getEventBus().addObserver(GotPersonalEmploymentResponseEvent.class, new Observer<GotPersonalEmploymentResponseEvent>() { public void update(final GotPersonalEmploymentResponseEvent event) { Session.getInstance().getEventBus().removeObserver(GotPersonalEmploymentResponseEvent.class, this); if (event.getResponse().isEmpty()) { if (currentViewerAccountId == person.getAccountId()) { CreateUrlRequest target = new CreateUrlRequest(Page.PERSONAL_SETTINGS, Session .getInstance().getCurrentPerson().getAccountId()); target.setParameters(workHistoryTabURL); workHistoryPanel.add(new Hyperlink("Add your work history.", Session.getInstance() .generateUrl(target))); } else { workHistoryPanel.add(new HTML("Work history has not been added.")); } } else { for (Job job : event.getResponse()) { workHistoryPanel.add(new EmploymentPanel(job, true)); } } } }); Session.getInstance().getEventBus().addObserver(GotPersonalEducationResponseEvent.class, new Observer<GotPersonalEducationResponseEvent>() { public void update(final GotPersonalEducationResponseEvent event) { Session.getInstance().getEventBus().removeObserver(GotPersonalEducationResponseEvent.class, this); if (event.getResponse().isEmpty()) { if (currentViewerAccountId == person.getAccountId()) { CreateUrlRequest target = new CreateUrlRequest(Page.PERSONAL_SETTINGS, Session .getInstance().getCurrentPerson().getAccountId()); target.setParameters(workHistoryTabURL); educationPanel.add(new Hyperlink("Add your educational background.", Session .getInstance().generateUrl(target))); } else { educationPanel.add(new HTML("Education has not been added.")); } } else { for (Enrollment enrollment : event.getResponse()) { educationPanel.add(new EducationPanel(enrollment, true)); } } } }); PersonalEmploymentModel.getInstance().fetch(person.getId(), false); PersonalEducationModel.getInstance().fetch(person.getId(), false); } /** * strips html out of String. * * @param htmlString * the string to strip. * @return a stripped string. */ private String stripHTML(final String htmlString) { String stripHTML = "<\\/?\\w+((\\s+(\\w|\\w[\\w-]*\\w)" + "(\\s*=\\s*(?:\\\".*?\\\"|\'.*?\'|[^\'\\\">\\s]+))?)+\\s*|\\s*)\\/?>"; String nohtml = htmlString.replaceAll(stripHTML, ""); nohtml = nohtml.replaceAll(" ", ""); return nohtml; } /** * Checks if the URL is relative (and thus needs to have http:// added on the front). JSNI due to limited regex * support in GWT 1.7. * * @param href * URL to check. * @return True if needs prefix; false if not. */ private native boolean isRelativeUrl(final String href) /*-{ return !href.match(/^\w{3,5}:/) && href.substr(0,7) != 'mailto:'; }-*/; }