Continue working on wicket components

This commit is contained in:
steve 2013-10-07 03:54:07 +08:00
parent 0ba160fca5
commit 283766c0c2
18 changed files with 260 additions and 67 deletions

15
.gitignore vendored
View File

@ -4,4 +4,17 @@ target/
.project .project
.settings/ .settings/
release.properties release.properties
pom.xml.releaseBackup pom.xml.releaseBackup
.loadpath
*.class
*~
*.lock
*.swp
*.out
*.tmp
*.bak
*.swp
*~.nib
*.DS_Store
*.log

View File

@ -42,7 +42,7 @@ public class SitePaths {
} }
public File userAvatarDir(User user) { public File userAvatarDir(User user) {
return userAvatarDir(checkNotNull(user)); return userAvatarDir(checkNotNull(user).getId());
} }
public File tempDir() { public File tempDir() {

View File

@ -251,6 +251,8 @@ a > .icon-null, .icon-null { display: inline-block; width: 10px; }
.avatar-circle { border-radius: 50%; } .avatar-circle { border-radius: 50%; }
.avatar-circle > img { border-radius: 50%; } .avatar-circle > img { border-radius: 50%; }
.avatar-xlarge { width: 128px; height: 128px; }
/** /**
* LAYOUT * LAYOUT
*/ */

View File

@ -5,6 +5,8 @@ import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior; import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior;
import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.behavior.AttributeAppender; 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.markup.html.form.Form;
import org.apache.wicket.model.IModel; 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"));
}
} }

View File

@ -4,7 +4,7 @@ import org.apache.wicket.Component;
import org.apache.wicket.behavior.Behavior; import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.head.IHeaderResponse; 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.IComponentAssignedModel;
import org.apache.wicket.model.IModel; import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model; import org.apache.wicket.model.Model;
@ -44,8 +44,10 @@ public class VexLinkBehavior extends Behavior {
public void renderHead(Component component, IHeaderResponse response) { public void renderHead(Component component, IHeaderResponse response) {
super.renderHead(component, response); super.renderHead(component, response);
response.render(JavaScriptHeaderItem.forReference(VexConfirmJavaScriptResourceReference.get())); String markupId = component.getMarkupId(true);
response.render(JavaScriptHeaderItem.forScript("vex.defaultOptions.className = 'vex-theme-wireframe'", "vex-theme-options")); response.render(OnDomReadyHeaderItem.forScript(String.format(
"$('#%s').on('click', function(e){e.preventDefault(); $(this).confirm(); });",
markupId)));
} }
@Override @Override

View File

@ -41,10 +41,4 @@
}); });
} }
$(document).ready(function() {
$('.confirm-link').click(function(e) {
e.preventDefault();
$(this).confirm();
})
});
}(window.jQuery, window, document); }(window.jQuery, window, document);

View File

@ -31,7 +31,6 @@ public class FeedbackPanel extends org.apache.wicket.markup.html.panel.FeedbackP
super.onInitialize(); super.onInitialize();
this.setOutputMarkupId(true); this.setOutputMarkupId(true);
add(AttributeModifier.append("class", new AbstractReadOnlyModel<String>() { add(AttributeModifier.append("class", new AbstractReadOnlyModel<String>() {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;

View File

@ -1,6 +1,10 @@
package com.pmease.gitop.web.common.form.flatcheckbox; package com.pmease.gitop.web.common.form.flatcheckbox;
import org.apache.wicket.Component; 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.basic.Label;
import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.model.IModel; import org.apache.wicket.model.IModel;
@ -29,6 +33,19 @@ public class FlatCheckBoxElement extends CheckBoxElement {
panel.add(label); panel.add(label);
panel.add(new FlatCheckBoxBehavior()); 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; return panel;
} }
} }

View File

@ -1,6 +1,10 @@
package com.pmease.gitop.web.common.form.flatradio; package com.pmease.gitop.web.common.form.flatradio;
import org.apache.wicket.Component; 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.basic.Label;
import org.apache.wicket.markup.html.form.Radio; import org.apache.wicket.markup.html.form.Radio;
import org.apache.wicket.model.IModel; import org.apache.wicket.model.IModel;
@ -19,12 +23,25 @@ public class FlatRadioElement<T> extends RadioButtonElement<T> {
this.descriptionModel = Model.of(description); this.descriptionModel = Model.of(description);
} }
@SuppressWarnings("serial")
@Override @Override
protected Component createInputComponent(String id) { protected Component createInputComponent(String id) {
radioContainer = new FlatRadioElementPanel(id); radioContainer = new FlatRadioElementPanel(id);
radioContainer.add(radio = createRadio("radio")); radioContainer.add(radio = createRadio("radio"));
radioContainer.add(new Label("description", descriptionModel)); radioContainer.add(new Label("description", descriptionModel));
radioContainer.add(new FlatRadioBehavior()); 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; return radioContainer;
} }

View File

@ -18,39 +18,43 @@ import com.pmease.gitop.web.component.avatar.AvatarImage.AvatarImageType;
public class AvatarImageResource extends DynamicImageResource { public class AvatarImageResource extends DynamicImageResource {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@Override @Override
protected byte[] getImageData(Attributes attributes) { protected byte[] getImageData(Attributes attributes) {
PageParameters params = attributes.getParameters(); PageParameters params = attributes.getParameters();
AvatarImageType imageType = AvatarImageType.valueOf(params.get("type").toString().toUpperCase()); AvatarImageType imageType = AvatarImageType.valueOf(params.get("type")
long id = params.get("id").toLong(); .toString().toUpperCase());
File avatarFile = null; long id = params.get("id").toLong();
File avatarFile = null;
if (imageType == AvatarImageType.USER) {
User user = AppLoader.getInstance(UserManager.class).get(id); 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()); if (!Strings.isNullOrEmpty(user.getAvatarUrl())) {
} avatarFile = new File(SitePaths.get().userAvatarDir(id),
} else { user.getAvatarUrl());
// Repository project = AppLoader.getInstance(RepositoryManager.class).get(id); }
// if (!Strings.isNullOrEmpty(project.getAvatarUrl())) { } else {
// avatarFile = new File(GitopWebApp.getProjectAvatarDir(id), project.getAvatarUrl()); // Repository project =
// } // AppLoader.getInstance(RepositoryManager.class).get(id);
} // if (!Strings.isNullOrEmpty(project.getAvatarUrl())) {
// avatarFile = new File(GitopWebApp.getProjectAvatarDir(id),
if (avatarFile != null && avatarFile.exists()) { // project.getAvatarUrl());
setFormat("image/" + Files.getFileExtension(avatarFile.getName())); // }
try { }
return Files.toByteArray(avatarFile);
} catch (IOException e) { if (avatarFile != null && avatarFile.exists()) {
throw Throwables.propagate(e); setFormat("image/" + Files.getFileExtension(avatarFile.getName()));
} try {
} else { return Files.toByteArray(avatarFile);
setFormat("image/png"); } catch (IOException e) {
return GitopWebApp.get().getDefaultUserAvatar(); throw Throwables.propagate(e);
} }
} } else {
setFormat("image/png");
return GitopWebApp.get().getDefaultUserAvatar();
}
}
} }

View File

@ -1,6 +1,5 @@
package com.pmease.gitop.web.page; package com.pmease.gitop.web.page;
import org.apache.shiro.SecurityUtils;
import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.markup.html.panel.Panel;
@ -40,7 +39,7 @@ public class GlobalHeaderPanel extends Panel {
} }
protected boolean isSignedIn() { protected boolean isSignedIn() {
return SecurityUtils.getSubject().isAuthenticated(); return currentUser().isPresent();
} }
protected Optional<User> currentUser() { protected Optional<User> currentUser() {

View File

@ -1,6 +1,5 @@
package com.pmease.gitop.web.page.account; 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.basic.Label;
import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.model.IModel; import org.apache.wicket.model.IModel;
@ -14,7 +13,6 @@ import com.pmease.gitop.core.model.User;
import com.pmease.gitop.web.page.AbstractLayoutPage; import com.pmease.gitop.web.page.AbstractLayoutPage;
@SuppressWarnings("serial") @SuppressWarnings("serial")
@RequiresAuthentication
public class AccountHomePage extends AbstractLayoutPage { public class AccountHomePage extends AbstractLayoutPage {
private final IModel<User> accountModel; private final IModel<User> accountModel;

View File

@ -1,7 +1,6 @@
package com.pmease.gitop.web.page.account.setting; package com.pmease.gitop.web.page.account.setting;
import org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.wicket.behavior.AttributeAppender; import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label; 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; import com.pmease.gitop.web.page.account.setting.repos.AccountReposPage;
@SuppressWarnings("serial") @SuppressWarnings("serial")
@RequiresAuthentication
public abstract class AccountSettingPage extends AbstractLayoutPage { public abstract class AccountSettingPage extends AbstractLayoutPage {
public static enum Category { public static enum Category {

View File

@ -13,6 +13,7 @@ import org.apache.wicket.validation.ValidationError;
import com.pmease.commons.loader.AppLoader; import com.pmease.commons.loader.AppLoader;
import com.pmease.gitop.core.manager.UserManager; import com.pmease.gitop.core.manager.UserManager;
import com.pmease.gitop.core.model.User; 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.common.form.passwordfield.PasswordFieldElement;
import com.pmease.gitop.web.model.UserModel; import com.pmease.gitop.web.model.UserModel;
import com.pmease.gitop.web.page.account.setting.AccountSettingPage; import com.pmease.gitop.web.page.account.setting.AccountSettingPage;
@ -76,9 +77,12 @@ public class AccountPasswordPage extends AccountSettingPage {
User account = getAccount(); User account = getAccount();
account.setPasswordHash(ps.encryptPassword(newPass)); account.setPasswordHash(ps.encryptPassword(newPass));
AppLoader.getInstance(UserManager.class).save(account); AppLoader.getInstance(UserManager.class).save(account);
form.success("The password was changed successfully.");
if (target != null) { if (target != null) {
oldPass = null;
newPass = null;
confirmPass = null;
target.add(form); target.add(form);
Messenger.success("Your password has been changed successfully.").execute(target);
} }
} }

View File

@ -20,9 +20,23 @@
<h3>Change your avatar</h3> <h3>Change your avatar</h3>
</div> </div>
<div class="padder"> <div class="padder">
<p> <div class="clearfix">
Here is your avatar? <div class="left avatar avatar-xlarge" wicket:id="currentavatar"></div>
</p> <form wicket:id="avatarForm" class="form-md" style="padding-left: 150px;">
<div wicket:id="feedback" class="form-feedback"></div>
<p>
<input type="file" wicket:id="fileInput" />
</p>
<p class="text-muted">
Supported image types are png, gif, jpg and jpeg. The image size should be less than 128K bytes.
</p>
<hr/>
<div class="btn-group btn-group-justified">
<a wicket:id="submit" class="btn btn-colorful-text btn-primary">Change avatar</a>
<a wicket:id="remove" class="btn btn-colorful-text btn-warning">Reset avatar</a>
</div>
</form>
</div>
</div> </div>
</section> </section>
</wicket:extend> </wicket:extend>

View File

@ -1,17 +1,33 @@
package com.pmease.gitop.web.page.account.setting.profile; 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.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.bean.validation.PropertyValidator; 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.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.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel; 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.loader.AppLoader;
import com.pmease.commons.util.FileUtils;
import com.pmease.gitop.core.manager.UserManager; import com.pmease.gitop.core.manager.UserManager;
import com.pmease.gitop.core.model.User; 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.FeedbackPanel;
import com.pmease.gitop.web.common.form.textfield.TextFieldElement; 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.model.UserModel;
import com.pmease.gitop.web.page.account.setting.AccountSettingPage; import com.pmease.gitop.web.page.account.setting.AccountSettingPage;
@ -31,10 +47,14 @@ public class AccountProfilePage extends AccountSettingPage {
@Override @Override
protected void onInitialize() { protected void onInitialize() {
super.onInitialize(); super.onInitialize();
add(new ProfileForm("form", new UserModel(getAccount()))); IModel<User> userModel = new UserModel(getAccount());
add(new ProfileForm("form", userModel));
add(new AvatarImage("currentavatar", userModel));
add(new AvatarForm("avatarForm", userModel));
} }
private class ProfileForm extends Form<User> { private class ProfileForm extends Form<User> {
public ProfileForm(String id, IModel<User> model) { public ProfileForm(String id, IModel<User> model) {
@ -44,31 +64,123 @@ public class AccountProfilePage extends AccountSettingPage {
@Override @Override
protected void onInitialize() { protected void onInitialize() {
super.onInitialize(); super.onInitialize();
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
final IModel<User> model = (IModel<User>) getDefaultModel(); final IModel<User> model = (IModel<User>) getDefaultModel();
add(new FeedbackPanel("feedback", this)); add(new FeedbackPanel("feedback", this));
add(new TextFieldElement<String>("displayName", "Display Name", add(new TextFieldElement<String>("displayName", "Display Name",
new PropertyModel<String>(model, "displayName")) new PropertyModel<String>(model, "displayName"))
.setRequired(false) .setRequired(false).add(new PropertyValidator<String>()));
.add(new PropertyValidator<String>()));
add(new TextFieldElement<String>("email", "Email Address", add(new TextFieldElement<String>("email", "Email Address",
new PropertyModel<String>(model, "email")) new PropertyModel<String>(model, "email"))
.add(new PropertyValidator<String>())); .add(new PropertyValidator<String>()));
add(new AjaxButton("submit", this) { add(new AjaxButton("submit", this) {
@Override @Override
protected void onError(AjaxRequestTarget target, Form<?> form) { protected void onError(AjaxRequestTarget target, Form<?> form) {
target.add(form); target.add(form);
} }
@Override @Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) { protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
User user = model.getObject(); User user = model.getObject();
AppLoader.getInstance(UserManager.class).save(user); AppLoader.getInstance(UserManager.class).save(user);
form.success("Your profile has been updated"); Messenger.success("Account profile has been updated.")
target.add(form); .execute(target);
}
});
}
}
private class AvatarForm extends Form<User> {
AvatarForm(String id, IModel<User> 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);
} }
}); });
} }

View File

@ -2,7 +2,7 @@
<wicket:extend> <wicket:extend>
<div class="container"> <div class="container">
<h2>Messenger Test</h2> <h2>Messenger Test</h2>
<div class="btn btn-group"> <div class="btn-group">
<a class="btn btn-info" wicket:id="ajaxinfo">ajax info</a> <a class="btn btn-info" wicket:id="ajaxinfo">ajax info</a>
<a class="btn btn-danger" wicket:id="ajaxerror">ajax error</a> <a class="btn btn-danger" wicket:id="ajaxerror">ajax error</a>
<a class="btn btn-success" wicket:id="ajaxsuccess">ajax success</a> <a class="btn btn-success" wicket:id="ajaxsuccess">ajax success</a>
@ -11,6 +11,7 @@
<h3>Flat UI Form</h3> <h3>Flat UI Form</h3>
<form class="custom-form" wicket:id="form"> <form class="custom-form" wicket:id="form">
<div wicket:id="feedback" class="form-feedback"></div>
<div wicket:id="check"></div> <div wicket:id="check"></div>
<wicket:container wicket:id="group"> <wicket:container wicket:id="group">

View File

@ -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.messenger.Messenger;
import com.pmease.gitop.web.common.component.vex.AjaxConfirmButton; 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.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.flatcheckbox.FlatCheckBoxElement;
import com.pmease.gitop.web.common.form.flatradio.FlatRadioElement; import com.pmease.gitop.web.common.form.flatradio.FlatRadioElement;
import com.pmease.gitop.web.page.AbstractLayoutPage; import com.pmease.gitop.web.page.AbstractLayoutPage;
@ -60,12 +61,20 @@ public class HomePage extends AbstractLayoutPage {
Form<?> form = new Form<Void>("form"); Form<?> form = new Form<Void>("form");
add(form); add(form);
form.add(new FeedbackPanel("feedback"));
form.add(new FlatCheckBoxElement("check", new PropertyModel<Boolean>(this, "displayed"), form.add(new FlatCheckBoxElement("check", new PropertyModel<Boolean>(this, "displayed"),
Model.of("Displayed screen"))); Model.of("Displayed screen")));
form.add(new AjaxConfirmButton("btn", form, Model.of("Are you want to save this form?")) { form.add(new AjaxConfirmButton("btn", form, Model.of("Are you want to save this form?")) {
@Override @Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) { protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
if (displayed) {
form.info("yes");
target.add(form);
return;
}
System.out.println("Here is " + vexIcon); System.out.println("Here is " + vexIcon);
target.add(form);
} }
}); });