This is an automated email from the ASF dual-hosted git repository.
solomax pushed a commit to branch csp
in repository https://gitbox.apache.org/repos/asf/openmeetings.git
The following commit(s) were added to refs/heads/csp by this push:
new 1684b9e [OPENMEETINGS-2165] signin page and dialogs are moved to
bootstrap
1684b9e is described below
commit 1684b9e606d3d575638081e345b04101e64a53cf
Author: Maxim Solodovnik <[email protected]>
AuthorDate: Sun Jan 26 21:03:11 2020 +0700
[OPENMEETINGS-2165] signin page and dialogs are moved to bootstrap
---
openmeetings-web/pom.xml | 7 +-
.../apache/openmeetings/web/app/Application.java | 6 +-
.../apache/openmeetings/web/common/Captcha.html | 2 +-
.../apache/openmeetings/web/common/Captcha.java | 24 +-
.../apache/openmeetings/web/pages/MainPage.java | 11 +-
.../apache/openmeetings/web/pages/ResetPage.html | 1 +
.../apache/openmeetings/web/pages/ResetPage.java | 20 +-
.../web/pages/auth/ForgetPasswordDialog.html | 51 +++--
.../web/pages/auth/ForgetPasswordDialog.java | 232 ++++++++++----------
.../web/pages/auth/RegisterDialog.html | 41 ++--
.../web/pages/auth/RegisterDialog.java | 152 ++++++-------
.../web/pages/auth/ResetPasswordDialog.html | 33 ++-
.../web/pages/auth/ResetPasswordDialog.java | 115 ++++------
.../openmeetings/web/pages/auth/SignInDialog.html | 70 +++---
.../openmeetings/web/pages/auth/SignInDialog.java | 243 +++++++++------------
.../openmeetings/web/pages/auth/SignInPage.html | 2 +
.../openmeetings/web/pages/auth/SignInPage.java | 71 +++++-
.../src/main/webapp/css/raw-general.css | 9 +-
18 files changed, 539 insertions(+), 551 deletions(-)
diff --git a/openmeetings-web/pom.xml b/openmeetings-web/pom.xml
index 2e39289..e50f39f 100644
--- a/openmeetings-web/pom.xml
+++ b/openmeetings-web/pom.xml
@@ -661,7 +661,7 @@
</dependency>
<dependency>
<groupId>de.agilecoders.wicket</groupId>
- <artifactId>wicket-bootstrap-core</artifactId>
+ <artifactId>wicket-bootstrap-extensions</artifactId>
<version>${wicket-bootstrap.version}</version>
</dependency>
<dependency>
@@ -670,6 +670,11 @@
<version>${wicket-bootstrap.version}</version>
</dependency>
<dependency>
+ <groupId>org.webjars</groupId>
+ <artifactId>font-awesome</artifactId>
+ <version>5.12.0</version>
+ </dependency>
+ <dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
index 0ad1235..988f386 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
@@ -144,8 +144,8 @@ import com.hazelcast.core.MembershipListener;
import de.agilecoders.wicket.core.Bootstrap;
import de.agilecoders.wicket.core.settings.BootstrapSettings;
import de.agilecoders.wicket.core.settings.IBootstrapSettings;
-import de.agilecoders.wicket.core.settings.SingleThemeProvider;
-import
de.agilecoders.wicket.themes.markup.html.material_design.MaterialDesignTheme;
+import de.agilecoders.wicket.themes.markup.html.bootswatch.BootswatchTheme;
+import
de.agilecoders.wicket.themes.markup.html.bootswatch.BootswatchThemeProvider;
@Component
public class Application extends AuthenticatedWebApplication implements
IApplication {
@@ -275,7 +275,7 @@ public class Application extends
AuthenticatedWebApplication implements IApplica
});
super.init();
final IBootstrapSettings settings = new BootstrapSettings();
- settings.setThemeProvider(new SingleThemeProvider(new
MaterialDesignTheme()));
+ settings.setThemeProvider(new
BootswatchThemeProvider(BootswatchTheme.Sandstone));//FIXME TODO new
SingleThemeProvider(new MaterialDesignTheme())
Bootstrap.builder().withBootstrapSettings(settings).install(this);
// register some widgets
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/Captcha.html
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/Captcha.html
index d83bf40..83fb55d 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/Captcha.html
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/Captcha.html
@@ -23,6 +23,6 @@
<wicket:panel>
<input type="text" wicket:id="captchaText"
wicket:message="placeholder:captcha.text,title:captcha.text"
class="captcha-text"/><br/>
<img wicket:id="captcha" class="captcha-img"/>
- <span wicket:id="refresh"
wicket:message="alt:lbl.refresh,title:lbl.refresh"><wicket:message
key="lbl.refresh"/></span>
+ <button wicket:id="refresh"
wicket:message="alt:lbl.refresh,title:lbl.refresh"></button>
</wicket:panel>
</html>
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/Captcha.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/Captcha.java
index 6f8f6df..7e6b3b5 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/Captcha.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/Captcha.java
@@ -25,6 +25,8 @@ import java.security.SecureRandom;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
import org.apache.wicket.extensions.markup.html.captcha.CaptchaImageResource;
+import org.apache.wicket.markup.head.CssHeaderItem;
+import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.markup.html.panel.Panel;
@@ -34,10 +36,11 @@ import org.apache.wicket.validation.IValidatable;
import org.apache.wicket.validation.IValidator;
import org.apache.wicket.validation.ValidationError;
-import com.googlecode.wicket.jquery.core.JQueryBehavior;
-import com.googlecode.wicket.jquery.core.Options;
-import com.googlecode.wicket.jquery.ui.JQueryIcon;
-import com.googlecode.wicket.jquery.ui.markup.html.link.AjaxLink;
+import
de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
+import de.agilecoders.wicket.core.markup.html.bootstrap.image.Icon;
+import
de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome5CssReference;
+import
de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome5IconType;
public class Captcha extends Panel {
private static final long serialVersionUID = 1L;
@@ -88,19 +91,22 @@ public class Captcha extends Panel {
}
}
}).setOutputMarkupId(true));
- add(new AjaxLink<String>("refresh") {
+ add(new BootstrapAjaxLink<>("refresh", Model.of(""),
Buttons.Type.Outline_Info, new ResourceModel("lbl.refresh")) {
private static final long serialVersionUID = 1L;
@Override
+ public void renderHead(IHeaderResponse response) {
+
response.render(CssHeaderItem.forReference(FontAwesome5CssReference.instance()));
+ }
+
+ @Override
public void onClick(AjaxRequestTarget target) {
captchaImageResource.invalidate();
target.add(captcha);
}
- @Override
- public void onConfigure(JQueryBehavior behavior) {
- behavior.setOption("icon",
Options.asString(JQueryIcon.REFRESH));
- behavior.setOption("showLabel", false);
+ protected Icon newIcon(String markupId) {
+ return new Icon(markupId,
FontAwesome5IconType.sync_s);
}
});
}
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java
index 605769a..3ac7238 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java
@@ -80,9 +80,6 @@ public class MainPage extends BaseInitedPage {
public MainPage() {
super();
- getHeader().setVisible(false);
- add(mainContainer.add(new
EmptyPanel(MAIN_PANEL_ID)).setOutputMarkupId(true));
- add(delayedLoad);
}
public void updateContents(OmUrlFragment f, IPartialPageRequestHandler
handler) {
@@ -90,6 +87,14 @@ public class MainPage extends BaseInitedPage {
}
@Override
+ protected void onInitialize() {
+ super.onInitialize();
+ getHeader().setVisible(false);
+ add(mainContainer.add(new
EmptyPanel(MAIN_PANEL_ID)).setOutputMarkupId(true));
+ add(delayedLoad);
+ }
+
+ @Override
protected boolean isMainPage() {
return true;
}
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/ResetPage.html
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/ResetPage.html
index b2d5649..6b754a7 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/ResetPage.html
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/ResetPage.html
@@ -22,5 +22,6 @@
<html xmlns:wicket="http://wicket.apache.org">
<wicket:extend>
<div wicket:id="resetPassword"></div>
+ <div wicket:id="resetInfo"></div>
</wicket:extend>
</html>
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/ResetPage.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/ResetPage.java
index 8660bf5..a497cbd 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/ResetPage.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/ResetPage.java
@@ -22,12 +22,26 @@ import org.apache.openmeetings.db.dao.user.UserDao;
import org.apache.openmeetings.db.entity.user.User;
import org.apache.openmeetings.web.app.Application;
import org.apache.openmeetings.web.pages.auth.ResetPasswordDialog;
+import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
+import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal.Backdrop;
+import
de.agilecoders.wicket.core.markup.html.bootstrap.dialog.TextContentModal;
+
public class ResetPage extends BaseNotInitedPage {
private static final long serialVersionUID = 1L;
public static final String RESET_PARAM = "hash";
+ private final Modal<String> resetInfo = new
TextContentModal("resetInfo", new ResourceModel("332")) {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void onClose(IPartialPageRequestHandler target) {
+ setResponsePage(Application.get().getSignInPageClass());
+ }
+ };
@SpringBean
private UserDao userDao;
@@ -36,7 +50,11 @@ public class ResetPage extends BaseNotInitedPage {
if (resetHash != null) {
User user = userDao.getUserByHash(resetHash);
if (user != null) {
- add(new ResetPasswordDialog("resetPassword",
user));
+ add(new ResetPasswordDialog("resetPassword",
user, resetInfo));
+ add(resetInfo.header(new ResourceModel("325"))
+ .addCloseButton(new
ResourceModel("54"))
+ .setUseCloseHandler(true)
+ .setBackdrop(Backdrop.STATIC));
return;
}
}
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.html
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.html
index 3f5411d..a9d11d2 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.html
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.html
@@ -20,32 +20,31 @@
-->
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org">
-<wicket:panel>
- <form wicket:id="form">
- <table>
- <tr wicket:id="type">
- <td>
- <label
wicket:for="email"><wicket:message key="313" /></label> <input
- type="radio" wicket:id="email"
/>
- </td>
- <td>
- <label
wicket:for="login"><wicket:message key="314" /></label> <input
- type="radio" wicket:id="login"
/>
- </td>
- </tr>
- <tr>
- <td><span wicket:id="label"></span></td>
- <td><input wicket:id="name" type="text" /></td>
- </tr>
- <tr>
- <td colspan="2">
- <div wicket:id="captcha"
class="centered"></div>
- </td>
- </tr>
- </table>
- <span wicket:id="feedback"></span>
+<wicket:extend>
+ <form wicket:id="form" class="signin-forget">
+ <div class="row form-group no-gutters" wicket:id="type">
+ <div class="col-6">
+ <div class="form-check form-check-inline">
+ <label class="form-check-label"
wicket:for="email"><wicket:message key="313" /></label>
+ <input class="form-check-input"
type="radio" wicket:id="email"/>
+ </div>
+ </div>
+ <div class="col-5">
+ <div class="form-check form-check-inline">
+ <label class="form-check-label"
wicket:for="login"><wicket:message key="314" /></label>
+ <input class="form-check-input"
type="radio" wicket:id="login"/>
+ </div>
+ </div>
+ </div>
+ <div class="row form-group no-gutters">
+ <div class="col-6"><label wicket:for="name"><span
wicket:id="label"></span></label></div>
+ <div class="col-5"><input wicket:id="name" type="text"
value=""/></div>
+ </div>
+ <div class="row form-group no-gutters">
+ <div class="col-12 centered" wicket:id="captcha"></div>
+ </div>
+ <div wicket:id="feedback"></div>
<input type="submit" wicket:id="submit"
class="invisible-form-component"/>
</form>
- <div wicket:id="confirmDialog"></div>
-</wicket:panel>
+</wicket:extend>
</html>
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java
index 9be2f6b..f5d1570 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java
@@ -23,9 +23,7 @@ import static
org.apache.openmeetings.util.OpenmeetingsVariables.getBaseUrl;
import static
org.apache.openmeetings.util.OpenmeetingsVariables.getMinLoginLength;
import static org.apache.openmeetings.web.app.Application.urlForPage;
-import java.util.Arrays;
import java.util.Date;
-import java.util.List;
import org.apache.openmeetings.core.mail.MailHandler;
import org.apache.openmeetings.db.dao.user.UserDao;
@@ -33,7 +31,6 @@ import org.apache.openmeetings.db.entity.user.User;
import org.apache.openmeetings.service.mail.template.ResetPasswordTemplate;
import org.apache.openmeetings.web.common.Captcha;
import org.apache.openmeetings.web.pages.ResetPage;
-import org.apache.openmeetings.web.util.NonClosableMessageDialog;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
@@ -46,6 +43,7 @@ import org.apache.wicket.markup.html.form.RadioGroup;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.util.string.Strings;
@@ -55,80 +53,26 @@ import org.apache.wicket.validation.Validatable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
-import com.googlecode.wicket.jquery.ui.widget.dialog.MessageDialog;
-
+import
de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxButton;
+import
de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
import
de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
-public class ForgetPasswordDialog extends AbstractFormDialog<String> {
+public class ForgetPasswordDialog extends Modal<String> {
private static final Logger log =
LoggerFactory.getLogger(ForgetPasswordDialog.class);
private static final long serialVersionUID = 1L;
- private DialogButton send;
- private DialogButton cancel;
private final NotificationPanel feedback = new
NotificationPanel("feedback");
private final IValidator<String> emailValidator =
RfcCompliantEmailAddressValidator.getInstance();
private final RequiredTextField<String> name = new
RequiredTextField<>("name", Model.of((String)null));
private final RadioGroup<Type> rg = new RadioGroup<>("type",
Model.of(Type.email));
private final Label label = new Label("label", Model.of(""));
private final Captcha captcha = new Captcha("captcha");
- private Form<String> form = new Form<>("form") {
- private static final long serialVersionUID = 1L;
-
- @Override
- protected void onInitialize() {
- super.onInitialize();
- add(feedback.setOutputMarkupId(true));
-
add(label.setDefaultModelObject(getString("315")).setOutputMarkupId(true));
- add(name.setOutputMarkupId(true));
- add(captcha);
- add(rg.add(new Radio<>("email", Model.of(Type.email)))
- .add(new Radio<>("login",
Model.of(Type.login)))
- .setOutputMarkupId(true));
- rg.add(new AjaxFormChoiceComponentUpdatingBehavior() {
- private static final long serialVersionUID = 1L;
-
- @Override
- protected void onUpdate(AjaxRequestTarget
target) {
- updateLabel(target);
- }
- });
- add(new AjaxButton("submit") { //FAKE button so
"submit-on-enter" works as expected
- private static final long serialVersionUID = 1L;
-
- @Override
- protected void onSubmit(AjaxRequestTarget
target) {
-
ForgetPasswordDialog.this.onSubmit(target, send);
- }
-
- @Override
- protected void onError(AjaxRequestTarget
target) {
-
ForgetPasswordDialog.this.onError(target, send);
- }
- });
- updateLabel(null);
- }
-
- @Override
- protected void onValidate() {
- String n = name.getConvertedInput();
- if (n != null) {
- IValidatable<String> val = new Validatable<>(n);
- Type type = rg.getConvertedInput();
- if (type == Type.email) {
- emailValidator.validate(val);
- if (!val.isValid()) {
- error(getString("234"));
- }
- }
- if (type == Type.login && n.length() <
getMinLoginLength()) {
- error(getString("104"));
- }
- }
- }
- };
+ private ForgetPasswordForm form = new ForgetPasswordForm("form");
private SignInDialog s;
- MessageDialog confirmDialog;
+ private final Modal<String> forgetInfoDialog;
+ private boolean wasReset = false;
+
@SpringBean
private UserDao userDao;
@SpringBean
@@ -139,25 +83,30 @@ public class ForgetPasswordDialog extends
AbstractFormDialog<String> {
, login
}
- public ForgetPasswordDialog(String id) {
- super(id, "");
+ public ForgetPasswordDialog(String id, Modal<String> forgetInfoDialog) {
+ super(id);
+ this.forgetInfoDialog = forgetInfoDialog;
}
@Override
protected void onInitialize() {
- setTitle(new ResourceModel("312"));
- send = new DialogButton("send", getString("317"));
- cancel = new DialogButton("cancel", getString("lbl.cancel"));
- add(form);
- confirmDialog = new NonClosableMessageDialog("confirmDialog",
getString("312"), getString("321")) {
+ header(new ResourceModel("312"));
+ setCloseOnEscapeKey(true);
+ setUseCloseHandler(true);
+ setBackdrop(Backdrop.STATIC);
+
+ addButton(new BootstrapAjaxButton("button", new
ResourceModel("317"), form, Buttons.Type.Primary) {
+ private static final long serialVersionUID = 1L;
+ }); // Send
+ addButton(new BootstrapAjaxLink<>("button", Model.of(""),
Buttons.Type.Secondary, new ResourceModel("lbl.cancel")) {
private static final long serialVersionUID = 1L;
- @Override
- public void onClose(IPartialPageRequestHandler handler,
DialogButton button) {
- s.open(handler);
+ public void onClick(AjaxRequestTarget target) {
+ ForgetPasswordDialog.this.close(target);
}
- };
- add(confirmDialog);
+ });
+
+ add(form);
super.onInitialize();
}
@@ -171,26 +120,22 @@ public class ForgetPasswordDialog extends
AbstractFormDialog<String> {
}
@Override
- protected void onOpen(IPartialPageRequestHandler handler) {
- super.onOpen(handler);
+ public Modal<String> show(IPartialPageRequestHandler handler) {
name.setModelObject(null);
rg.setModelObject(Type.email);
captcha.refresh(handler);
handler.add(rg);
updateLabel(handler);
+ wasReset = false;
+ return super.show(handler);
}
@Override
- public boolean isDefaultCloseEventEnabled() {
- return true;
- }
-
- @Override
- public void onClose(IPartialPageRequestHandler handler, DialogButton
button) {
- if (send.equals(button)){
- confirmDialog.open(handler);
+ public void onClose(IPartialPageRequestHandler handler) {
+ if (wasReset) {
+ forgetInfoDialog.show(handler);
} else {
- s.open(handler);
+ s.show(handler);
}
}
@@ -198,33 +143,6 @@ public class ForgetPasswordDialog extends
AbstractFormDialog<String> {
this.s = s;
}
- @Override
- protected List<DialogButton> getButtons() {
- return Arrays.asList(send, cancel);
- }
-
- @Override
- public DialogButton getSubmitButton() {
- return send;
- }
-
- @Override
- public Form<?> getForm() {
- return form;
- }
-
- @Override
- protected void onError(AjaxRequestTarget target, DialogButton btn) {
- target.add(feedback);
- }
-
- @Override
- protected void onSubmit(AjaxRequestTarget target, DialogButton btn) {
- String nm = name.getModelObject();
- Type type = rg.getModelObject();
- resetUser(type == Type.email ? nm : "", type == Type.login ? nm
: "");
- }
-
/**
* reset a username by a given mail oder login by sending a mail to the
* registered EMail-Address
@@ -272,4 +190,86 @@ public class ForgetPasswordDialog extends
AbstractFormDialog<String> {
mailHandler.send(email, getString("517"), template);
}
+
+ private class ForgetPasswordForm extends Form<String> {
+ private static final long serialVersionUID = 1L;
+
+ public ForgetPasswordForm(String id) {
+ super(id);
+ }
+
+ @Override
+ protected void onInitialize() {
+ super.onInitialize();
+ add(feedback.setOutputMarkupId(true));
+
add(label.setDefaultModelObject(getString("315")).setOutputMarkupId(true));
+ add(name.setOutputMarkupId(true));
+ add(captcha);
+ add(rg.add(new Radio<>("email", Model.of(Type.email)))
+ .add(new Radio<>("login",
Model.of(Type.login)))
+ .setOutputMarkupId(true));
+ rg.add(new AjaxFormChoiceComponentUpdatingBehavior() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void onUpdate(AjaxRequestTarget
target) {
+ updateLabel(target);
+ }
+ });
+ add(new AjaxButton("submit") { //FAKE button so
"submit-on-enter" works as expected
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void onSubmit(AjaxRequestTarget
target) {
+
ForgetPasswordForm.this.onSubmit(target);
+ }
+
+ @Override
+ protected void onError(AjaxRequestTarget
target) {
+ ForgetPasswordForm.this.onError(target);
+ }
+ });
+ updateLabel(null);
+ }
+
+ @Override
+ protected void onValidate() {
+ String n = name.getConvertedInput();
+ if (n != null) {
+ IValidatable<String> val = new Validatable<>(n);
+ Type type = rg.getConvertedInput();
+ if (type == Type.email) {
+ emailValidator.validate(val);
+ if (!val.isValid()) {
+ error(getString("234"));
+ }
+ }
+ if (type == Type.login && n.length() <
getMinLoginLength()) {
+ error(getString("104"));
+ }
+ }
+ }
+
+ @Override
+ protected void onError() {
+
RequestCycle.get().find(AjaxRequestTarget.class).ifPresent(this::onError);
+ }
+
+ private void onError(AjaxRequestTarget target) {
+ target.add(feedback);
+ }
+
+ @Override
+ protected void onSubmit() {
+
RequestCycle.get().find(AjaxRequestTarget.class).ifPresent(this::onSubmit);
+ }
+
+ private void onSubmit(AjaxRequestTarget target) {
+ String nm = name.getModelObject();
+ Type type = rg.getModelObject();
+ resetUser(type == Type.email ? nm : "", type ==
Type.login ? nm : "");
+ wasReset = true;
+ ForgetPasswordDialog.this.close(target);
+ }
+ };
}
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.html
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.html
index dafe6c8..ee087a1 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.html
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.html
@@ -20,28 +20,24 @@
-->
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org">
-<wicket:panel>
+<wicket:extend>
<form wicket:id="form">
- <table>
- <tr>
- <td><input wicket:id="firstName" type="text"
wicket:message="placeholder:117" value="" /></td>
- <td><input wicket:id="lastName" type="text"
wicket:message="placeholder:136" value="" /></td>
- </tr>
- <tr>
- <td><input wicket:id="login" type="text"
wicket:message="placeholder:114" value="" /></td>
- <td><input wicket:id="email" type="text"
wicket:message="placeholder:119" value="" /></td>
- </tr>
- <tr>
- <td><input wicket:id="password" type="password"
wicket:message="placeholder:110" value="" /></td>
- <td><input wicket:id="confirmPassword"
type="password" wicket:message="placeholder:116" value="" /></td>
- </tr>
- <tr>
- <td colspan="2">
- <div wicket:id="captcha"
class="centered"></div>
- </td>
- </tr>
- </table>
- <span wicket:id="feedback" class="error"></span>
+ <div class="row form-group no-gutters">
+ <div class="col-6"><input wicket:id="firstName"
type="text" wicket:message="placeholder:117" value=""/></div>
+ <div class="col-6"><input wicket:id="lastName"
type="text" wicket:message="placeholder:136" value=""/></div>
+ </div>
+ <div class="row form-group no-gutters">
+ <div class="col-6"><input wicket:id="login" type="text"
wicket:message="placeholder:114" value=""/></div>
+ <div class="col-6"><input wicket:id="email" type="text"
wicket:message="placeholder:119" value=""/></div>
+ </div>
+ <div class="row form-group no-gutters">
+ <div class="col-6"><input wicket:id="password"
type="password" wicket:message="placeholder:110" value=""/></div>
+ <div class="col-6"><input wicket:id="confirmPassword"
type="password" wicket:message="placeholder:116" value=""/></div>
+ </div>
+ <div class="row form-group no-gutters">
+ <div class="col-12 centered" wicket:id="captcha"></div>
+ </div>
+ <div wicket:id="feedback" class="error"></div>
<input type="submit" wicket:id="submit"
class="invisible-form-component"/>
</form>
<div>
@@ -50,6 +46,5 @@
<a wicket:id="link" target="_blank"><wicket:message
key="register.privacy.statement"/></a>
</wicket:message>
</div>
- <div wicket:id="confirmRegistration"></div>
-</wicket:panel>
+</wicket:extend>
</html>
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.java
index df7fdd1..581fad4 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.java
@@ -24,9 +24,6 @@ import static
org.apache.openmeetings.util.OpenmeetingsVariables.isSendRegisterE
import static
org.apache.openmeetings.util.OpenmeetingsVariables.isSendVerificationEmail;
import static
org.apache.wicket.validation.validator.StringValidator.minimumLength;
-import java.util.Arrays;
-import java.util.List;
-
import org.apache.openmeetings.core.util.StrongPasswordValidator;
import org.apache.openmeetings.db.dao.user.IUserManager;
import org.apache.openmeetings.db.dao.user.UserDao;
@@ -35,14 +32,11 @@ import org.apache.openmeetings.db.entity.user.User;
import org.apache.openmeetings.web.app.WebSession;
import org.apache.openmeetings.web.common.Captcha;
import org.apache.openmeetings.web.pages.PrivacyPage;
-import org.apache.openmeetings.web.util.NonClosableDialog;
-import org.apache.openmeetings.web.util.NonClosableMessageDialog;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
import
org.apache.wicket.extensions.validation.validator.RfcCompliantEmailAddressValidator;
import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.PasswordTextField;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.markup.html.form.StatelessForm;
@@ -51,25 +45,25 @@ import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.util.string.Strings;
import org.apache.wicket.validation.IValidatable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
-import com.googlecode.wicket.jquery.ui.widget.dialog.MessageDialog;
-
+import
de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
import
de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import
de.agilecoders.wicket.extensions.markup.html.bootstrap.ladda.LaddaAjaxButton;
-public class RegisterDialog extends NonClosableDialog<String> {
+public class RegisterDialog extends Modal<String> {
private static final long serialVersionUID = 1L;
private static final Logger log =
LoggerFactory.getLogger(RegisterDialog.class);
- private DialogButton cancelBtn;
- private DialogButton registerBtn;
private final NotificationPanel feedback = new
NotificationPanel("feedback");
private final IModel<String> tzModel =
Model.of(WebSession.get().getClientTZCode());
- private RegisterForm form;
+ private final RegisterForm form = new RegisterForm("form");
private SignInDialog s;
private Captcha captcha;
private String firstName;
@@ -79,8 +73,9 @@ public class RegisterDialog extends NonClosableDialog<String>
{
private String email;
private String country;
private Long lang;
+ private boolean wasRegistered = false;
- MessageDialog confirmRegistration;
+ private final Modal<String> registerInfo;
private boolean sendConfirmation = false;
private boolean sendEmailAtRegister = false;
@SpringBean
@@ -88,34 +83,28 @@ public class RegisterDialog extends
NonClosableDialog<String> {
@SpringBean
private UserDao userDao;
- public RegisterDialog(String id) {
- super(id, "");
- add(form = new RegisterForm("form"));
- form.setOutputMarkupId(true);
+ public RegisterDialog(String id, Modal<String> registerInfo) {
+ super(id);
+ this.registerInfo = registerInfo;
}
@Override
protected void onInitialize() {
- getTitle().setObject(getString("113"));
- cancelBtn = new DialogButton("cancel", getString("lbl.cancel"));
- registerBtn = new DialogButton("register", getString("121")) {
- private static final long serialVersionUID = 1L;
+ header(new ResourceModel("113"));
+ setCloseOnEscapeKey(true);
+ setUseCloseHandler(true);
+ setBackdrop(Backdrop.STATIC);
- @Override
- public boolean isIndicating() {
- return true;
- }
- };
- confirmRegistration = new
NonClosableMessageDialog("confirmRegistration", getString("235"),
getString("warn.notverified")) {
+ addButton(new LaddaAjaxButton("button", new
ResourceModel("121"), form, Buttons.Type.Primary)); // register
+ addButton(new BootstrapAjaxLink<>("button", Model.of(""),
Buttons.Type.Secondary, new ResourceModel("lbl.cancel")) {
private static final long serialVersionUID = 1L;
- @Override
- public void onClose(IPartialPageRequestHandler handler,
DialogButton button) {
- s.open(handler);
+ public void onClick(AjaxRequestTarget target) {
+ RegisterDialog.this.close(target);
}
- };
+ });
+ add(form);
add(new Label("register",
getString("121")).setRenderBodyOnly(true), new BookmarkablePageLink<>("link",
PrivacyPage.class));
- add(confirmRegistration);
reset(null);
super.onInitialize();
}
@@ -128,17 +117,8 @@ public class RegisterDialog extends
NonClosableDialog<String> {
tzModel.setObject(WebSession.get().getClientTZCode());
}
- @Override
- public int getWidth() {
- return 400;
- }
-
- @Override
- protected List<DialogButton> getButtons() {
- return Arrays.asList(registerBtn, cancelBtn);
- }
-
public void reset(IPartialPageRequestHandler handler) {
+ wasRegistered = false;
firstName = null;
lastName = null;
login = null;
@@ -151,7 +131,7 @@ public class RegisterDialog extends
NonClosableDialog<String> {
}
@Override
- protected void onOpen(IPartialPageRequestHandler handler) {
+ public Modal<String> show(IPartialPageRequestHandler handler) {
String baseURL = getBaseUrl();
sendEmailAtRegister = isSendRegisterEmail();
sendConfirmation = !Strings.isEmpty(baseURL) &&
isSendVerificationEmail();
@@ -159,45 +139,18 @@ public class RegisterDialog extends
NonClosableDialog<String> {
if (sendConfirmation && sendEmailAtRegister) {
messageCode = "warn.notverified";
}
- confirmRegistration.setModelObject(getString(messageCode));
+ registerInfo.setModelObject(getString(messageCode));
+ handler.add(registerInfo.get("content"));
reset(handler);
handler.add(form);
+ return super.show(handler);
}
@Override
- public void onClose(IPartialPageRequestHandler handler, DialogButton
button) {
- if (!registerBtn.equals(button)) {
- s.open(handler);
- }
- }
-
- @Override
- public DialogButton getSubmitButton() {
- return registerBtn;
- }
-
- @Override
- public Form<Void> getForm() {
- return form;
- }
-
- @Override
- protected void onError(AjaxRequestTarget target, DialogButton btn) {
- target.add(feedback);
- }
-
- @Override
- protected void onSubmit(AjaxRequestTarget target, DialogButton btn) {
- try {
- Object o = userManager.registerUser(login, password,
lastName
- , firstName, email, country, lang,
tzModel.getObject());
- if (o instanceof String) {
-
confirmRegistration.setModelObject(getString((String)o));
- }
- } catch (Exception e) {
- log.error("[registerUser]", e);
+ public void onClose(IPartialPageRequestHandler handler) {
+ if (!wasRegistered) {
+ s.show(handler);
}
- confirmRegistration.open(target);
}
@Override
@@ -217,6 +170,12 @@ public class RegisterDialog extends
NonClosableDialog<String> {
public RegisterForm(String id) {
super(id);
+ setOutputMarkupId(true);
+ }
+
+ @Override
+ protected void onInitialize() {
+ super.onInitialize();
add(feedback.setOutputMarkupId(true));
add(firstNameField = new
RequiredTextField<>("firstName", new PropertyModel<String>(RegisterDialog.this,
"firstName")));
add(lastNameField = new RequiredTextField<>("lastName",
new PropertyModel<String>(RegisterDialog.this, "lastName")));
@@ -225,11 +184,6 @@ public class RegisterDialog extends
NonClosableDialog<String> {
add(confirmPassword = new
PasswordTextField("confirmPassword", new
Model<String>()).setResetPassword(true));
add(emailField = new RequiredTextField<>("email", new
PropertyModel<String>(RegisterDialog.this, "email")));
add(captcha = new Captcha("captcha"));
- }
-
- @Override
- protected void onInitialize() {
- super.onInitialize();
firstNameField.setLabel(new ResourceModel("117"));
lastNameField.setLabel(new ResourceModel("136"));
loginField.add(minimumLength(getMinLoginLength())).setLabel(new
ResourceModel("114"));
@@ -253,12 +207,12 @@ public class RegisterDialog extends
NonClosableDialog<String> {
@Override
protected void onSubmit(AjaxRequestTarget
target) {
- RegisterDialog.this.onSubmit(target,
registerBtn);
+ RegisterForm.this.onSubmit(target);
}
@Override
protected void onError(AjaxRequestTarget
target) {
- RegisterDialog.this.onError(target,
registerBtn);
+ RegisterForm.this.onError(target);
}
});
}
@@ -284,5 +238,35 @@ public class RegisterDialog extends
NonClosableDialog<String> {
}
}
}
+
+ @Override
+ protected void onError() {
+
RequestCycle.get().find(AjaxRequestTarget.class).ifPresent(this::onError);
+ }
+
+ private void onError(AjaxRequestTarget target) {
+ target.add(feedback);
+ }
+
+ @Override
+ protected void onSubmit() {
+
RequestCycle.get().find(AjaxRequestTarget.class).ifPresent(this::onSubmit);
+ }
+
+ private void onSubmit(AjaxRequestTarget target) {
+ wasRegistered = true;
+ try {
+ Object o = userManager.registerUser(login,
password, lastName
+ , firstName, email, country,
lang, tzModel.getObject());
+ if (o instanceof String) {
+
registerInfo.setModelObject(getString((String)o));
+ target.add(registerInfo.get("content"));
+ }
+ } catch (Exception e) {
+ log.error("[registerUser]", e);
+ }
+ RegisterDialog.this.close(target);
+ registerInfo.show(target);
+ }
}
}
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.html
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.html
index 906cee8..2d8f9c5 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.html
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.html
@@ -20,25 +20,22 @@
-->
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org">
-<wicket:panel>
+<wicket:extend>
<form wicket:id="form">
- <table>
- <tr>
- <td><label wicket:for="login"><wicket:message
key="314" /></label></td>
- <td><input type="text" readonly="readonly"
wicket:id="login" /></td>
- </tr>
- <tr>
- <td><label
wicket:for="password"><wicket:message key="328" /></label></td>
- <td><input type="password" wicket:id="password"
/></td>
- </tr>
- <tr>
- <td><label
wicket:for="confirmPassword"><wicket:message key="116" /></label></td>
- <td><input type="password"
wicket:id="confirmPassword" /></td>
- </tr>
- </table>
- <span wicket:id="feedback"></span>
+ <div class="row form-group no-gutters">
+ <div class="desc col-6"><label
wicket:for="login"><wicket:message key="314"/></label></div>
+ <div class="col-5"><input type="text"
readonly="readonly" wicket:id="login"/></div>
+ </div>
+ <div class="row form-group no-gutters">
+ <div class="desc col-6"><label
wicket:for="password"><wicket:message key="328"/></label></div>
+ <div class="col-5"><input type="password"
wicket:id="password"/></div>
+ </div>
+ <div class="row form-group no-gutters">
+ <div class="desc col-6"><label
wicket:for="confirmPassword"><wicket:message key="116"/></label></div>
+ <div class="col-5"><input type="password"
wicket:id="confirmPassword"/></div>
+ </div>
+ <div wicket:id="feedback" class="error"></div>
<input type="submit" wicket:id="submit"
class="invisible-form-component"/>
</form>
- <div wicket:id="confirmReset"></div>
-</wicket:panel>
+</wicket:extend>
</html>
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java
index d388b41..1d945bc 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java
@@ -18,109 +18,56 @@
*/
package org.apache.openmeetings.web.pages.auth;
-import java.util.Arrays;
-import java.util.List;
-
import org.apache.openmeetings.core.util.StrongPasswordValidator;
import org.apache.openmeetings.db.dao.user.UserDao;
import org.apache.openmeetings.db.entity.user.User;
-import org.apache.openmeetings.web.app.Application;
-import org.apache.openmeetings.web.util.NonClosableDialog;
-import org.apache.openmeetings.web.util.NonClosableMessageDialog;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
-import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.PasswordTextField;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.spring.injection.annot.SpringBean;
-import com.googlecode.wicket.jquery.core.JQueryBehavior;
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
-import com.googlecode.wicket.jquery.ui.widget.dialog.MessageDialog;
-
+import
de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxButton;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
import
de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
-public class ResetPasswordDialog extends NonClosableDialog<String> {
+public class ResetPasswordDialog extends Modal<String> {
private static final long serialVersionUID = 1L;
- private DialogButton resetBtn;
private Form<String> form = new ResetForm("form");
private final NotificationPanel feedback = new
NotificationPanel("feedback");
private PasswordTextField password;
private final User user;
- MessageDialog confirmReset;
+ private final Modal<String> resetInfo;
+
@SpringBean
private UserDao userDao;
- public ResetPasswordDialog(String id, final User user) {
- super(id, "");
+ public ResetPasswordDialog(String id, final User user, Modal<String>
resetInfo) {
+ super(id);
this.user = user;
+ this.resetInfo = resetInfo;
}
@Override
protected void onInitialize() {
- getTitle().setObject(getString("325"));
- resetBtn = new DialogButton("reset", getString("327"));
+ header(new ResourceModel("325"));
+ setCloseOnEscapeKey(false);
+ setBackdrop(Backdrop.STATIC);
+ show(true);
+
add(form);
- confirmReset = new NonClosableMessageDialog("confirmReset",
getString("325"), getString("332")) {
+ addButton(new BootstrapAjaxButton("button", new
ResourceModel("327"), form, Buttons.Type.Primary) {
private static final long serialVersionUID = 1L;
-
- @Override
- public void onClose(IPartialPageRequestHandler handler,
DialogButton button) {
-
setResponsePage(Application.get().getSignInPageClass());
- }
- };
- add(confirmReset);
+ }); // Reset
super.onInitialize();
}
- @Override
- public void onConfigure(JQueryBehavior behavior) {
- super.onConfigure(behavior);
- behavior.setOption("autoOpen", true);
- }
-
- @Override
- protected List<DialogButton> getButtons() {
- return Arrays.asList(resetBtn);
- }
-
- @Override
- public DialogButton getSubmitButton() {
- return resetBtn;
- }
-
- @Override
- public Form<?> getForm() {
- return form;
- }
-
- @Override
- protected void onError(AjaxRequestTarget target, DialogButton btn) {
- target.add(feedback);
- }
-
- @Override
- protected void onSubmit(AjaxRequestTarget target, DialogButton btn) {
- try {
- userDao.resetPassword(user,
password.getConvertedInput());
- } catch (Exception e) {
- error(e.getMessage());
- }
- }
-
- @Override
- public void onClose(IPartialPageRequestHandler handler, DialogButton
button) {
- if (resetBtn.equals(button)) {
- confirmReset.open(handler);
- } else {
- setResponsePage(Application.get().getSignInPageClass());
- }
- }
-
private class ResetForm extends Form<String> {
private static final long serialVersionUID = 1L;
private TextField<String> login;
@@ -147,12 +94,12 @@ public class ResetPasswordDialog extends
NonClosableDialog<String> {
@Override
protected void onSubmit(AjaxRequestTarget
target) {
-
ResetPasswordDialog.this.onSubmit(target, resetBtn);
+ ResetForm.this.onSubmit(target);
}
@Override
protected void onError(AjaxRequestTarget
target) {
-
ResetPasswordDialog.this.onError(target, resetBtn);
+ ResetForm.this.onError(target);
}
});
}
@@ -165,5 +112,29 @@ public class ResetPasswordDialog extends
NonClosableDialog<String> {
}
super.onValidate();
}
+
+ @Override
+ protected void onError() {
+
RequestCycle.get().find(AjaxRequestTarget.class).ifPresent(this::onError);
+ }
+
+ protected void onError(AjaxRequestTarget target) {
+ target.add(feedback);
+ }
+
+ @Override
+ protected void onSubmit() {
+
RequestCycle.get().find(AjaxRequestTarget.class).ifPresent(this::onSubmit);
+ }
+
+ protected void onSubmit(AjaxRequestTarget target) {
+ try {
+ userDao.resetPassword(user,
password.getConvertedInput());
+ ResetPasswordDialog.this.close(target);
+ resetInfo.show(target);
+ } catch (Exception e) {
+ error(e.getMessage());
+ }
+ }
}
}
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.html
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.html
index 9031594..d510a92 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.html
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.html
@@ -20,44 +20,42 @@
-->
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org">
-<wicket:panel>
+<wicket:extend>
<form wicket:id="signin" class="signin">
- <table>
- <tr>
- <td>
- <table>
- <tr>
- <td
class="desc"><wicket:message key="109" /></td>
- <td><input
wicket:id="login" type="text" value="" /></td>
- </tr>
- <tr>
- <td
class="desc"><wicket:message key="110" /></td>
- <td><input
wicket:id="pass" type="password" value="" /></td>
- </tr>
- <tr wicket:id="ldap">
- <td
class="desc"><wicket:message key="1118" /></td>
- <td><select
wicket:id="domain"></select></td>
- </tr>
- <tr>
- <td></td>
- <td
class="remember"><input wicket:id="rememberMe"
- type="checkbox"
/><label wicket:for="rememberMe"><wicket:message key="288" /></label></td>
- </tr>
- <tr>
- <td><a
wicket:id="forget"><wicket:message key="311"/></a></td>
- <td><a
wicket:id="netTest" target="_blank"><wicket:message key="1527"/></a></td>
- </tr>
- </table>
- </td>
- <td wicket:id="oauthContainer"
class="oauth-section">
- <div wicket:id="oauthList">
- <button
wicket:id="oauthBtn"><span class="provider" wicket:id="label"></span></button>
+ <div class="row no-gutters">
+ <div wicket:id="credentials">
+ <div class="row form-group no-gutters">
+ <div class="desc col-6"><label
wicket:for="login"><wicket:message key="109"/></label></div>
+ <div class="col-5"><input
wicket:id="login" type="text" value=""/></div>
+ </div>
+ <div class="row form-group no-gutters">
+ <div class="desc col-6"><label
wicket:for="pass"><wicket:message key="110"/></label></div>
+ <div class="col-5"><input
wicket:id="pass" type="password" value=""/></div>
+ </div>
+ <div class="row form-group no-gutters"
wicket:id="ldap">
+ <div class="desc col-6"><label
wicket:for="domain"><wicket:message key="1118"/></label></div>
+ <div class="col-5"><select
wicket:id="domain"></select></div>
+ </div>
+ <div class="row form-group no-gutters">
+ <div class="col-6"></div>
+ <div class="col-5 remember">
+ <input wicket:id="rememberMe"
type="checkbox" />
+ <label
wicket:for="rememberMe"><wicket:message key="288" /></label>
</div>
- </td>
- </tr>
- </table>
- <span wicket:id="feedback" class="error"></span>
+ </div>
+ </div>
+ <div wicket:id="oauth" class="oauth-section col-4">
+ <div wicket:id="oauthList">
+ <button wicket:id="oauthBtn"><span
class="provider" wicket:id="label"></span></button>
+ </div>
+ </div>
+ </div>
+ <div wicket:id="feedback" class="error"></div>
+ <div class="row no-gutters">
+ <div class="col-6"><a class="text-primary"
wicket:id="forget"><wicket:message key="311"/></a></div>
+ <div class="col-5"><a class="text-primary"
wicket:id="netTest" target="_blank"><wicket:message key="1527"/></a></div>
+ </div>
<input type="submit" wicket:id="submit"
class="invisible-form-component"/>
</form>
-</wicket:panel>
+</wicket:extend>
</html>
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java
index d89cfb0..88f3bc2 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java
@@ -24,7 +24,6 @@ import static org.apache.openmeetings.web.pages.HashPage.APP;
import static org.apache.openmeetings.web.pages.HashPage.APP_TYPE_NETWORK;
import static org.apache.openmeetings.web.pages.auth.SignInPage.showAuth;
-import java.util.ArrayList;
import java.util.List;
import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
@@ -39,14 +38,12 @@ import
org.apache.openmeetings.web.app.OmAuthenticationStrategy;
import org.apache.openmeetings.web.app.WebSession;
import org.apache.openmeetings.web.common.OmAjaxClientInfoBehavior;
import org.apache.openmeetings.web.pages.HashPage;
-import org.apache.openmeetings.web.util.NonClosableDialog;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
-import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.CheckBox;
@@ -68,27 +65,26 @@ import org.apache.wicket.util.string.Strings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.googlecode.wicket.jquery.core.JQueryBehavior;
import com.googlecode.wicket.jquery.ui.effect.JQueryEffectBehavior;
import com.googlecode.wicket.jquery.ui.form.button.Button;
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
+import
de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
import
de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import
de.agilecoders.wicket.extensions.markup.html.bootstrap.ladda.LaddaAjaxButton;
-public class SignInDialog extends NonClosableDialog<String> {
+public class SignInDialog extends Modal<String> {
private static final long serialVersionUID = 1L;
private static final Logger log =
LoggerFactory.getLogger(SignInDialog.class);
private Form<String> form;
- private DialogButton loginBtn;
- private DialogButton registerBtn;
private final PasswordTextField passField = new
PasswordTextField("pass", Model.of(""));
private final RequiredTextField<String> loginField = new
RequiredTextField<>("login", Model.of(""));
private boolean rememberMe = false;
- private RegisterDialog r;
+ private RegisterDialog register;
private ForgetPasswordDialog f;
private LdapConfig domain;
- private SignInPage page;
- private final NotificationPanel feedback = new
NotificationPanel("feedback");
+ private NotificationPanel feedback = new NotificationPanel("feedback");
@SpringBean
private ConfigurationDao cfgDao;
@SpringBean
@@ -96,168 +92,86 @@ public class SignInDialog extends
NonClosableDialog<String> {
@SpringBean
private OAuth2Dao oauthDao;
- public SignInDialog(String id, SignInPage page) {
- super(id, "");
- this.page = page;
- add(form = new SignInForm("signin"));
+ public SignInDialog(String id) {
+ super(id);
add(new OmAjaxClientInfoBehavior());
}
@Override
protected void onInitialize() {
- getTitle().setObject(getString("108"));
- loginBtn = new DialogButton("login", getString("112")) {
+ add(form = new SignInForm("signin"));
+ header(new ResourceModel("108"));
+ show(true);
+ setCloseOnEscapeKey(false);
+ setBackdrop(Backdrop.STATIC);
+ addButton(new BootstrapAjaxLink<>("button", Model.of(""),
Buttons.Type.Secondary, new ResourceModel("123")) {
private static final long serialVersionUID = 1L;
- @Override
- public boolean isIndicating() {
- return true;
+ public void onClick(AjaxRequestTarget target) {
+ SignInDialog.this.close(target);
+ register.setClientTimeZone();
+ register.show(target);
}
- };
- registerBtn = new DialogButton("register", getString("123"));
- super.onInitialize();
- }
-
- public void setRegisterDialog(RegisterDialog r) {
- this.r = r;
- }
-
- public void setForgetPasswordDialog(ForgetPasswordDialog f) {
- this.f = f;
- }
+ });
+ addButton(new LaddaAjaxButton("button", new
ResourceModel("112"), form, Buttons.Type.Primary)); // Login
- @Override
- public void onConfigure(JQueryBehavior behavior) {
- super.onConfigure(behavior);
- behavior.setOption("autoOpen", true);
- }
-
- @Override
- public boolean isResizable() {
- return false;
- }
-
- @Override
- public boolean isDefaultCloseEventEnabled() {
- return false;
- }
-
- @Override
- public int getWidth() {
- return page.allowOAuthLogin()? 550: 450;
- }
-
- @Override
- public void onClose(IPartialPageRequestHandler handler, DialogButton
button) {
- if (registerBtn.equals(button)) {
- r.setClientTimeZone();
- r.open(handler);
- }
+ super.onInitialize();
}
@Override
- protected List<DialogButton> getButtons() {
- List<DialogButton> list = new ArrayList<>();
- if (page.allowRegister()) {
- list.add(registerBtn);
- }
- list.add(loginBtn);
- return list;
+ protected Component createHeaderCloseButton(String id) {
+ return super.createHeaderCloseButton(id).setVisible(false);
}
- @Override
- public DialogButton getSubmitButton() {
- return loginBtn;
+ public void setRegisterDialog(RegisterDialog r) {
+ this.register = r;
}
- @Override
- public Form<String> getForm() {
- return form;
+ public void setForgetPasswordDialog(ForgetPasswordDialog f) {
+ this.f = f;
}
private void shake(AjaxRequestTarget target) {
target.appendJavaScript(JQueryEffectBehavior.toString("#" +
getMarkupId(), "shake"));
}
- @Override
- public void onClick(AjaxRequestTarget target, DialogButton button) {
- if (registerBtn.equals(button) ||
WebSession.get().isSignedIn()) {
- super.onClick(target, button);
- }
- }
-
- @Override
- protected void onError(AjaxRequestTarget target, DialogButton btn) {
- shake(target);
- }
-
- @Override
- protected void onSubmit(AjaxRequestTarget target, DialogButton btn) {
- final String login =
String.format(domain.getAddDomainToUserName() ? "%s@%s" : "%s"
- , loginField.getModelObject(),
domain.getDomain());
- final String password = passField.getModelObject();
- OmAuthenticationStrategy strategy = getAuthenticationStrategy();
- WebSession ws = WebSession.get();
- Type type = domain.getId() > 0 ? Type.ldap : Type.user;
- boolean signIn = false;
- try {
- signIn = ws.signIn(login, password, type,
domain.getId());
- } catch (OmException e) {
- error(getString(e.getKey()));
- target.add(feedback);
- }
- if (signIn) {
- setResponsePage(Application.get().getHomePage());
- if (rememberMe) {
- strategy.save(login, password, type,
domain.getId());
- } else {
- strategy.remove();
- }
- } else {
- if (!hasErrorMessage()) {
- error(getString("error.bad.credentials"));
- target.add(feedback);
- }
- // add random timeout
- try {
- Thread.sleep(6 + (long)(10 * Math.random() *
1000));
- } catch (InterruptedException e) {
- log.error("Unexpected exception while
sleeping", e);
- }
- strategy.remove();
- shake(target);
- }
- }
-
class SignInForm extends StatelessForm<String> {
private static final long serialVersionUID = 1L;
+ private final WebMarkupContainer credentials = new
WebMarkupContainer("credentials");
public SignInForm(String id) {
super(id);
+ }
+ @Override
+ protected void onInitialize() {
+ loginField.setLabel(new ResourceModel("114"));
+ passField.setLabel(new ResourceModel("110"));
+ super.onInitialize();
if (WebSession.get().isSignedIn()) {
alreadyLoggedIn();
}
- add(feedback.setOutputMarkupId(true));
- add(loginField, passField.setResetPassword(true));
+ add(credentials, feedback.setOutputMarkupId(true));
+ credentials.add(loginField,
passField.setResetPassword(true));
List<LdapConfig> ldaps = ldapDao.get();
+ final boolean showLdap = ldaps.size() > 1;
int selectedLdap =
cfgDao.getInt(CONFIG_DEFAULT_LDAP_ID, 0);
domain = ldaps.get(selectedLdap < ldaps.size() &&
selectedLdap > 0 ? selectedLdap : 0);
- add(new WebMarkupContainer("ldap")
+ credentials.add(new WebMarkupContainer("ldap")
.add(new DropDownChoice<>("domain", new
PropertyModel<LdapConfig>(SignInDialog.this, "domain")
- , ldaps, new
ChoiceRenderer<LdapConfig>("name", "id"))).setVisible(ldaps.size() > 1));
- add(new CheckBox("rememberMe", new
PropertyModel<Boolean>(SignInDialog.this,
"rememberMe")).setOutputMarkupId(true));
+ , ldaps, new
ChoiceRenderer<LdapConfig>("name", "id"))).setVisible(showLdap));
+ credentials.add(new CheckBox("rememberMe", new
PropertyModel<Boolean>(SignInDialog.this,
"rememberMe")).setOutputMarkupId(true));
AjaxButton ab = new AjaxButton("submit") { //FAKE
button so "submit-on-enter" works as expected
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit(AjaxRequestTarget
target) {
- SignInDialog.this.onSubmit(target,
loginBtn);
+ SignInForm.this.onSubmit(target);
}
@Override
protected void onError(AjaxRequestTarget
target) {
- SignInDialog.this.onError(target,
loginBtn);
+ SignInForm.this.onError(target);
}
};
add(ab);
@@ -267,13 +181,14 @@ public class SignInDialog extends
NonClosableDialog<String> {
@Override
public void onClick(AjaxRequestTarget target) {
- SignInDialog.this.close(target, null);
- f.open(target);
+ SignInDialog.this.close(target);
+ f.show(target);
}
});
add(new
WebMarkupContainer("netTest").add(AttributeModifier.append("href"
,
RequestCycle.get().urlFor(HashPage.class, new PageParameters().add(APP,
APP_TYPE_NETWORK)).toString())));
- add(new WebMarkupContainer("oauthContainer").add(
+ final boolean showOauth =
((SignInPage)getPage()).allowOAuthLogin();
+ add(new WebMarkupContainer("oauth").add(
new ListView<>("oauthList",
oauthDao.getActive()) {
private static final long
serialVersionUID = 1L;
@@ -295,14 +210,11 @@ public class SignInDialog extends
NonClosableDialog<String> {
btn.add(lbl);
item.add(btn.setDefaultFormProcessing(false)); //skip all rules, go to redirect
}
- }).setVisible(page.allowOAuthLogin()));
- }
-
- @Override
- protected void onInitialize() {
- loginField.setLabel(new ResourceModel("114"));
- passField.setLabel(new ResourceModel("110"));
- super.onInitialize();
+ }).setVisible(showOauth));
+ credentials.add(AttributeModifier.append("class",
showOauth ? "col-8" : "col-12"));
+ if (showOauth) {
+ add(AttributeModifier.append("class", "wide"));
+ }
}
private void alreadyLoggedIn() {
@@ -311,5 +223,56 @@ public class SignInDialog extends
NonClosableDialog<String> {
// Ups, no original destination. Go to the home page
throw new
RestartResponseException(Application.get().getHomePage());
}
+
+ @Override
+ protected void onError() {
+
RequestCycle.get().find(AjaxRequestTarget.class).ifPresent(this::onError);
+ }
+
+ protected void onError(AjaxRequestTarget target) {
+ shake(target);
+ }
+
+ @Override
+ protected void onSubmit() {
+
RequestCycle.get().find(AjaxRequestTarget.class).ifPresent(this::onSubmit);
+ }
+
+ protected void onSubmit(AjaxRequestTarget target) {
+ final String login =
String.format(domain.getAddDomainToUserName() ? "%s@%s" : "%s"
+ , loginField.getModelObject(),
domain.getDomain());
+ final String password = passField.getModelObject();
+ OmAuthenticationStrategy strategy =
getAuthenticationStrategy();
+ WebSession ws = WebSession.get();
+ Type type = domain.getId() > 0 ? Type.ldap : Type.user;
+ boolean signIn = false;
+ try {
+ signIn = ws.signIn(login, password, type,
domain.getId());
+ } catch (OmException e) {
+ error(getString(e.getKey()));
+ target.add(feedback);
+ }
+ if (signIn) {
+
setResponsePage(Application.get().getHomePage());
+ if (rememberMe) {
+ strategy.save(login, password, type,
domain.getId());
+ } else {
+ strategy.remove();
+ }
+ } else {
+ if (!hasErrorMessage()) {
+
error(getString("error.bad.credentials"));
+ target.add(feedback);
+ }
+ // add random timeout
+ try {
+ Thread.sleep(6 + (long)(10 *
Math.random() * 1000));
+ } catch (InterruptedException e) {
+ log.error("Unexpected exception while
sleeping", e);
+ }
+ strategy.remove();
+ shake(target);
+ }
+ }
}
}
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.html
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.html
index 55174ff..7e11518 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.html
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.html
@@ -23,7 +23,9 @@
<wicket:extend>
<div wicket:id="signin"></div>
<div wicket:id="register"></div>
+ <div wicket:id="registerInfo"></div>
<div wicket:id="forget"></div>
+ <div wicket:id="forgetInfo"></div>
<div wicket:id="kick"></div>
</wicket:extend>
</html>
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
index 0d7c8e2..0bfb0c2 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
@@ -58,6 +58,8 @@ import org.apache.openmeetings.web.app.Application;
import org.apache.openmeetings.web.app.WebSession;
import org.apache.openmeetings.web.pages.BaseInitedPage;
import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
+import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.request.IRequestParameters;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.flow.RedirectToUrlException;
@@ -70,11 +72,46 @@ import org.slf4j.LoggerFactory;
import com.github.openjson.JSONException;
import com.github.openjson.JSONObject;
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal.Backdrop;
+import
de.agilecoders.wicket.core.markup.html.bootstrap.dialog.TextContentModal;
+
public class SignInPage extends BaseInitedPage {
private static final long serialVersionUID = 1L;
private static final Logger log =
LoggerFactory.getLogger(SignInPage.class);
- private SignInDialog d;
- private KickMessageDialog m;
+ private SignInDialog signin;
+ private KickMessageDialog kick;
+ private final Modal<String> forgetInfoDialog = new
TextContentModal("forgetInfo", new ResourceModel("321")) {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void onClose(IPartialPageRequestHandler handler) {
+ signin.show(handler);
+ }
+ };
+ private final ForgetPasswordDialog forget = new
ForgetPasswordDialog("forget", forgetInfoDialog);
+ private final Modal<String> registerInfoDialog = new
TextContentModal("registerInfo", new ResourceModel("warn.notverified")) {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void onInitialize() {
+ super.onInitialize();
+ get("content").setOutputMarkupId(true);
+ }
+
+ @Override
+ public Modal<String> setModelObject(String obj) {
+ super.setModelObject(obj);
+ get("content").setDefaultModelObject(obj);
+ return this;
+ }
+
+ @Override
+ protected void onClose(IPartialPageRequestHandler handler) {
+ signin.show(handler);
+ }
+ };
+ RegisterDialog r = new RegisterDialog("register", registerInfoDialog);
@SpringBean
private ConfigurationDao cfgDao;
@SpringBean
@@ -136,16 +173,26 @@ public class SignInPage extends BaseInitedPage {
protected void onInitialize() {
super.onInitialize();
- RegisterDialog r = new RegisterDialog("register");
- ForgetPasswordDialog f = new ForgetPasswordDialog("forget");
- d = new SignInDialog("signin", this);
- d.setRegisterDialog(r);
- d.setForgetPasswordDialog(f);
- r.setSignInDialog(d);
- f.setSignInDialog(d);
- m = new KickMessageDialog("kick");
- add(d.setVisible(!WebSession.get().isKickedByAdmin()),
- r.setVisible(allowRegister()), f,
m.setVisible(WebSession.get().isKickedByAdmin()));
+ signin = new SignInDialog("signin");
+ signin.setRegisterDialog(r);
+ signin.setForgetPasswordDialog(forget);
+ r.setSignInDialog(signin);
+ forget.setSignInDialog(signin);
+ kick = new KickMessageDialog("kick");
+ add(signin.setVisible(!WebSession.get().isKickedByAdmin()),
+ r.setVisible(allowRegister()), forget,
kick.setVisible(WebSession.get().isKickedByAdmin()));
+ add(forgetInfoDialog
+ .header(new ResourceModel("312"))
+ .addCloseButton(new ResourceModel("54"))
+ .setUseCloseHandler(true)
+ .setBackdrop(Backdrop.STATIC)
+ );
+ add(registerInfoDialog
+ .header(new ResourceModel("235"))
+ .addCloseButton(new ResourceModel("54"))
+ .setUseCloseHandler(true)
+ .setBackdrop(Backdrop.STATIC)
+ );
}
boolean allowRegister() {
diff --git a/openmeetings-web/src/main/webapp/css/raw-general.css
b/openmeetings-web/src/main/webapp/css/raw-general.css
index 1c1fcbb..b054b4e 100644
--- a/openmeetings-web/src/main/webapp/css/raw-general.css
+++ b/openmeetings-web/src/main/webapp/css/raw-general.css
@@ -21,12 +21,6 @@ html, body {
box-sizing: content-box; /* IE */
box-sizing: initial; /*reset bootstrap box sizing*/
}
-.signin input:not([type='checkbox']):not([type='radio']), .signin select {
- width: 170px;
-}
-.signin td.desc {
- width: 200px;
-}
.signin .oauth-section {
border-left: 2px dotted;
padding-left: 5px;
@@ -40,6 +34,9 @@ html, body {
.signin .remember {
white-space: nowrap;
}
+.signin-forget .form-check-label {
+ padding-right: 10px;
+}
#header {
font-size: 28px;
line-height: 40px;