From 283766c0c244269fa4662748c88945a2c95e57c4 Mon Sep 17 00:00:00 2001 From: steve Date: Mon, 7 Oct 2013 03:54:07 +0800 Subject: [PATCH] Continue working on wicket components --- .gitignore | 15 +- .../java/com/pmease/gitop/web/SitePaths.java | 2 +- .../com/pmease/gitop/web/assets/css/base.css | 2 + .../component/vex/AjaxConfirmButton.java | 10 ++ .../common/component/vex/VexLinkBehavior.java | 8 +- .../common/component/vex/js/vex.confirm.js | 6 - .../gitop/web/common/form/FeedbackPanel.java | 1 - .../flatcheckbox/FlatCheckBoxElement.java | 17 +++ .../form/flatradio/FlatRadioElement.java | 17 +++ .../component/avatar/AvatarImageResource.java | 70 ++++----- .../gitop/web/page/GlobalHeaderPanel.java | 3 +- .../web/page/account/AccountHomePage.java | 2 - .../account/setting/AccountSettingPage.java | 2 - .../setting/password/AccountPasswordPage.java | 6 +- .../setting/profile/AccountProfilePage.html | 20 ++- .../setting/profile/AccountProfilePage.java | 134 ++++++++++++++++-- .../pmease/gitop/web/page/home/HomePage.html | 3 +- .../pmease/gitop/web/page/home/HomePage.java | 9 ++ 18 files changed, 260 insertions(+), 67 deletions(-) diff --git a/.gitignore b/.gitignore index dcb739c2f8..debeb706a3 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,17 @@ target/ .project .settings/ release.properties -pom.xml.releaseBackup \ No newline at end of file +pom.xml.releaseBackup + +.loadpath +*.class +*~ +*.lock +*.swp +*.out +*.tmp +*.bak +*.swp +*~.nib +*.DS_Store +*.log diff --git a/gitop.web/src/main/java/com/pmease/gitop/web/SitePaths.java b/gitop.web/src/main/java/com/pmease/gitop/web/SitePaths.java index 3a78cc4072..df8deb5672 100644 --- a/gitop.web/src/main/java/com/pmease/gitop/web/SitePaths.java +++ b/gitop.web/src/main/java/com/pmease/gitop/web/SitePaths.java @@ -42,7 +42,7 @@ public class SitePaths { } public File userAvatarDir(User user) { - return userAvatarDir(checkNotNull(user)); + return userAvatarDir(checkNotNull(user).getId()); } public File tempDir() { diff --git a/gitop.web/src/main/java/com/pmease/gitop/web/assets/css/base.css b/gitop.web/src/main/java/com/pmease/gitop/web/assets/css/base.css index 514d55f004..85d1be125f 100644 --- a/gitop.web/src/main/java/com/pmease/gitop/web/assets/css/base.css +++ b/gitop.web/src/main/java/com/pmease/gitop/web/assets/css/base.css @@ -251,6 +251,8 @@ a > .icon-null, .icon-null { display: inline-block; width: 10px; } .avatar-circle { border-radius: 50%; } .avatar-circle > img { border-radius: 50%; } +.avatar-xlarge { width: 128px; height: 128px; } + /** * LAYOUT */ diff --git a/gitop.web/src/main/java/com/pmease/gitop/web/common/component/vex/AjaxConfirmButton.java b/gitop.web/src/main/java/com/pmease/gitop/web/common/component/vex/AjaxConfirmButton.java index 0c044a7132..b2fc0ea3e3 100644 --- a/gitop.web/src/main/java/com/pmease/gitop/web/common/component/vex/AjaxConfirmButton.java +++ b/gitop.web/src/main/java/com/pmease/gitop/web/common/component/vex/AjaxConfirmButton.java @@ -5,6 +5,8 @@ import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior; import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.behavior.AttributeAppender; +import org.apache.wicket.markup.head.IHeaderResponse; +import org.apache.wicket.markup.head.JavaScriptHeaderItem; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.model.IModel; @@ -48,4 +50,12 @@ public class AjaxConfirmButton extends AjaxButton { } }; } + + @Override + public void renderHead(IHeaderResponse response) { + super.renderHead(response); + + response.render(JavaScriptHeaderItem.forReference(VexConfirmJavaScriptResourceReference.get())); + response.render(JavaScriptHeaderItem.forScript("vex.defaultOptions.className = 'vex-theme-wireframe'", "vex-theme-options")); + } } diff --git a/gitop.web/src/main/java/com/pmease/gitop/web/common/component/vex/VexLinkBehavior.java b/gitop.web/src/main/java/com/pmease/gitop/web/common/component/vex/VexLinkBehavior.java index 14ca99d819..25665d4d71 100644 --- a/gitop.web/src/main/java/com/pmease/gitop/web/common/component/vex/VexLinkBehavior.java +++ b/gitop.web/src/main/java/com/pmease/gitop/web/common/component/vex/VexLinkBehavior.java @@ -4,7 +4,7 @@ import org.apache.wicket.Component; import org.apache.wicket.behavior.Behavior; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.head.IHeaderResponse; -import org.apache.wicket.markup.head.JavaScriptHeaderItem; +import org.apache.wicket.markup.head.OnDomReadyHeaderItem; import org.apache.wicket.model.IComponentAssignedModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; @@ -44,8 +44,10 @@ public class VexLinkBehavior extends Behavior { public void renderHead(Component component, IHeaderResponse response) { super.renderHead(component, response); - response.render(JavaScriptHeaderItem.forReference(VexConfirmJavaScriptResourceReference.get())); - response.render(JavaScriptHeaderItem.forScript("vex.defaultOptions.className = 'vex-theme-wireframe'", "vex-theme-options")); + String markupId = component.getMarkupId(true); + response.render(OnDomReadyHeaderItem.forScript(String.format( + "$('#%s').on('click', function(e){e.preventDefault(); $(this).confirm(); });", + markupId))); } @Override diff --git a/gitop.web/src/main/java/com/pmease/gitop/web/common/component/vex/js/vex.confirm.js b/gitop.web/src/main/java/com/pmease/gitop/web/common/component/vex/js/vex.confirm.js index 3979d2cffc..af300a62ff 100644 --- a/gitop.web/src/main/java/com/pmease/gitop/web/common/component/vex/js/vex.confirm.js +++ b/gitop.web/src/main/java/com/pmease/gitop/web/common/component/vex/js/vex.confirm.js @@ -41,10 +41,4 @@ }); } - $(document).ready(function() { - $('.confirm-link').click(function(e) { - e.preventDefault(); - $(this).confirm(); - }) - }); }(window.jQuery, window, document); \ No newline at end of file diff --git a/gitop.web/src/main/java/com/pmease/gitop/web/common/form/FeedbackPanel.java b/gitop.web/src/main/java/com/pmease/gitop/web/common/form/FeedbackPanel.java index 120e24f68f..45cf803744 100644 --- a/gitop.web/src/main/java/com/pmease/gitop/web/common/form/FeedbackPanel.java +++ b/gitop.web/src/main/java/com/pmease/gitop/web/common/form/FeedbackPanel.java @@ -31,7 +31,6 @@ public class FeedbackPanel extends org.apache.wicket.markup.html.panel.FeedbackP super.onInitialize(); this.setOutputMarkupId(true); - add(AttributeModifier.append("class", new AbstractReadOnlyModel() { private static final long serialVersionUID = 1L; diff --git a/gitop.web/src/main/java/com/pmease/gitop/web/common/form/flatcheckbox/FlatCheckBoxElement.java b/gitop.web/src/main/java/com/pmease/gitop/web/common/form/flatcheckbox/FlatCheckBoxElement.java index 44101ed7cf..18885f492b 100644 --- a/gitop.web/src/main/java/com/pmease/gitop/web/common/form/flatcheckbox/FlatCheckBoxElement.java +++ b/gitop.web/src/main/java/com/pmease/gitop/web/common/form/flatcheckbox/FlatCheckBoxElement.java @@ -1,6 +1,10 @@ package com.pmease.gitop.web.common.form.flatcheckbox; import org.apache.wicket.Component; +import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.markup.head.IHeaderResponse; +import org.apache.wicket.markup.head.OnDomReadyHeaderItem; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.model.IModel; @@ -29,6 +33,19 @@ public class FlatCheckBoxElement extends CheckBoxElement { panel.add(label); panel.add(new FlatCheckBoxBehavior()); + panel.add(new AbstractDefaultAjaxBehavior() { + + @Override + protected void respond(AjaxRequestTarget target) { + } + + @Override + public void renderHead(Component component, IHeaderResponse response) { + super.renderHead(component, response); + response.render(OnDomReadyHeaderItem.forScript(String.format("$('#%s').checkbox()", checkbox.getMarkupId(true)))); + } + }); + return panel; } } diff --git a/gitop.web/src/main/java/com/pmease/gitop/web/common/form/flatradio/FlatRadioElement.java b/gitop.web/src/main/java/com/pmease/gitop/web/common/form/flatradio/FlatRadioElement.java index 59bbe496aa..5f754afd4d 100644 --- a/gitop.web/src/main/java/com/pmease/gitop/web/common/form/flatradio/FlatRadioElement.java +++ b/gitop.web/src/main/java/com/pmease/gitop/web/common/form/flatradio/FlatRadioElement.java @@ -1,6 +1,10 @@ package com.pmease.gitop.web.common.form.flatradio; import org.apache.wicket.Component; +import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.markup.head.IHeaderResponse; +import org.apache.wicket.markup.head.OnDomReadyHeaderItem; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Radio; import org.apache.wicket.model.IModel; @@ -19,12 +23,25 @@ public class FlatRadioElement extends RadioButtonElement { this.descriptionModel = Model.of(description); } + @SuppressWarnings("serial") @Override protected Component createInputComponent(String id) { radioContainer = new FlatRadioElementPanel(id); radioContainer.add(radio = createRadio("radio")); radioContainer.add(new Label("description", descriptionModel)); radioContainer.add(new FlatRadioBehavior()); + radioContainer.add(new AbstractDefaultAjaxBehavior() { + + @Override + protected void respond(AjaxRequestTarget target) { + } + + @Override + public void renderHead(Component component, IHeaderResponse response) { + super.renderHead(component, response); + response.render(OnDomReadyHeaderItem.forScript(String.format("$('#%s').radio()", radio.getMarkupId(true)))); + } + }); return radioContainer; } diff --git a/gitop.web/src/main/java/com/pmease/gitop/web/component/avatar/AvatarImageResource.java b/gitop.web/src/main/java/com/pmease/gitop/web/component/avatar/AvatarImageResource.java index 3712204ee1..014dbc5c92 100644 --- a/gitop.web/src/main/java/com/pmease/gitop/web/component/avatar/AvatarImageResource.java +++ b/gitop.web/src/main/java/com/pmease/gitop/web/component/avatar/AvatarImageResource.java @@ -18,39 +18,43 @@ import com.pmease.gitop.web.component.avatar.AvatarImage.AvatarImageType; public class AvatarImageResource extends DynamicImageResource { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - @Override - protected byte[] getImageData(Attributes attributes) { - PageParameters params = attributes.getParameters(); - AvatarImageType imageType = AvatarImageType.valueOf(params.get("type").toString().toUpperCase()); - long id = params.get("id").toLong(); - File avatarFile = null; - - if (imageType == AvatarImageType.USER) { - User user = AppLoader.getInstance(UserManager.class).get(id); - - if (!Strings.isNullOrEmpty(user.getAvatarUrl())) { - avatarFile = new File(SitePaths.get().userAvatarDir(id), user.getAvatarUrl()); - } - } else { -// Repository project = AppLoader.getInstance(RepositoryManager.class).get(id); -// if (!Strings.isNullOrEmpty(project.getAvatarUrl())) { -// avatarFile = new File(GitopWebApp.getProjectAvatarDir(id), project.getAvatarUrl()); -// } - } - - if (avatarFile != null && avatarFile.exists()) { - setFormat("image/" + Files.getFileExtension(avatarFile.getName())); - try { - return Files.toByteArray(avatarFile); - } catch (IOException e) { - throw Throwables.propagate(e); - } - } else { - setFormat("image/png"); - return GitopWebApp.get().getDefaultUserAvatar(); - } - } + @Override + protected byte[] getImageData(Attributes attributes) { + PageParameters params = attributes.getParameters(); + AvatarImageType imageType = AvatarImageType.valueOf(params.get("type") + .toString().toUpperCase()); + long id = params.get("id").toLong(); + File avatarFile = null; + + if (imageType == AvatarImageType.USER) { + User user = AppLoader.getInstance(UserManager.class).get(id); + + if (!Strings.isNullOrEmpty(user.getAvatarUrl())) { + avatarFile = new File(SitePaths.get().userAvatarDir(id), + user.getAvatarUrl()); + } + } else { + // Repository project = + // AppLoader.getInstance(RepositoryManager.class).get(id); + // if (!Strings.isNullOrEmpty(project.getAvatarUrl())) { + // avatarFile = new File(GitopWebApp.getProjectAvatarDir(id), + // project.getAvatarUrl()); + // } + } + + if (avatarFile != null && avatarFile.exists()) { + setFormat("image/" + Files.getFileExtension(avatarFile.getName())); + try { + return Files.toByteArray(avatarFile); + } catch (IOException e) { + throw Throwables.propagate(e); + } + } else { + setFormat("image/png"); + return GitopWebApp.get().getDefaultUserAvatar(); + } + } } diff --git a/gitop.web/src/main/java/com/pmease/gitop/web/page/GlobalHeaderPanel.java b/gitop.web/src/main/java/com/pmease/gitop/web/page/GlobalHeaderPanel.java index 0426d3b7d2..88e3008a5d 100644 --- a/gitop.web/src/main/java/com/pmease/gitop/web/page/GlobalHeaderPanel.java +++ b/gitop.web/src/main/java/com/pmease/gitop/web/page/GlobalHeaderPanel.java @@ -1,6 +1,5 @@ package com.pmease.gitop.web.page; -import org.apache.shiro.SecurityUtils; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.panel.Panel; @@ -40,7 +39,7 @@ public class GlobalHeaderPanel extends Panel { } protected boolean isSignedIn() { - return SecurityUtils.getSubject().isAuthenticated(); + return currentUser().isPresent(); } protected Optional currentUser() { diff --git a/gitop.web/src/main/java/com/pmease/gitop/web/page/account/AccountHomePage.java b/gitop.web/src/main/java/com/pmease/gitop/web/page/account/AccountHomePage.java index b3d5b5bcd0..0424b253c7 100644 --- a/gitop.web/src/main/java/com/pmease/gitop/web/page/account/AccountHomePage.java +++ b/gitop.web/src/main/java/com/pmease/gitop/web/page/account/AccountHomePage.java @@ -1,6 +1,5 @@ package com.pmease.gitop.web.page.account; -import org.apache.shiro.authz.annotation.RequiresAuthentication; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.model.IModel; @@ -14,7 +13,6 @@ import com.pmease.gitop.core.model.User; import com.pmease.gitop.web.page.AbstractLayoutPage; @SuppressWarnings("serial") -@RequiresAuthentication public class AccountHomePage extends AbstractLayoutPage { private final IModel accountModel; diff --git a/gitop.web/src/main/java/com/pmease/gitop/web/page/account/setting/AccountSettingPage.java b/gitop.web/src/main/java/com/pmease/gitop/web/page/account/setting/AccountSettingPage.java index d7d48afb65..cab84e5d35 100644 --- a/gitop.web/src/main/java/com/pmease/gitop/web/page/account/setting/AccountSettingPage.java +++ b/gitop.web/src/main/java/com/pmease/gitop/web/page/account/setting/AccountSettingPage.java @@ -1,7 +1,6 @@ package com.pmease.gitop.web.page.account.setting; import org.apache.shiro.SecurityUtils; -import org.apache.shiro.authz.annotation.RequiresAuthentication; import org.apache.wicket.behavior.AttributeAppender; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.basic.Label; @@ -23,7 +22,6 @@ import com.pmease.gitop.web.page.account.setting.profile.AccountProfilePage; import com.pmease.gitop.web.page.account.setting.repos.AccountReposPage; @SuppressWarnings("serial") -@RequiresAuthentication public abstract class AccountSettingPage extends AbstractLayoutPage { public static enum Category { diff --git a/gitop.web/src/main/java/com/pmease/gitop/web/page/account/setting/password/AccountPasswordPage.java b/gitop.web/src/main/java/com/pmease/gitop/web/page/account/setting/password/AccountPasswordPage.java index 67c5995aa2..02ea27940e 100644 --- a/gitop.web/src/main/java/com/pmease/gitop/web/page/account/setting/password/AccountPasswordPage.java +++ b/gitop.web/src/main/java/com/pmease/gitop/web/page/account/setting/password/AccountPasswordPage.java @@ -13,6 +13,7 @@ import org.apache.wicket.validation.ValidationError; import com.pmease.commons.loader.AppLoader; import com.pmease.gitop.core.manager.UserManager; import com.pmease.gitop.core.model.User; +import com.pmease.gitop.web.common.component.messenger.Messenger; import com.pmease.gitop.web.common.form.passwordfield.PasswordFieldElement; import com.pmease.gitop.web.model.UserModel; import com.pmease.gitop.web.page.account.setting.AccountSettingPage; @@ -76,9 +77,12 @@ public class AccountPasswordPage extends AccountSettingPage { User account = getAccount(); account.setPasswordHash(ps.encryptPassword(newPass)); AppLoader.getInstance(UserManager.class).save(account); - form.success("The password was changed successfully."); if (target != null) { + oldPass = null; + newPass = null; + confirmPass = null; target.add(form); + Messenger.success("Your password has been changed successfully.").execute(target); } } diff --git a/gitop.web/src/main/java/com/pmease/gitop/web/page/account/setting/profile/AccountProfilePage.html b/gitop.web/src/main/java/com/pmease/gitop/web/page/account/setting/profile/AccountProfilePage.html index b6dac86fb8..83b4d0544c 100644 --- a/gitop.web/src/main/java/com/pmease/gitop/web/page/account/setting/profile/AccountProfilePage.html +++ b/gitop.web/src/main/java/com/pmease/gitop/web/page/account/setting/profile/AccountProfilePage.html @@ -20,9 +20,23 @@

Change your avatar

-

- Here is your avatar? -

+
+
+
+ +

+ +

+

+ Supported image types are png, gif, jpg and jpeg. The image size should be less than 128K bytes. +

+
+ +
+
diff --git a/gitop.web/src/main/java/com/pmease/gitop/web/page/account/setting/profile/AccountProfilePage.java b/gitop.web/src/main/java/com/pmease/gitop/web/page/account/setting/profile/AccountProfilePage.java index 646c2a8dde..d47397e9ba 100644 --- a/gitop.web/src/main/java/com/pmease/gitop/web/page/account/setting/profile/AccountProfilePage.java +++ b/gitop.web/src/main/java/com/pmease/gitop/web/page/account/setting/profile/AccountProfilePage.java @@ -1,17 +1,33 @@ package com.pmease.gitop.web.page.account.setting.profile; +import java.io.File; +import java.io.IOException; + import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.bean.validation.PropertyValidator; +import org.apache.wicket.event.Broadcast; import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.upload.FileUpload; +import org.apache.wicket.markup.html.form.upload.FileUploadField; import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; +import com.google.common.base.Strings; +import com.google.common.base.Throwables; +import com.google.common.io.Files; import com.pmease.commons.loader.AppLoader; +import com.pmease.commons.util.FileUtils; import com.pmease.gitop.core.manager.UserManager; import com.pmease.gitop.core.model.User; +import com.pmease.gitop.web.SitePaths; +import com.pmease.gitop.web.common.component.messenger.Messenger; +import com.pmease.gitop.web.common.component.vex.AjaxConfirmButton; import com.pmease.gitop.web.common.form.FeedbackPanel; import com.pmease.gitop.web.common.form.textfield.TextFieldElement; +import com.pmease.gitop.web.component.avatar.AvatarChanged; +import com.pmease.gitop.web.component.avatar.AvatarImage; import com.pmease.gitop.web.model.UserModel; import com.pmease.gitop.web.page.account.setting.AccountSettingPage; @@ -31,10 +47,14 @@ public class AccountProfilePage extends AccountSettingPage { @Override protected void onInitialize() { super.onInitialize(); - - add(new ProfileForm("form", new UserModel(getAccount()))); + + IModel userModel = new UserModel(getAccount()); + add(new ProfileForm("form", userModel)); + + add(new AvatarImage("currentavatar", userModel)); + add(new AvatarForm("avatarForm", userModel)); } - + private class ProfileForm extends Form { public ProfileForm(String id, IModel model) { @@ -44,31 +64,123 @@ public class AccountProfilePage extends AccountSettingPage { @Override protected void onInitialize() { super.onInitialize(); - + @SuppressWarnings("unchecked") final IModel model = (IModel) getDefaultModel(); - + add(new FeedbackPanel("feedback", this)); add(new TextFieldElement("displayName", "Display Name", new PropertyModel(model, "displayName")) - .setRequired(false) - .add(new PropertyValidator())); + .setRequired(false).add(new PropertyValidator())); add(new TextFieldElement("email", "Email Address", new PropertyModel(model, "email")) .add(new PropertyValidator())); - + add(new AjaxButton("submit", this) { @Override protected void onError(AjaxRequestTarget target, Form form) { target.add(form); } - + @Override protected void onSubmit(AjaxRequestTarget target, Form form) { User user = model.getObject(); AppLoader.getInstance(UserManager.class).save(user); - form.success("Your profile has been updated"); - target.add(form); + Messenger.success("Account profile has been updated.") + .execute(target); + } + }); + } + } + + private class AvatarForm extends Form { + AvatarForm(String id, IModel model) { + super(id, model); + } + + private User getUser() { + return (User) getDefaultModelObject(); + } + + @Override + protected void onInitialize() { + super.onInitialize(); + + final FileUploadField uploadField = new FileUploadField("fileInput"); + uploadField.setRequired(false); + add(uploadField); + + add(new FeedbackPanel("feedback")); + add(new AjaxButton("submit", this) { + @Override + protected void onSubmit(AjaxRequestTarget target, Form form) { + FileUpload upload = uploadField.getFileUpload(); + if (upload == null) { + form.error("Please select an avatar file"); + target.add(form); + return; + } + + User user = getUser(); + if (upload != null) { + File dir = SitePaths.get().userAvatarDir(user); + if (!dir.exists()) { + try { + FileUtils.forceMkdir(dir); + } catch (IOException e) { + throw Throwables.propagate(e); + } + } + + String filename = upload.getClientFileName(); + String ext = Files.getFileExtension(filename); + File avatarFile; + + // delete old avatar file + String avatarPath = user.getAvatarUrl(); + if (!Strings.isNullOrEmpty(avatarPath) + && !(avatarPath.startsWith("http") || avatarPath + .startsWith("https"))) { + avatarFile = new File(dir, user.getAvatarUrl()); + // TODO: lock avatarFile for write + if (avatarFile.exists()) { + try { + FileUtils.forceDelete(avatarFile); + } catch (IOException e) { + throw Throwables.propagate(e); + } + } + } + + avatarFile = new File(dir, "avatar." + ext); + try { + upload.writeTo(avatarFile); + } catch (IOException e) { + throw Throwables.propagate(e); + } + + user.setAvatarUrl(avatarFile.getName()); + AppLoader.getInstance(UserManager.class).save(user); + + send(getPage(), Broadcast.BREADTH, new AvatarChanged(target)); + target.add(form); + Messenger.success("Your avatar has been changed!").execute(target);; + } + } + }); + + add(new AjaxConfirmButton("remove", this, + Model.of("Are you sure you want to use the default avatar?"), + null, Model.of("Yes"), Model.of("No"), null) { + @Override + protected void onSubmit(AjaxRequestTarget target, Form form) { + User user = getUser(); + user.setAvatarUrl(null); + AppLoader.getInstance(UserManager.class).save(user); + + send(getPage(), Broadcast.BREADTH, new AvatarChanged(target)); + Messenger.success("Your avatar has been reset to the default.").execute(target); + target.add(form); } }); } diff --git a/gitop.web/src/main/java/com/pmease/gitop/web/page/home/HomePage.html b/gitop.web/src/main/java/com/pmease/gitop/web/page/home/HomePage.html index f6a19f835f..d24a0b63ed 100644 --- a/gitop.web/src/main/java/com/pmease/gitop/web/page/home/HomePage.html +++ b/gitop.web/src/main/java/com/pmease/gitop/web/page/home/HomePage.html @@ -2,7 +2,7 @@

Messenger Test

-
+
ajax info ajax error ajax success @@ -11,6 +11,7 @@

Flat UI Form

+
diff --git a/gitop.web/src/main/java/com/pmease/gitop/web/page/home/HomePage.java b/gitop.web/src/main/java/com/pmease/gitop/web/page/home/HomePage.java index 4bc9fedbd8..43ae3514cc 100644 --- a/gitop.web/src/main/java/com/pmease/gitop/web/page/home/HomePage.java +++ b/gitop.web/src/main/java/com/pmease/gitop/web/page/home/HomePage.java @@ -13,6 +13,7 @@ import com.google.common.collect.ImmutableList; import com.pmease.gitop.web.common.component.messenger.Messenger; import com.pmease.gitop.web.common.component.vex.AjaxConfirmButton; import com.pmease.gitop.web.common.component.vex.VexLinkBehavior.VexIcon; +import com.pmease.gitop.web.common.form.FeedbackPanel; import com.pmease.gitop.web.common.form.flatcheckbox.FlatCheckBoxElement; import com.pmease.gitop.web.common.form.flatradio.FlatRadioElement; import com.pmease.gitop.web.page.AbstractLayoutPage; @@ -60,12 +61,20 @@ public class HomePage extends AbstractLayoutPage { Form form = new Form("form"); add(form); + form.add(new FeedbackPanel("feedback")); form.add(new FlatCheckBoxElement("check", new PropertyModel(this, "displayed"), Model.of("Displayed screen"))); form.add(new AjaxConfirmButton("btn", form, Model.of("Are you want to save this form?")) { @Override protected void onSubmit(AjaxRequestTarget target, Form form) { + if (displayed) { + form.info("yes"); + target.add(form); + return; + } + System.out.println("Here is " + vexIcon); + target.add(form); } });