| // Copyright (C) 2008 The Android Open Source Project |
| // |
| // 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.ErrorDialog; |
| import com.google.gerrit.client.Gerrit; |
| import com.google.gerrit.client.rpc.GerritCallback; |
| import com.google.gerrit.client.rpc.Natives; |
| import com.google.gerrit.client.ui.OnEditEnabler; |
| import com.google.gerrit.common.PageLinks; |
| import com.google.gerrit.common.errors.EmailException; |
| import com.google.gerrit.reviewdb.client.Account; |
| import com.google.gerrit.reviewdb.client.Account.FieldName; |
| import com.google.gerrit.reviewdb.client.AuthType; |
| import com.google.gerrit.reviewdb.client.ContactInformation; |
| import com.google.gwt.core.client.JsArray; |
| import com.google.gwt.event.dom.client.ChangeEvent; |
| import com.google.gwt.event.dom.client.ChangeHandler; |
| import com.google.gwt.event.dom.client.ClickEvent; |
| import com.google.gwt.event.dom.client.ClickHandler; |
| import com.google.gwt.i18n.client.LocaleInfo; |
| import com.google.gwt.user.client.Window; |
| import com.google.gwt.user.client.ui.Button; |
| import com.google.gwt.user.client.ui.Composite; |
| import com.google.gwt.user.client.ui.FlowPanel; |
| import com.google.gwt.user.client.ui.FormPanel; |
| import com.google.gwt.user.client.ui.FormPanel.SubmitEvent; |
| import com.google.gwt.user.client.ui.Grid; |
| import com.google.gwt.user.client.ui.HTML; |
| import com.google.gwt.user.client.ui.ListBox; |
| import com.google.gwt.user.client.ui.VerticalPanel; |
| import com.google.gwt.user.client.ui.Widget; |
| import com.google.gwtexpui.globalkey.client.NpTextBox; |
| import com.google.gwtexpui.user.client.AutoCenterDialogBox; |
| import com.google.gwtjsonrpc.common.AsyncCallback; |
| |
| class ContactPanelShort extends Composite { |
| protected final FlowPanel body; |
| protected int labelIdx, fieldIdx; |
| protected Button save; |
| |
| private String currentEmail; |
| protected boolean haveAccount; |
| private boolean haveEmails; |
| |
| NpTextBox nameTxt; |
| private ListBox emailPick; |
| private Button registerNewEmail; |
| |
| ContactPanelShort() { |
| body = new FlowPanel(); |
| initWidget(body); |
| } |
| |
| protected void onInitUI() { |
| if (LocaleInfo.getCurrentLocale().isRTL()) { |
| labelIdx = 1; |
| fieldIdx = 0; |
| } else { |
| labelIdx = 0; |
| fieldIdx = 1; |
| } |
| |
| nameTxt = new NpTextBox(); |
| nameTxt.setVisibleLength(60); |
| nameTxt.setReadOnly(!canEditFullName()); |
| |
| emailPick = new ListBox(); |
| |
| final Grid infoPlainText = new Grid(2, 2); |
| infoPlainText.setStyleName(Gerrit.RESOURCES.css().infoBlock()); |
| infoPlainText.addStyleName(Gerrit.RESOURCES.css().accountInfoBlock()); |
| |
| body.add(infoPlainText); |
| |
| registerNewEmail = new Button(Util.C.buttonOpenRegisterNewEmail()); |
| registerNewEmail.setEnabled(false); |
| registerNewEmail.addClickHandler(new ClickHandler() { |
| @Override |
| public void onClick(final ClickEvent event) { |
| doRegisterNewEmail(); |
| } |
| }); |
| final FlowPanel emailLine = new FlowPanel(); |
| emailLine.add(emailPick); |
| if (canRegisterNewEmail()) { |
| emailLine.add(registerNewEmail); |
| } |
| |
| int row = 0; |
| if (!Gerrit.getConfig().canEdit(FieldName.USER_NAME) |
| && Gerrit.getConfig().siteHasUsernames()) { |
| infoPlainText.resizeRows(infoPlainText.getRowCount() + 1); |
| row(infoPlainText, row++, Util.C.userName(), new UsernameField()); |
| } |
| |
| if (!canEditFullName()) { |
| FlowPanel nameLine = new FlowPanel(); |
| nameLine.add(nameTxt); |
| if (Gerrit.getConfig().getEditFullNameUrl() != null) { |
| Button edit = new Button(Util.C.linkEditFullName()); |
| edit.addClickHandler(new ClickHandler() { |
| @Override |
| public void onClick(ClickEvent event) { |
| Window.open(Gerrit.getConfig().getEditFullNameUrl(), "_blank", null); |
| } |
| }); |
| nameLine.add(edit); |
| } |
| Button reload = new Button(Util.C.linkReloadContact()); |
| reload.addClickHandler(new ClickHandler() { |
| @Override |
| public void onClick(ClickEvent event) { |
| Window.Location.replace(Gerrit.loginRedirect(PageLinks.SETTINGS_CONTACT)); |
| } |
| }); |
| nameLine.add(reload); |
| row(infoPlainText, row++, Util.C.contactFieldFullName(), nameLine); |
| } else { |
| row(infoPlainText, row++, Util.C.contactFieldFullName(), nameTxt); |
| } |
| row(infoPlainText, row++, Util.C.contactFieldEmail(), emailLine); |
| |
| infoPlainText.getCellFormatter().addStyleName(0, 0, Gerrit.RESOURCES.css().topmost()); |
| infoPlainText.getCellFormatter().addStyleName(0, 1, Gerrit.RESOURCES.css().topmost()); |
| infoPlainText.getCellFormatter().addStyleName(row - 1, 0, Gerrit.RESOURCES.css().bottomheader()); |
| |
| save = new Button(Util.C.buttonSaveChanges()); |
| save.setEnabled(false); |
| save.addClickHandler(new ClickHandler() { |
| @Override |
| public void onClick(final ClickEvent event) { |
| doSave(null); |
| } |
| }); |
| |
| emailPick.addChangeHandler(new ChangeHandler() { |
| @Override |
| public void onChange(final ChangeEvent event) { |
| final int idx = emailPick.getSelectedIndex(); |
| final String v = 0 <= idx ? emailPick.getValue(idx) : null; |
| if (Util.C.buttonOpenRegisterNewEmail().equals(v)) { |
| for (int i = 0; i < emailPick.getItemCount(); i++) { |
| if (currentEmail.equals(emailPick.getValue(i))) { |
| emailPick.setSelectedIndex(i); |
| break; |
| } |
| } |
| doRegisterNewEmail(); |
| } else { |
| save.setEnabled(true); |
| } |
| } |
| }); |
| } |
| |
| private boolean canEditFullName() { |
| return Gerrit.getConfig().canEdit(Account.FieldName.FULL_NAME); |
| } |
| |
| private boolean canRegisterNewEmail() { |
| return Gerrit.getConfig().canEdit(Account.FieldName.REGISTER_NEW_EMAIL); |
| } |
| |
| void hideSaveButton() { |
| save.setVisible(false); |
| } |
| |
| @Override |
| protected void onLoad() { |
| super.onLoad(); |
| |
| onInitUI(); |
| body.add(save); |
| display(Gerrit.getUserAccount()); |
| |
| emailPick.clear(); |
| emailPick.setEnabled(false); |
| registerNewEmail.setEnabled(false); |
| |
| haveAccount = false; |
| haveEmails = false; |
| |
| Util.ACCOUNT_SVC.myAccount(new GerritCallback<Account>() { |
| public void onSuccess(final Account result) { |
| if (!isAttached()) { |
| return; |
| } |
| display(result); |
| haveAccount = true; |
| postLoad(); |
| } |
| }); |
| AccountApi.getEmails("self", new GerritCallback<JsArray<EmailInfo>>() { |
| @Override |
| public void onSuccess(JsArray<EmailInfo> result) { |
| if (!isAttached()) { |
| return; |
| } |
| for (EmailInfo i : Natives.asList(result)) { |
| emailPick.addItem(i.email()); |
| } |
| haveEmails = true; |
| postLoad(); |
| } |
| }); |
| } |
| |
| private void postLoad() { |
| if (haveAccount && haveEmails) { |
| updateEmailList(); |
| registerNewEmail.setEnabled(true); |
| } |
| display(); |
| } |
| |
| void display() { |
| } |
| |
| protected void row(final Grid info, final int row, final String name, |
| final Widget field) { |
| info.setText(row, labelIdx, name); |
| info.setWidget(row, fieldIdx, field); |
| info.getCellFormatter().addStyleName(row, 0, Gerrit.RESOURCES.css().header()); |
| } |
| |
| protected void display(final Account userAccount) { |
| currentEmail = userAccount.getPreferredEmail(); |
| nameTxt.setText(userAccount.getFullName()); |
| save.setEnabled(false); |
| new OnEditEnabler(save, nameTxt); |
| } |
| |
| private void doRegisterNewEmail() { |
| if (!canRegisterNewEmail()) { |
| return; |
| } |
| |
| final AutoCenterDialogBox box = new AutoCenterDialogBox(true, true); |
| final VerticalPanel body = new VerticalPanel(); |
| |
| final NpTextBox inEmail = new NpTextBox(); |
| inEmail.setVisibleLength(60); |
| |
| final Button register = new Button(Util.C.buttonSendRegisterNewEmail()); |
| final Button cancel = new Button(Util.C.buttonCancel()); |
| final FormPanel form = new FormPanel(); |
| form.addSubmitHandler(new FormPanel.SubmitHandler() { |
| @Override |
| public void onSubmit(final SubmitEvent event) { |
| event.cancel(); |
| final String addr = inEmail.getText().trim(); |
| if (!addr.contains("@")) { |
| new ErrorDialog(Util.C.invalidUserEmail()).center(); |
| return; |
| } |
| |
| inEmail.setEnabled(false); |
| register.setEnabled(false); |
| AccountApi.registerEmail("self", addr, new GerritCallback<EmailInfo>() { |
| @Override |
| public void onSuccess(EmailInfo result) { |
| box.hide(); |
| if (Gerrit.getConfig().getAuthType() == AuthType.DEVELOPMENT_BECOME_ANY_ACCOUNT) { |
| currentEmail = addr; |
| if (emailPick.getItemCount() == 0) { |
| final Account me = Gerrit.getUserAccount(); |
| me.setPreferredEmail(addr); |
| onSaveSuccess(me); |
| } else { |
| save.setEnabled(true); |
| } |
| updateEmailList(); |
| } |
| } |
| |
| @Override |
| public void onFailure(final Throwable caught) { |
| inEmail.setEnabled(true); |
| register.setEnabled(true); |
| if (caught.getMessage().startsWith(EmailException.MESSAGE)) { |
| final ErrorDialog d = |
| new ErrorDialog(caught.getMessage().substring( |
| EmailException.MESSAGE.length())); |
| d.setText(Util.C.errorDialogTitleRegisterNewEmail()); |
| d.center(); |
| } else { |
| super.onFailure(caught); |
| } |
| } |
| }); |
| } |
| }); |
| form.setWidget(body); |
| |
| register.addClickHandler(new ClickHandler() { |
| @Override |
| public void onClick(final ClickEvent event) { |
| form.submit(); |
| } |
| }); |
| cancel.addClickHandler(new ClickHandler() { |
| @Override |
| public void onClick(ClickEvent event) { |
| box.hide(); |
| } |
| }); |
| |
| final FlowPanel buttons = new FlowPanel(); |
| buttons.setStyleName(Gerrit.RESOURCES.css().patchSetActions()); |
| buttons.add(register); |
| buttons.add(cancel); |
| |
| if (Gerrit.getConfig().getAuthType() != AuthType.DEVELOPMENT_BECOME_ANY_ACCOUNT) { |
| body.add(new HTML(Util.C.descRegisterNewEmail())); |
| } |
| body.add(inEmail); |
| body.add(buttons); |
| |
| box.setText(Util.C.titleRegisterNewEmail()); |
| box.setWidget(form); |
| box.center(); |
| inEmail.setFocus(true); |
| } |
| |
| void doSave(final AsyncCallback<Account> onSave) { |
| String newName = canEditFullName() ? nameTxt.getText() : null; |
| if (newName != null && newName.trim().isEmpty()) { |
| newName = null; |
| } |
| |
| final String newEmail; |
| if (emailPick.isEnabled() && emailPick.getSelectedIndex() >= 0) { |
| final String v = emailPick.getValue(emailPick.getSelectedIndex()); |
| if (Util.C.buttonOpenRegisterNewEmail().equals(v)) { |
| newEmail = currentEmail; |
| } else { |
| newEmail = v; |
| } |
| } else { |
| newEmail = currentEmail; |
| } |
| |
| final ContactInformation info = toContactInformation(); |
| save.setEnabled(false); |
| registerNewEmail.setEnabled(false); |
| |
| Util.ACCOUNT_SEC.updateContact(newName, newEmail, info, |
| new GerritCallback<Account>() { |
| public void onSuccess(final Account result) { |
| registerNewEmail.setEnabled(true); |
| onSaveSuccess(result); |
| if (onSave != null) { |
| onSave.onSuccess(result); |
| } |
| } |
| |
| @Override |
| public void onFailure(final Throwable caught) { |
| save.setEnabled(true); |
| registerNewEmail.setEnabled(true); |
| super.onFailure(caught); |
| } |
| }); |
| } |
| |
| void onSaveSuccess(final Account result) { |
| final Account me = Gerrit.getUserAccount(); |
| me.setFullName(result.getFullName()); |
| me.setPreferredEmail(result.getPreferredEmail()); |
| Gerrit.refreshMenuBar(); |
| display(me); |
| } |
| |
| ContactInformation toContactInformation() { |
| return null; |
| } |
| |
| private int emailListIndexOf(String value) { |
| for (int i = 0; i < emailPick.getItemCount(); i++) { |
| if (value.equalsIgnoreCase(emailPick.getValue(i))) { |
| return i; |
| } |
| } |
| return -1; |
| } |
| |
| private void updateEmailList() { |
| if (currentEmail != null) { |
| int index = emailListIndexOf(currentEmail); |
| if (index == -1) { |
| emailPick.addItem(currentEmail); |
| emailPick.setSelectedIndex(emailPick.getItemCount() - 1); |
| } else { |
| emailPick.setSelectedIndex(index); |
| } |
| } |
| if (emailPick.getItemCount() > 0) { |
| if (currentEmail == null) { |
| int index = emailListIndexOf(""); |
| if (index != -1) { |
| emailPick.removeItem(index); |
| } |
| emailPick.insertItem("", 0); |
| emailPick.setSelectedIndex(0); |
| } |
| emailPick.setVisible(true); |
| emailPick.setEnabled(true); |
| if (canRegisterNewEmail()) { |
| final String t = Util.C.buttonOpenRegisterNewEmail(); |
| int index = emailListIndexOf(t); |
| if (index != -1) { |
| emailPick.removeItem(index); |
| } |
| emailPick.addItem("... " + t + " ", t); |
| } |
| } else { |
| emailPick.setVisible(false); |
| } |
| } |
| } |