From 6b18b0761b726fd9aef1ebcc21b760378f7d4b5c Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Mon, 16 Jun 2014 17:36:12 -0400
Subject: [PATCH] Merge release 1.6.0

---
 src/main/java/com/gitblit/wicket/pages/UserPage.java |  229 +++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 207 insertions(+), 22 deletions(-)

diff --git a/src/main/java/com/gitblit/wicket/pages/UserPage.java b/src/main/java/com/gitblit/wicket/pages/UserPage.java
index a5d38d1..8931d5e 100644
--- a/src/main/java/com/gitblit/wicket/pages/UserPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/UserPage.java
@@ -15,20 +15,32 @@
  */
 package com.gitblit.wicket.pages;
 
+import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
+import java.util.Locale;
 
 import org.apache.wicket.PageParameters;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.link.BookmarkablePageLink;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.panel.Fragment;
 import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.markup.repeater.data.DataView;
 import org.apache.wicket.markup.repeater.data.ListDataProvider;
-import org.eclipse.jgit.lib.PersonIdent;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
 
+import com.gitblit.Constants.Transport;
+import com.gitblit.GitBlitException;
 import com.gitblit.Keys;
+import com.gitblit.models.Menu.ParameterMenuItem;
+import com.gitblit.models.NavLink;
+import com.gitblit.models.NavLink.DropDownPageMenuNavLink;
 import com.gitblit.models.ProjectModel;
 import com.gitblit.models.RepositoryModel;
 import com.gitblit.models.UserModel;
@@ -36,13 +48,13 @@
 import com.gitblit.wicket.GitBlitWebApp;
 import com.gitblit.wicket.GitBlitWebSession;
 import com.gitblit.wicket.GitblitRedirectException;
-import com.gitblit.wicket.PageRegistration;
-import com.gitblit.wicket.PageRegistration.DropDownMenuItem;
-import com.gitblit.wicket.PageRegistration.DropDownMenuRegistration;
 import com.gitblit.wicket.WicketUtils;
-import com.gitblit.wicket.panels.GravatarImage;
-import com.gitblit.wicket.panels.LinkPanel;
+import com.gitblit.wicket.panels.BooleanOption;
+import com.gitblit.wicket.panels.ChoiceOption;
 import com.gitblit.wicket.panels.ProjectRepositoryPanel;
+import com.gitblit.wicket.panels.SshKeysPanel;
+import com.gitblit.wicket.panels.TextOption;
+import com.gitblit.wicket.panels.UserTitlePanel;
 
 public class UserPage extends RootPage {
 
@@ -83,21 +95,30 @@
 			user = new UserModel(userName);
 		}
 
-		add(new Label("userDisplayName", user.getDisplayName()));
-		add(new Label("userUsername", user.username));
-		LinkPanel email = new LinkPanel("userEmail", null, user.emailAddress, "mailto:#");
-		email.setRenderBodyOnly(true);
-		add(email.setVisible(app().settings().getBoolean(Keys.web.showEmailAddresses, true) && !StringUtils.isEmpty(user.emailAddress)));
 
-		PersonIdent person = new PersonIdent(user.getDisplayName(), user.emailAddress == null ? user.getDisplayName() : user.emailAddress);
-		add(new GravatarImage("gravatar", person, 210));
+		add(new UserTitlePanel("userTitlePanel", user, user.username));
 
 		UserModel sessionUser = GitBlitWebSession.get().getUser();
-		if (sessionUser != null && user.canCreate() && sessionUser.equals(user)) {
-			// user can create personal repositories
-			add(new BookmarkablePageLink<Void>("newRepository", EditRepositoryPage.class));
+		boolean isMyProfile = sessionUser != null && sessionUser.equals(user);
+
+		if (isMyProfile) {
+			addPreferences(user);
+
+			if (app().gitblit().isServingSSH()) {
+				// show the SSH key management tab
+				addSshKeys(user);
+			} else {
+				// SSH daemon is disabled, hide keys tab
+				add(new Label("sshKeysLink").setVisible(false));
+				add(new Label("sshKeysTab").setVisible(false));
+			}
 		} else {
-			add(new Label("newRepository").setVisible(false));
+			// visiting user
+			add(new Label("preferencesLink").setVisible(false));
+			add(new Label("preferencesTab").setVisible(false));
+
+			add(new Label("sshKeysLink").setVisible(false));
+			add(new Label("sshKeysTab").setVisible(false));
 		}
 
 		List<RepositoryModel> repositories = getRepositories(params);
@@ -127,10 +148,10 @@
 	}
 
 	@Override
-	protected void addDropDownMenus(List<PageRegistration> pages) {
+	protected void addDropDownMenus(List<NavLink> navLinks) {
 		PageParameters params = getPageParameters();
 
-		DropDownMenuRegistration menu = new DropDownMenuRegistration("gb.filters",
+		DropDownPageMenuNavLink menu = new DropDownPageMenuNavLink("gb.filters",
 				UserPage.class);
 		// preserve time filter option on repository choices
 		menu.menuItems.addAll(getRepositoryFilterItems(params));
@@ -140,9 +161,173 @@
 
 		if (menu.menuItems.size() > 0) {
 			// Reset Filter
-			menu.menuItems.add(new DropDownMenuItem(getString("gb.reset"), null, null));
+			menu.menuItems.add(new ParameterMenuItem(getString("gb.reset")));
 		}
 
-		pages.add(menu);
+		navLinks.add(menu);
+	}
+
+	private void addPreferences(UserModel user) {
+		// add preferences
+		Form<Void> prefs = new Form<Void>("prefsForm");
+
+		List<Language> languages = Arrays.asList(
+				new Language("Deutsch","de"),
+				new Language("English","en"),
+				new Language("Español", "es"),
+				new Language("Français", "fr"),
+				new Language("Italiano", "it"),
+				new Language("日本語", "ja"),
+				new Language("한국말", "ko"),
+				new Language("Nederlands", "nl"),
+				new Language("Norsk", "no"),
+				new Language("Język Polski", "pl"),
+				new Language("Português", "pt_BR"),
+				new Language("中文", "zh_CN"));
+
+		Locale locale = user.getPreferences().getLocale();
+		if (locale == null) {
+			// user has not specified language preference
+			// try server default preference
+			String lc = app().settings().getString(Keys.web.forceDefaultLocale, null);
+			if (StringUtils.isEmpty(lc)) {
+				// server default language is not configured
+				// try browser preference
+				Locale sessionLocale = GitBlitWebSession.get().getLocale();
+				if (sessionLocale != null) {
+					locale = sessionLocale;
+				}
+			} else {
+
+			}
+		}
+
+		Language preferredLanguage = null;
+		if (locale != null) {
+			String localeCode = locale.getLanguage();
+			if (!StringUtils.isEmpty(locale.getCountry())) {
+				localeCode += "_" + locale.getCountry();
+			}
+
+			for (Language language : languages) {
+				if (language.code.equals(localeCode)) {
+					// language_COUNTRY match
+					preferredLanguage = language;
+				} else if (preferredLanguage != null && language.code.startsWith(locale.getLanguage())) {
+					// language match
+					preferredLanguage = language;
+				}
+			}
+		}
+
+		final IModel<String> displayName = Model.of(user.getDisplayName());
+		final IModel<String> emailAddress = Model.of(user.emailAddress == null ? "" : user.emailAddress);
+		final IModel<Language> language = Model.of(preferredLanguage);
+		final IModel<Boolean> emailMeOnMyTicketChanges = Model.of(user.getPreferences().isEmailMeOnMyTicketChanges());
+		final IModel<Transport> transport = Model.of(user.getPreferences().getTransport());
+
+		prefs.add(new TextOption("displayName",
+				getString("gb.displayName"),
+				getString("gb.displayNameDescription"),
+				displayName).setVisible(app().authentication().supportsDisplayNameChanges(user)));
+
+		prefs.add(new TextOption("emailAddress",
+				getString("gb.emailAddress"),
+				getString("gb.emailAddressDescription"),
+				emailAddress).setVisible(app().authentication().supportsEmailAddressChanges(user)));
+
+		prefs.add(new ChoiceOption<Language>("language",
+				getString("gb.languagePreference"),
+				getString("gb.languagePreferenceDescription"),
+				language,
+				languages));
+
+		prefs.add(new BooleanOption("emailMeOnMyTicketChanges",
+				getString("gb.emailMeOnMyTicketChanges"),
+				getString("gb.emailMeOnMyTicketChangesDescription"),
+				emailMeOnMyTicketChanges).setVisible(app().notifier().isSendingMail()));
+
+		List<Transport> availableTransports = new ArrayList<>();
+		if (app().gitblit().isServingSSH()) {
+			availableTransports.add(Transport.SSH);
+		}
+		if (app().gitblit().isServingHTTP()) {
+			availableTransports.add(Transport.HTTPS);
+			availableTransports.add(Transport.HTTP);
+		}
+		if (app().gitblit().isServingGIT()) {
+			availableTransports.add(Transport.GIT);
+		}
+
+		prefs.add(new ChoiceOption<Transport>("transport",
+				getString("gb.transportPreference"),
+				getString("gb.transportPreferenceDescription"),
+				transport,
+				availableTransports));
+
+		prefs.add(new AjaxButton("save") {
+
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
+
+				UserModel user = GitBlitWebSession.get().getUser();
+
+				user.displayName = displayName.getObject();
+				user.emailAddress = emailAddress.getObject();
+
+				Language lang = language.getObject();
+				if (lang != null) {
+					user.getPreferences().setLocale(lang.code);
+				}
+
+				user.getPreferences().setEmailMeOnMyTicketChanges(emailMeOnMyTicketChanges.getObject());
+				user.getPreferences().setTransport(transport.getObject());
+
+				try {
+					app().gitblit().reviseUser(user.username, user);
+
+					setRedirect(true);
+					setResponsePage(UserPage.class, WicketUtils.newUsernameParameter(user.username));
+				} catch (GitBlitException e) {
+					// logger.error("Failed to update user " + user.username, e);
+					// error(getString("gb.failedToUpdateUser"), false);
+				}
+			}
+		});
+
+		// add the preferences tab
+		add(new Fragment("preferencesLink", "preferencesLinkFragment", this).setRenderBodyOnly(true));
+		Fragment fragment = new Fragment("preferencesTab", "preferencesTabFragment", this);
+		fragment.add(prefs);
+		add(fragment.setRenderBodyOnly(true));
+	}
+
+	private void addSshKeys(final UserModel user) {
+		Fragment keysTab = new Fragment("sshKeysTab", "sshKeysTabFragment", this);
+		keysTab.add(new SshKeysPanel("sshKeysPanel", user));
+
+		// add the SSH keys tab
+		add(new Fragment("sshKeysLink", "sshKeysLinkFragment", this).setRenderBodyOnly(true));
+		add(keysTab.setRenderBodyOnly(true));
+	}
+
+	private class Language implements Serializable {
+
+		private static final long serialVersionUID = 1L;
+
+		final String name;
+		final String code;
+
+		public Language(String name, String code) {
+			this.name = name;
+			this.code = code;
+		}
+
+		@Override
+		public String toString() {
+			return name + " (" + code +")";
+		}
 	}
 }

--
Gitblit v1.9.1