Add the default context preference to user accounts
Signed-off-by: Shawn O. Pearce <sop@google.com>
This commit is contained in:
		| @@ -22,6 +22,7 @@ public interface AccountConstants extends Constants { | |||||||
|   String fullName(); |   String fullName(); | ||||||
|   String preferredEmail(); |   String preferredEmail(); | ||||||
|   String registeredOn(); |   String registeredOn(); | ||||||
|  |   String defaultContext(); | ||||||
|  |  | ||||||
|   String tabPreferences(); |   String tabPreferences(); | ||||||
|   String tabSshKeys(); |   String tabSshKeys(); | ||||||
|   | |||||||
| @@ -3,6 +3,7 @@ accountSettingsHeading = Account Settings | |||||||
| fullName = Full Name | fullName = Full Name | ||||||
| preferredEmail = Email Address | preferredEmail = Email Address | ||||||
| registeredOn = Registered | registeredOn = Registered | ||||||
|  | defaultContext = Default Context | ||||||
|  |  | ||||||
| tabPreferences = Preferences | tabPreferences = Preferences | ||||||
| tabSshKeys = SSH Keys | tabSshKeys = SSH Keys | ||||||
|   | |||||||
| @@ -0,0 +1,21 @@ | |||||||
|  | // Copyright 2008 Google Inc. | ||||||
|  | // | ||||||
|  | // 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 com.google.gerrit.client.account; | ||||||
|  |  | ||||||
|  | import com.google.gwt.i18n.client.Messages; | ||||||
|  |  | ||||||
|  | public interface AccountMessages extends Messages { | ||||||
|  |   String lines(short cnt); | ||||||
|  | } | ||||||
| @@ -0,0 +1 @@ | |||||||
|  | lines = {0} lines | ||||||
| @@ -15,16 +15,15 @@ | |||||||
| package com.google.gerrit.client.account; | package com.google.gerrit.client.account; | ||||||
|  |  | ||||||
| import com.google.gerrit.client.reviewdb.Account; | import com.google.gerrit.client.reviewdb.Account; | ||||||
| import com.google.gerrit.client.reviewdb.AccountSshKey; |  | ||||||
| import com.google.gerrit.client.rpc.SignInRequired; | import com.google.gerrit.client.rpc.SignInRequired; | ||||||
| import com.google.gwt.user.client.rpc.AsyncCallback; | import com.google.gwt.user.client.rpc.AsyncCallback; | ||||||
| import com.google.gwtjsonrpc.client.RemoteJsonService; | import com.google.gwtjsonrpc.client.RemoteJsonService; | ||||||
| import com.google.gwtjsonrpc.client.VoidResult; | import com.google.gwtjsonrpc.client.VoidResult; | ||||||
|  |  | ||||||
| import java.util.List; |  | ||||||
| import java.util.Set; |  | ||||||
|  |  | ||||||
| public interface AccountService extends RemoteJsonService { | public interface AccountService extends RemoteJsonService { | ||||||
|   @SignInRequired |   @SignInRequired | ||||||
|   void myAccount(AsyncCallback<Account> callback); |   void myAccount(AsyncCallback<Account> callback); | ||||||
|  |  | ||||||
|  |   @SignInRequired | ||||||
|  |   void changeDefaultContext(short newSetting, AsyncCallback<VoidResult> callback); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -19,9 +19,12 @@ import com.google.gerrit.client.reviewdb.ReviewDb; | |||||||
| import com.google.gerrit.client.rpc.BaseServiceImplementation; | import com.google.gerrit.client.rpc.BaseServiceImplementation; | ||||||
| import com.google.gerrit.client.rpc.RpcUtil; | import com.google.gerrit.client.rpc.RpcUtil; | ||||||
| import com.google.gwt.user.client.rpc.AsyncCallback; | import com.google.gwt.user.client.rpc.AsyncCallback; | ||||||
|  | import com.google.gwtjsonrpc.client.VoidResult; | ||||||
| import com.google.gwtorm.client.OrmException; | import com.google.gwtorm.client.OrmException; | ||||||
| import com.google.gwtorm.client.SchemaFactory; | import com.google.gwtorm.client.SchemaFactory; | ||||||
|  |  | ||||||
|  | import java.util.Collections; | ||||||
|  |  | ||||||
| public class AccountServiceImpl extends BaseServiceImplementation implements | public class AccountServiceImpl extends BaseServiceImplementation implements | ||||||
|     AccountService { |     AccountService { | ||||||
|   public AccountServiceImpl(final SchemaFactory<ReviewDb> rdf) { |   public AccountServiceImpl(final SchemaFactory<ReviewDb> rdf) { | ||||||
| @@ -35,4 +38,16 @@ public class AccountServiceImpl extends BaseServiceImplementation implements | |||||||
|       } |       } | ||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   public void changeDefaultContext(final short newSetting, | ||||||
|  |       final AsyncCallback<VoidResult> callback) { | ||||||
|  |     run(callback, new Action<VoidResult>() { | ||||||
|  |       public VoidResult run(final ReviewDb db) throws OrmException { | ||||||
|  |         final Account a = db.accounts().get(RpcUtil.getAccountId()); | ||||||
|  |         a.setDefaultContext(newSetting); | ||||||
|  |         db.accounts().update(Collections.singleton(a)); | ||||||
|  |         return VoidResult.INSTANCE; | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|  |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -14,11 +14,13 @@ | |||||||
|  |  | ||||||
| package com.google.gerrit.client.account; | package com.google.gerrit.client.account; | ||||||
|  |  | ||||||
| import com.google.gerrit.client.FormatUtil; | import static com.google.gerrit.client.FormatUtil.mediumFormat; | ||||||
|  |  | ||||||
| import com.google.gerrit.client.Gerrit; | import com.google.gerrit.client.Gerrit; | ||||||
| import com.google.gerrit.client.reviewdb.Account; | import com.google.gerrit.client.reviewdb.Account; | ||||||
| import com.google.gerrit.client.rpc.GerritCallback; | import com.google.gerrit.client.rpc.GerritCallback; | ||||||
| import com.google.gerrit.client.ui.AccountScreen; | import com.google.gerrit.client.ui.AccountScreen; | ||||||
|  | import com.google.gwt.i18n.client.LocaleInfo; | ||||||
| import com.google.gwt.user.client.ui.FlowPanel; | import com.google.gwt.user.client.ui.FlowPanel; | ||||||
| import com.google.gwt.user.client.ui.Grid; | import com.google.gwt.user.client.ui.Grid; | ||||||
| import com.google.gwt.user.client.ui.Label; | import com.google.gwt.user.client.ui.Label; | ||||||
| @@ -27,17 +29,26 @@ import com.google.gwt.user.client.ui.TabPanel; | |||||||
| import com.google.gwt.user.client.ui.HTMLTable.CellFormatter; | import com.google.gwt.user.client.ui.HTMLTable.CellFormatter; | ||||||
|  |  | ||||||
| public class AccountSettings extends AccountScreen { | public class AccountSettings extends AccountScreen { | ||||||
|  |   private final int labelIdx, fieldIdx; | ||||||
|   private final Grid info; |   private final Grid info; | ||||||
|  |  | ||||||
|   private TabPanel tabs; |   private TabPanel tabs; | ||||||
|  |  | ||||||
|   private Panel prefsPanel; |   private PreferencePanel prefsPanel; | ||||||
|   private Panel agreementsPanel; |   private Panel agreementsPanel; | ||||||
|   private SshKeyPanel keysPanel; |   private SshKeyPanel keysPanel; | ||||||
|  |  | ||||||
|   public AccountSettings() { |   public AccountSettings() { | ||||||
|     super(Util.C.accountSettingsHeading()); |     super(Util.C.accountSettingsHeading()); | ||||||
|  |  | ||||||
|  |     if (LocaleInfo.getCurrentLocale().isRTL()) { | ||||||
|  |       labelIdx = 1; | ||||||
|  |       fieldIdx = 0; | ||||||
|  |     } else { | ||||||
|  |       labelIdx = 0; | ||||||
|  |       fieldIdx = 1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     info = new Grid(3, 2); |     info = new Grid(3, 2); | ||||||
|     info.setStyleName("gerrit-InfoBlock"); |     info.setStyleName("gerrit-InfoBlock"); | ||||||
|     info.addStyleName("gerrit-AccountInfoBlock"); |     info.addStyleName("gerrit-AccountInfoBlock"); | ||||||
| @@ -52,9 +63,7 @@ public class AccountSettings extends AccountScreen { | |||||||
|     fmt.addStyleName(0, 1, "topmost"); |     fmt.addStyleName(0, 1, "topmost"); | ||||||
|     fmt.addStyleName(2, 0, "bottomheader"); |     fmt.addStyleName(2, 0, "bottomheader"); | ||||||
|  |  | ||||||
|     prefsPanel = new FlowPanel(); |     prefsPanel = new PreferencePanel(); | ||||||
|     prefsPanel.add(new Label("Not Implemented")); |  | ||||||
|  |  | ||||||
|     keysPanel = new SshKeyPanel(); |     keysPanel = new SshKeyPanel(); | ||||||
|  |  | ||||||
|     agreementsPanel = new FlowPanel(); |     agreementsPanel = new FlowPanel(); | ||||||
| @@ -76,7 +85,7 @@ public class AccountSettings extends AccountScreen { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   private void infoRow(final int row, final String name) { |   private void infoRow(final int row, final String name) { | ||||||
|     info.setText(row, 0, name); |     info.setText(row, labelIdx, name); | ||||||
|     info.getCellFormatter().addStyleName(row, 0, "header"); |     info.getCellFormatter().addStyleName(row, 0, "header"); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -98,8 +107,9 @@ public class AccountSettings extends AccountScreen { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   void display(final Account account) { |   void display(final Account account) { | ||||||
|     info.setText(0, 1, account.getFullName()); |     info.setText(0, fieldIdx, account.getFullName()); | ||||||
|     info.setText(1, 1, account.getPreferredEmail()); |     info.setText(1, fieldIdx, account.getPreferredEmail()); | ||||||
|     info.setText(2, 1, FormatUtil.mediumFormat(account.getRegisteredOn())); |     info.setText(2, fieldIdx, mediumFormat(account.getRegisteredOn())); | ||||||
|  |     prefsPanel.display(account); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -0,0 +1,100 @@ | |||||||
|  | // Copyright 2008 Google Inc. | ||||||
|  | // | ||||||
|  | // 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 com.google.gerrit.client.account; | ||||||
|  |  | ||||||
|  | import com.google.gerrit.client.Gerrit; | ||||||
|  | import com.google.gerrit.client.reviewdb.Account; | ||||||
|  | import com.google.gerrit.client.rpc.GerritCallback; | ||||||
|  | import com.google.gwt.i18n.client.LocaleInfo; | ||||||
|  | import com.google.gwt.user.client.ui.ChangeListener; | ||||||
|  | import com.google.gwt.user.client.ui.Composite; | ||||||
|  | import com.google.gwt.user.client.ui.FlowPanel; | ||||||
|  | import com.google.gwt.user.client.ui.Grid; | ||||||
|  | import com.google.gwt.user.client.ui.ListBox; | ||||||
|  | import com.google.gwt.user.client.ui.Widget; | ||||||
|  | import com.google.gwtjsonrpc.client.VoidResult; | ||||||
|  |  | ||||||
|  | public class PreferencePanel extends Composite { | ||||||
|  |   private ListBox defaultContext; | ||||||
|  |   private short oldDefaultContext; | ||||||
|  |  | ||||||
|  |   public PreferencePanel() { | ||||||
|  |     final FlowPanel body = new FlowPanel(); | ||||||
|  |  | ||||||
|  |     defaultContext = new ListBox(); | ||||||
|  |     for (final short v : Account.CONTEXT_CHOICES) { | ||||||
|  |       defaultContext.addItem(Util.M.lines(v), String.valueOf(v)); | ||||||
|  |     } | ||||||
|  |     defaultContext.addChangeListener(new ChangeListener() { | ||||||
|  |       public void onChange(Widget sender) { | ||||||
|  |         final int idx = defaultContext.getSelectedIndex(); | ||||||
|  |         if (idx < 0) { | ||||||
|  |           return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         final short newLines = Short.parseShort(defaultContext.getValue(idx)); | ||||||
|  |         if (newLines == oldDefaultContext) { | ||||||
|  |           return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         Util.ACCOUNT_SVC.changeDefaultContext(newLines, | ||||||
|  |             new GerritCallback<VoidResult>() { | ||||||
|  |               public void onSuccess(final VoidResult result) { | ||||||
|  |                 oldDefaultContext = newLines; | ||||||
|  |                 Gerrit.getUserAccount().setDefaultContext(newLines); | ||||||
|  |               } | ||||||
|  |  | ||||||
|  |               @Override | ||||||
|  |               public void onFailure(final Throwable caught) { | ||||||
|  |                 setDefaultContext(oldDefaultContext); | ||||||
|  |                 super.onFailure(caught); | ||||||
|  |               } | ||||||
|  |             }); | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     final int labelIdx, fieldIdx; | ||||||
|  |     if (LocaleInfo.getCurrentLocale().isRTL()) { | ||||||
|  |       labelIdx = 1; | ||||||
|  |       fieldIdx = 0; | ||||||
|  |     } else { | ||||||
|  |       labelIdx = 0; | ||||||
|  |       fieldIdx = 1; | ||||||
|  |     } | ||||||
|  |     final Grid formGrid = new Grid(1, 2); | ||||||
|  |  | ||||||
|  |     formGrid.setText(0, labelIdx, Util.C.defaultContext()); | ||||||
|  |     formGrid.setWidget(0, fieldIdx, defaultContext); | ||||||
|  |  | ||||||
|  |     body.add(formGrid); | ||||||
|  |  | ||||||
|  |     initWidget(body); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   void display(final Account account) { | ||||||
|  |     setDefaultContext(account.getDefaultContext()); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   private void setDefaultContext(final short lines) { | ||||||
|  |     for (int i = 0; i < Account.CONTEXT_CHOICES.length; i++) { | ||||||
|  |       if (Account.CONTEXT_CHOICES[i] == lines) { | ||||||
|  |         oldDefaultContext = lines; | ||||||
|  |         defaultContext.setSelectedIndex(i); | ||||||
|  |         return; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     setDefaultContext(Account.DEFAULT_CONTEXT); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -19,6 +19,7 @@ import com.google.gwtjsonrpc.client.JsonUtil; | |||||||
|  |  | ||||||
| public class Util { | public class Util { | ||||||
|   public static final AccountConstants C = GWT.create(AccountConstants.class); |   public static final AccountConstants C = GWT.create(AccountConstants.class); | ||||||
|  |   public static final AccountMessages M = GWT.create(AccountMessages.class); | ||||||
|   public static final AccountService ACCOUNT_SVC; |   public static final AccountService ACCOUNT_SVC; | ||||||
|   public static final AccountSecurity ACCOUNT_SEC; |   public static final AccountSecurity ACCOUNT_SEC; | ||||||
|   public static final LoginService LOGIN_SVC; |   public static final LoginService LOGIN_SVC; | ||||||
|   | |||||||
| @@ -21,6 +21,12 @@ import java.sql.Timestamp; | |||||||
|  |  | ||||||
| /** Preferences and information about a single user. */ | /** Preferences and information about a single user. */ | ||||||
| public final class Account { | public final class Account { | ||||||
|  |   /** Default number of lines of context. */ | ||||||
|  |   public static final short DEFAULT_CONTEXT = 10; | ||||||
|  |  | ||||||
|  |   /** Typical valid choices for the default context setting. */ | ||||||
|  |   public static final short[] CONTEXT_CHOICES = {3, 10, 25, 50, 75, 100}; | ||||||
|  |  | ||||||
|   /** Key local to Gerrit to identify a user. */ |   /** Key local to Gerrit to identify a user. */ | ||||||
|   public static class Id extends IntKey<com.google.gwtorm.client.Key<?>> { |   public static class Id extends IntKey<com.google.gwtorm.client.Key<?>> { | ||||||
|     @Column |     @Column | ||||||
| @@ -66,6 +72,10 @@ public final class Account { | |||||||
|   @Column(notNull = false) |   @Column(notNull = false) | ||||||
|   protected String preferredEmail; |   protected String preferredEmail; | ||||||
|  |  | ||||||
|  |   /** Default number of lines of context when viewing a patch. */ | ||||||
|  |   @Column | ||||||
|  |   protected short defaultContext; | ||||||
|  |  | ||||||
|   /** Non-Internet based contact details for the account's owner. */ |   /** Non-Internet based contact details for the account's owner. */ | ||||||
|   @Column(notNull = false) |   @Column(notNull = false) | ||||||
|   protected ContactInformation contact; |   protected ContactInformation contact; | ||||||
| @@ -81,6 +91,7 @@ public final class Account { | |||||||
|   public Account(final Account.Id newId) { |   public Account(final Account.Id newId) { | ||||||
|     accountId = newId; |     accountId = newId; | ||||||
|     registeredOn = new Timestamp(System.currentTimeMillis()); |     registeredOn = new Timestamp(System.currentTimeMillis()); | ||||||
|  |     defaultContext = DEFAULT_CONTEXT; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /** Get local id of this account, to link with in other entities */ |   /** Get local id of this account, to link with in other entities */ | ||||||
| @@ -113,6 +124,16 @@ public final class Account { | |||||||
|     return registeredOn; |     return registeredOn; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   /** Get the default number of lines of context when viewing a patch. */ | ||||||
|  |   public short getDefaultContext() { | ||||||
|  |     return defaultContext; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** Set the number of lines of context when viewing a patch. */ | ||||||
|  |   public void setDefaultContext(final short s) { | ||||||
|  |     defaultContext = s; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   public ContactInformation getContactInformation() { |   public ContactInformation getContactInformation() { | ||||||
|     return contact; |     return contact; | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -31,7 +31,8 @@ INSERT INTO accounts | |||||||
|  contact_address, |  contact_address, | ||||||
|  contact_country, |  contact_country, | ||||||
|  contact_phone_nbr, |  contact_phone_nbr, | ||||||
|  contact_fax_nbr |  contact_fax_nbr, | ||||||
|  |  default_context | ||||||
| ) SELECT | ) SELECT | ||||||
|  nextval('account_id'), |  nextval('account_id'), | ||||||
|  a.created, |  a.created, | ||||||
| @@ -40,7 +41,8 @@ INSERT INTO accounts | |||||||
|  a.mailing_address, |  a.mailing_address, | ||||||
|  a.mailing_address_country, |  a.mailing_address_country, | ||||||
|  a.phone_number, |  a.phone_number, | ||||||
|  a.fax_number |  a.fax_number, | ||||||
|  |  a.default_context | ||||||
|  FROM gerrit1.accounts a; |  FROM gerrit1.accounts a; | ||||||
|  |  | ||||||
| DELETE FROM account_external_ids; | DELETE FROM account_external_ids; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Shawn O. Pearce
					Shawn O. Pearce