You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2020/02/07 18:40:02 UTC

[openmeetings] branch csp updated: [OPENMEETINGS-2165] more work on admin panels

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 a3106aa  [OPENMEETINGS-2165] more work on admin panels
a3106aa is described below

commit a3106aa053d2f5c440d473fa9c9740d7e49ae169
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Sat Feb 8 01:39:47 2020 +0700

    [OPENMEETINGS-2165] more work on admin panels
---
 .../openmeetings/web/admin/backup/BackupPanel.html |  5 +-
 .../openmeetings/web/admin/backup/BackupPanel.java |  4 +-
 .../web/admin/connection/ConnectionsPanel.html     |  2 +-
 .../web/admin/connection/ConnectionsPanel.java     | 31 +++++---
 .../web/admin/labels/AddLanguageDialog.java        |  2 +-
 .../openmeetings/web/admin/ldaps/LdapsPanel.html   |  4 +-
 .../openmeetings/web/admin/rooms/RoomsPanel.html   | 17 ++--
 .../web/admin/users/PasswordDialog.html            |  4 +-
 .../web/admin/users/PasswordDialog.java            | 91 +++++++++-------------
 .../openmeetings/web/admin/users/UserForm.html     | 25 +++---
 .../openmeetings/web/admin/users/UserForm.java     |  6 +-
 .../openmeetings/web/common/ComunityUserForm.html  | 28 ++++---
 .../openmeetings/web/common/GeneralUserForm.html   | 49 +++++++-----
 .../openmeetings/web/room/NicknameDialog.java      |  2 +-
 .../web/room/poll/CreatePollDialog.java            |  2 +-
 .../openmeetings/web/room/poll/VoteDialog.java     |  2 +-
 .../web/user/InviteUserToRoomDialog.html           |  2 +-
 .../openmeetings/web/user/MessageDialog.html       |  2 +-
 .../openmeetings/web/user/rooms/RoomListPanel.html | 24 +++---
 .../openmeetings/web/user/rooms/RoomListPanel.java | 35 +++++----
 .../web/user/rooms/RoomsSelectorPanel.html         |  2 +-
 .../web/user/rooms/RoomsSelectorPanel.java         |  2 +-
 .../web/user/rooms/RoomsTabbedPanel.html           |  7 +-
 .../web/user/rooms/RoomsTabbedPanel.java           | 34 ++------
 openmeetings-web/src/main/webapp/css/raw-admin.css | 58 --------------
 .../src/main/webapp/css/raw-general-rtl.css        |  8 --
 .../src/main/webapp/css/raw-general.css            | 49 +-----------
 27 files changed, 187 insertions(+), 310 deletions(-)

diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.html
index 0a65c97..e4b7f44 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.html
@@ -26,7 +26,7 @@
 		<fieldset class="ui-widget-content">
 			<legend class="ui-widget-header"><wicket:message key="1066" /></legend>
 			<div class="formelement">
-				<div class="info-text"><wicket:message key="1065" /></div>
+				<div><i class="fas fa-info-circle m-1"></i><wicket:message key="1065" /></div>
 			</div>
 			<div class="formelement">
 				<label wicket:for="includeFilesInBackup"><wicket:message key="1537" /></label> <input type="checkbox" wicket:id="includeFilesInBackup" />
@@ -50,7 +50,8 @@
 			</div>
 			<div class="formelement">
 				<!-- Backup CLI import information -->
-				<div class="info-text" wicket:id="cmdLineDesc"></div>
+				<i class="fas fa-info-circle m-1"></i>
+				<div wicket:id="cmdLineDesc"></div>
 			</div>
 		</fieldset>
 	</form>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java
index bf0951c..0971cba 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.java
@@ -215,7 +215,7 @@ public class BackupPanel extends AdminBasePanel {
 					target.add(feedback);
 				}
 			}));
-			add(new Label("cmdLineDesc", getString("1505")).setEscapeModelStrings(false));
+			add(new Label("cmdLineDesc", getString("1505")).setEscapeModelStrings(false).setRenderBodyOnly(true));
 			super.onInitialize();
 		}
 
@@ -250,7 +250,7 @@ public class BackupPanel extends AdminBasePanel {
 	public BackupPanel(String id) {
 		super(id);
 
-		add(feedback);
+		add(feedback.setOutputMarkupId(true));
 
 		BackupForm backupForm = new BackupForm("backupUpload");
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.html
index 51f2c88..76a2b2e 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.html
@@ -40,7 +40,7 @@
 					<td class="col-2" wicket:id="login"></td>
 					<td class="col-2" wicket:id="since"></td>
 					<td class="col-2" wicket:id="scope"></td>
-					<td class="col-2"><a wicket:id="kick"><wicket:message key="603" /></a></td>
+					<td class="col-2 p-0"><a wicket:id="kick" class="om-kick-btn"></a></td>
 					<td class="col-2" wicket:id="server"></td>
 				</tr>
 			</tbody>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
index a5cc37c..b939d94 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
@@ -19,6 +19,7 @@
 package org.apache.openmeetings.web.admin.connection;
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
+import static org.apache.openmeetings.web.util.CallbackFunctionHelper.newOkCancelConfirmCfg;
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
@@ -32,7 +33,6 @@ import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.web.admin.AdminBasePanel;
 import org.apache.openmeetings.web.admin.SearchableDataView;
 import org.apache.openmeetings.web.app.ClientManager;
-import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
 import org.apache.openmeetings.web.common.PagedEntityListPanel;
 import org.apache.openmeetings.web.data.SearchableDataProvider;
 import org.apache.wicket.AttributeModifier;
@@ -42,9 +42,12 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.markup.repeater.RepeatingView;
+import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
-import com.googlecode.wicket.jquery.ui.form.button.ButtonBehavior;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.confirmation.ConfirmationBehavior;
 
 public class ConnectionsPanel extends AdminBasePanel {
 	private static final long serialVersionUID = 1L;
@@ -86,22 +89,26 @@ public class ConnectionsPanel extends AdminBasePanel {
 			@Override
 			protected void populateItem(final Item<Client> item) {
 				Client c = item.getModelObject();
-				final ConfirmableAjaxBorder confirm = new ConfirmableAjaxBorder("kick", getString("603"), getString("605")) {
+				item.add(new Label("type", "html5"));
+				item.add(new Label("login", c.getUser().getLogin()));
+				item.add(new Label("since", c.getConnectedSince()));
+				item.add(new Label("scope", c.getRoom() == null ? "html5" : "" + c.getRoom().getId()));
+				item.add(new Label("server", c.getServerId()));
+				item.add(new BootstrapAjaxLink<String>("kick", null, Buttons.Type.Outline_Danger, new ResourceModel("603")) {
 					private static final long serialVersionUID = 1L;
+					{
+						setSize(Buttons.Size.Small);
+						add(new ConfirmationBehavior(/*TODO https://github.com/l0rdn1kk0n/wicket-bootstrap/issues/845 ".om-kick-btn", */newOkCancelConfirmCfg(container, getString("605"))
+								.withSingleton(true)
+								));
+					}
 
 					@Override
-					protected void onSubmit(AjaxRequestTarget target) {
+					public void onClick(AjaxRequestTarget target) {
 						cm.invalidate(c.getUserId(), c.getSessionId());
 						target.add(container, details.setVisible(false));
 					}
-				};
-				confirm.setOutputMarkupId(true).add(new ButtonBehavior(String.format("#%s", confirm.getMarkupId())));
-				item.add(new Label("type", "html5"));
-				item.add(new Label("login", c.getUser().getLogin()));
-				item.add(new Label("since", c.getConnectedSince()));
-				item.add(new Label("scope", c.getRoom() == null ? "html5" : "" + c.getRoom().getId()));
-				item.add(new Label("server", c.getServerId()));
-				item.add(confirm);
+				});
 				item.add(new AjaxEventBehavior(EVT_CLICK) {
 					private static final long serialVersionUID = 1L;
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/AddLanguageDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/AddLanguageDialog.java
index 87a2466..2651058 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/AddLanguageDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/AddLanguageDialog.java
@@ -50,7 +50,7 @@ public class AddLanguageDialog extends AbstractFormDialog<String> {
 	public AddLanguageDialog(String id, final LangPanel langPanel) {
 		super(id, "");
 		this.langPanel = langPanel;
-		add(form.add(feedback, iso.setOutputMarkupId(true)));
+		add(form.add(feedback.setOutputMarkupId(true), iso.setOutputMarkupId(true)));
 		iso.add(new IValidator<String>() {
 			private static final long serialVersionUID = 1L;
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapsPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapsPanel.html
index 259a51d..5c1b4f6 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapsPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapsPanel.html
@@ -65,12 +65,12 @@
 						<label><wicket:message key="269" /></label><span wicket:id="updatedby.login"/>
 					</div>
 					<div class="formelement">
-						<div class="info-text"><wicket:message key="1114" /></div>
+						<div><i class="fas fa-info-circle m-1"></i><wicket:message key="1114" /></div>
 						<br/>
 						<label wicket:for="configFileName"><wicket:message key="1115" /></label><input type="text" wicket:id="configFileName"/>
 					</div>
 					<div class="formelement">
-						<div class="info-text"><wicket:message key="1116" /></div>
+						<div><i class="fas fa-info-circle m-1"></i><wicket:message key="1116" /></div>
 						<br/>
 						<label wicket:for="addDomainToUserName"><wicket:message key="1117" /></label><input type="checkbox" class="formcheckbox" wicket:id="addDomainToUserName"/>
 					</div>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.html
index d702812..7d96379 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.html
@@ -72,7 +72,7 @@
 						<label wicket:for="ispublic"><wicket:message key="190" /></label><input type="checkbox" class="formcheckbox" wicket:id="ispublic" />
 					</div>
 					<div class="formelement">
-						<div class="info-text"><wicket:message key="828" /></div>
+						<i class="fas fa-info-circle m-1"></i><wicket:message key="828" />
 						<label wicket:for="groups"><wicket:message key="126" /></label><div class="om-select2"><select class="input" wicket:id="groups"></select></div>
 					</div>
 				</fieldset>
@@ -92,22 +92,22 @@
 				<fieldset class="ui-widget-content">
 					<legend class="ui-widget-header"><wicket:message key="881" /></legend>
 					<div class="formelement">
-						<div class="info-text"><wicket:message key="880" /></div>
+						<i class="fas fa-info-circle m-1"></i><wicket:message key="880" />
 						<label wicket:for="allowUserQuestions"><wicket:message key="879" /></label><input type="checkbox" class="formcheckbox" wicket:id="allowUserQuestions" />
 					</div>
 					<div class="formelement">
-						<div class="info-text"><wicket:message key="1077" /></div>
+						<i class="fas fa-info-circle m-1"></i><wicket:message key="1077" />
 						<label wicket:for="audioOnly"><wicket:message key="1076" /></label><input type="checkbox" class="formcheckbox" wicket:id="audioOnly" />
 					</div>
 					<div class="formelement">
-						<div class="info-text"><wicket:message key="1101" /></div>
+						<i class="fas fa-info-circle m-1"></i><wicket:message key="1101" />
 						<label wicket:for="closed"><wicket:message key="1099" /></label><input type="checkbox" class="formcheckbox" wicket:id="closed" />
 					</div>
 					<div class="formelement">
 						<label wicket:for="redirectURL"><wicket:message key="1100" /></label><input type="text" wicket:id="redirectURL" />
 					</div>
 					<div class="formelement">
-						<div class="info-text"><wicket:message key="1102" /></div>
+						<i class="fas fa-info-circle m-1"></i><wicket:message key="1102" />
 						<br/>
 						<label wicket:for="waitRecording"><wicket:message key="1356" /></label><input type="checkbox" class="formcheckbox" wicket:id="waitRecording" />
 					</div>
@@ -199,11 +199,11 @@
 				<fieldset class="ui-widget-content">
 					<legend class="ui-widget-header"><wicket:message key="816" /></legend>
 					<div class="formelement">
-						<div class="info-text"><wicket:message key="823" /></div>
+						<i class="fas fa-info-circle m-1"></i><wicket:message key="823" />
 						<label wicket:for="moderated"><wicket:message key="640" /></label><input type="checkbox" class="formcheckbox" wicket:id="moderated" />
 					</div>
 					<div class="formelement">
-						<div class="info-text"><wicket:message key="admin.room.wait-moderator.info" /></div>
+						<i class="fas fa-info-circle m-1"></i><wicket:message key="admin.room.wait-moderator.info" />
 						<label wicket:for="waitModerator"><wicket:message key="admin.room.wait-moderator.label" /></label><input type="checkbox" class="formcheckbox" wicket:id="waitModerator" />
 					</div>
 					<div class="formelement">
@@ -240,8 +240,7 @@
 				<fieldset class="ui-widget-content">
 					<legend class="ui-widget-header"><wicket:message key="1001" /></legend>
 					<div class="formelement">
-						<div class="info-text"><wicket:message key="1002" /></div>
-						<br/>
+						<i class="fas fa-info-circle m-1"></i><wicket:message key="1002" />
 					</div>
 					<div class="formelement">
 						<label wicket:for="confno"><wicket:message key="1003" /></label><input type="text" wicket:id="confno" />
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.html
index 0d3f592..a441ed0 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.html
@@ -20,10 +20,10 @@
 -->
 <!DOCTYPE html>
 <html xmlns:wicket="http://wicket.apache.org">
-<wicket:panel>
+<wicket:extend>
 	<form wicket:id="form">
 		<label class="pl-4 pr-4" wicket:for="password"><wicket:message key="current.password"/></label><input type="password" wicket:id="password"/>
 		<div wicket:id="feedback"></div>
 	</form>
-</wicket:panel>
+</wicket:extend>
 </html>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.java
index a044c13..c8a911a 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.java
@@ -20,9 +20,6 @@ package org.apache.openmeetings.web.admin.users;
 
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
-import java.util.Arrays;
-import java.util.List;
-
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
@@ -33,15 +30,13 @@ import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.danekja.java.util.function.serializable.SerializableConsumer;
 
-import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
-
+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 PasswordDialog extends AbstractFormDialog<String> {
+public class PasswordDialog extends Modal<String> {
 	private static final long serialVersionUID = 1L;
-	private DialogButton btnOk;
-	private DialogButton btnCancel;
 	private final NotificationPanel feedback = new NotificationPanel("feedback");
 	private final Form<String> form = new Form<>("form");
 	private final PasswordTextField pass = new PasswordTextField("password", Model.of(""));
@@ -50,7 +45,7 @@ public class PasswordDialog extends AbstractFormDialog<String> {
 	private UserDao userDao;
 
 	public PasswordDialog(String id) {
-		super(id, "");
+		super(id);
 	}
 
 	public UserForm getUserForm() {
@@ -59,62 +54,46 @@ public class PasswordDialog extends AbstractFormDialog<String> {
 
 	@Override
 	protected void onInitialize() {
-		setTitle(new ResourceModel("537"));
-		btnOk = new DialogButton("ok", getString("54"));
-		btnCancel = new DialogButton("cancel", getString("lbl.cancel"));
-		add(form.add(feedback, pass.setRequired(false).setLabel(new ResourceModel("110")).setOutputMarkupPlaceholderTag(true).setOutputMarkupId(true)));
-		super.onInitialize();
-	}
+		header(new ResourceModel("537"));
+		setCloseOnEscapeKey(true);
+		setBackdrop(Backdrop.STATIC);
 
-	@Override
-	protected List<DialogButton> getButtons() {
-		return Arrays.asList(btnOk, btnCancel);
-	}
+		addButton(new BootstrapAjaxButton("button", new ResourceModel("54"), form, Buttons.Type.Primary) {
+			private static final long serialVersionUID = 1L;
 
-	@Override
-	public DialogButton getSubmitButton() {
-		return btnOk;
-	}
-
-	@Override
-	public Form<?> getForm() {
-		return form;
-	}
+			@Override
+			protected void onError(AjaxRequestTarget target) {
+				target.add(feedback);
+			}
 
-	@Override
-	protected void onError(AjaxRequestTarget target, DialogButton btn) {
-		target.add(feedback);
+			@Override
+			protected void onSubmit(AjaxRequestTarget target) {
+				final UserForm uf = getUserForm();
+				if (uf.isAdminPassRequired()) {
+					if (userDao.verifyPassword(getUserId(), pass.getConvertedInput())) {
+						if (action != null) {
+							action.accept(target);
+						}
+						PasswordDialog.this.close(target);
+					} else {
+						form.error(getString("error.bad.password"));
+						target.add(feedback);
+					}
+				}
+			}
+		}); // OK
+		addCloseButton(new ResourceModel("lbl.cancel"));
+		add(form.add(feedback.setOutputMarkupId(true), pass.setRequired(false).setLabel(new ResourceModel("110")).setOutputMarkupPlaceholderTag(true).setOutputMarkupId(true)));
+		super.onInitialize();
 	}
 
 	@Override
-	protected void onOpen(IPartialPageRequestHandler handler) {
+	public Modal<String> show(IPartialPageRequestHandler handler) {
 		handler.add(pass.setModelObject(""));
-		super.onOpen(handler);
-	}
-
-	@Override
-	public void onClick(AjaxRequestTarget target, DialogButton button) {
-		if (!form.hasError() || !button.equals(btnOk)) {
-			super.onClick(target, button);
-		}
+		return super.show(handler);
 	}
 
 	public void setAction(SerializableConsumer<AjaxRequestTarget> action) {
 		this.action = action;
 	}
-
-	@Override
-	protected void onSubmit(AjaxRequestTarget target, DialogButton btn) {
-		final UserForm uf = getUserForm();
-		if (uf.isAdminPassRequired()) {
-			if (userDao.verifyPassword(getUserId(), pass.getConvertedInput())) {
-				if (action != null) {
-					action.accept(target);
-				}
-			} else {
-				form.error(getString("error.bad.password"));
-				target.add(feedback);
-			}
-		}
-	}
 }
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.html
index 2c57f2a..6dc8001 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.html
@@ -27,36 +27,35 @@
 				<wicket:message key="143" />
 			</legend>
 			<div class="formelement">
-				<label wicket:for="login"><wicket:message key="108" /></label><input type="text" wicket:id="login" />
+				<label wicket:for="login" class="col-3 text-right"><wicket:message key="108" /></label><input type="text" wicket:id="login" class="col-8"/>
 			</div>
 			<div class="formelement">
-				<label wicket:for="password"><wicket:message key="110" /></label><input type="password" wicket:id="password" />
+				<label wicket:for="password" class="col-3 text-right"><wicket:message key="110" /></label><input type="password" wicket:id="password" class="col-8"/>
 			</div>
 			<form wicket:id="general"></form>
 			<div class="formelement">
-				<label wicket:for="type"><wicket:message key="45" /></label><select wicket:id="type"></select>
+				<label wicket:for="type" class="col-3 text-right"><wicket:message key="45" /></label><select wicket:id="type" class="custom-select col-8"></select>
 			</div>
 			<div class="formelement" wicket:id="domain">
-				<label wicket:for="domainId"><wicket:message key="1118" /></label><select wicket:id="domainId"></select>
+				<label wicket:for="domainId" class="col-3 text-right"><wicket:message key="1118" /></label><select wicket:id="domainId" class="col-8"></select>
 			</div>
 			<div class="formelement">
-				<label><wicket:message key="1308" /></label><span wicket:id="ownerId"></span>
+				<label class="col-3 text-right"><wicket:message key="1308" /></label><span wicket:id="ownerId" class="col-8"/>
 			</div>
 			<div class="formelement">
-				<label><wicket:message key="1110" /></label><span wicket:id="inserted" />
+				<label class="col-3 text-right"><wicket:message key="1110" /></label><span wicket:id="inserted" class="col-8"/>
 			</div>
 			<div class="formelement">
-				<label><wicket:message key="1112" /></label><span wicket:id="updated" />
+				<label class="col-3 text-right"><wicket:message key="1112" /></label><span wicket:id="updated" class="col-8"/>
 			</div>
 			<div class="formelement">
-				<div class="info-text">
-					<wicket:message key="1149" />
-				</div>
-				<br /> <label wicket:for="forceTimeZoneCheck"><wicket:message key="1148" /></label><input class="formcheckbox" type="checkbox"
-					wicket:id="forceTimeZoneCheck" />
+				<div><i class="fas fa-info-circle m-1"></i><wicket:message key="1149" /></div>
+				<label wicket:for="forceTimeZoneCheck" class="col-3 text-right"><wicket:message key="1148" /></label>
+				<input class="formcheckbox" type="checkbox" wicket:id="forceTimeZoneCheck"/>
 			</div>
 			<div class="formelement">
-				<label wicket:for="rights"><wicket:message key="881" /></label><div class="om-select2"><select class="input" wicket:id="rights"></select></div>
+				<label wicket:for="rights" class="col-3 text-right"><wicket:message key="881" /></label>
+				<div class="om-select2 p-0 d-inline-block col-8"><select class="input w-100" wicket:id="rights"></select></div>
 			</div>
 		</fieldset>
 		<fieldset class="ui-widget-content">
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
index 6d3223e..e53ca5d 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
@@ -208,7 +208,7 @@ public class UserForm extends AdminBaseForm<User> {
 	protected void onPurgeSubmit(AjaxRequestTarget target, Form<?> form) {
 		if (isAdminPassRequired()) {
 			adminPass.setAction(this::purgeUser);
-			adminPass.open(target);
+			adminPass.show(target);
 		} else {
 			purgeUser(target);
 		}
@@ -218,7 +218,7 @@ public class UserForm extends AdminBaseForm<User> {
 	protected void onSaveSubmit(AjaxRequestTarget target, Form<?> form) {
 		if (isAdminPassRequired()) {
 			adminPass.setAction((SerializableConsumer<AjaxRequestTarget>)t -> saveUser(t, password.getModelObject()));
-			adminPass.open(target);
+			adminPass.show(target);
 		} else {
 			saveUser(target, password.getConvertedInput());
 		}
@@ -298,7 +298,7 @@ public class UserForm extends AdminBaseForm<User> {
 	protected void onDeleteSubmit(AjaxRequestTarget target, Form<?> form) {
 		if (isAdminPassRequired()) {
 			adminPass.setAction(this::deleteUser);
-			adminPass.open(target);
+			adminPass.show(target);
 		} else {
 			deleteUser(target);
 		}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/ComunityUserForm.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/ComunityUserForm.html
index e5b4bce..f6cf181 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/ComunityUserForm.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/ComunityUserForm.html
@@ -21,29 +21,33 @@
 <!DOCTYPE html>
 <html xmlns:wicket="http://wicket.apache.org">
 <wicket:panel>
-	<div class="formelementradiobox">
-		<div wicket:id="community_settings">
-			<div>
+	<div wicket:id="community_settings">
+		<div>
+			<div class="d-inline-block col-3"></div>
+			<div class="d-inline-block col-8">
 				<input wicket:id="everybody" type="radio" /><label wicket:for="everybody"><wicket:message key="1160"/></label>
-				<div class="clear"></div>
 			</div>
-			<div>
+		</div>
+		<div>
+			<div class="d-inline-block col-3"></div>
+			<div class="d-inline-block col-8">
 				<input wicket:id="contact" type="radio" /><label wicket:for="contact"><wicket:message key="1168"/></label>
-				<div class="clear"></div>
 			</div>
-			<div>
+		</div>
+		<div>
+			<div class="d-inline-block col-3"></div>
+			<div class="d-inline-block col-8">
 				<input wicket:id="nobody" type="radio" /><label wicket:for="nobody"><wicket:message key="1169"/></label>
-				<div class="clear"></div>
 			</div>
 		</div>
 	</div>
 	<div class="formelement">
-		<label wicket:for="userOffers"><wicket:message key="1162" /></label>
-		<textarea wicket:id="userOffers" />
+		<label wicket:for="userOffers" class="col-3"><wicket:message key="1162" /></label>
+		<textarea wicket:id="userOffers" class="col-8"/>
 	</div>
 	<div class="formelement">
-		<label wicket:for="userSearchs"><wicket:message key="1163" /></label>
-		<textarea wicket:id="userSearchs" />
+		<label wicket:for="userSearchs" class="col-3"><wicket:message key="1163" /></label>
+		<textarea wicket:id="userSearchs" class="col-8"/>
 	</div>
 </wicket:panel>
 </html>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.html
index 3c2c7ce..b998656 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.html
@@ -22,50 +22,59 @@
 <html xmlns:wicket="http://wicket.apache.org">
 <wicket:panel>
 	<div class="formelement">
-		<label wicket:for="address.email"><wicket:message key="119" /></label><input type="text" wicket:id="address.email" />
+		<label wicket:for="address.email" class="col-3 text-right"><wicket:message key="119" /></label>
+		<input type="text" wicket:id="address.email" class="col-8"/>
 	</div>
 	<div class="formelement">
-		<label wicket:for="firstname"><wicket:message key="135" /></label><select
-			wicket:id="salutation"/><input type="text"
-			wicket:id="firstname"/>
+		<label wicket:for="firstname" class="col-3 text-right"><wicket:message key="135" /></label>
+		<select wicket:id="salutation" class="custom-select col-2"/><input type="text" wicket:id="firstname" class="col-6"/>
 	</div>
 	<div class="formelement">
-		<label wicket:for="lastname"><wicket:message key="136" /></label><input type="text" wicket:id="lastname" />
+		<label wicket:for="lastname" class="col-3 text-right"><wicket:message key="136" /></label>
+		<input type="text" wicket:id="lastname" class="col-8"/>
 	</div>
 	<div class="formelement">
-		<label wicket:for="displayName"><wicket:message key="user.label.displayName" /></label><input type="text" wicket:id="displayName" />
+		<label wicket:for="displayName" class="col-3 text-right"><wicket:message key="user.label.displayName" /></label>
+		<input type="text" wicket:id="displayName" class="col-8"/>
 	</div>
 	<div class="formelement">
-		<label wicket:for="timeZoneId"><wicket:message key="1143" /></label><select wicket:id="timeZoneId" />
+		<label wicket:for="timeZoneId" class="col-3 text-right"><wicket:message key="1143" /></label>
+		<select wicket:id="timeZoneId" class="custom-select col-8"/>
 	</div>
 	<div class="formelement">
-		<label wicket:for="languageId"><wicket:message key="59" /></label><select wicket:id="languageId" />
+		<label wicket:for="languageId" class="col-3 text-right"><wicket:message key="59" /></label>
+		<select wicket:id="languageId" class="custom-select col-8"/>
 	</div>
 	<div class="formelement">
-		<label wicket:for="address.phone"><wicket:message key="607" /></label><input type="text" wicket:id="address.phone" />
+		<label wicket:for="address.phone" class="col-3 text-right"><wicket:message key="607" /></label>
+		<input type="text" wicket:id="address.phone" class="col-8"/>
 	</div>
 	<div class="formelement">
-		<label wicket:for="age"><wicket:message key="138" /></label><input type="text" class="date time picker" wicket:id="age"/>
+		<label wicket:for="age" class="col-3 text-right"><wicket:message key="138" /></label>
+		<div class="d-inline-block col-8 p-0">
+			<input type="text" class="date time picker" wicket:id="age"/>
+		</div>
 	</div>
 	<div class="formelement">
-		<label wicket:for="address.street"><wicket:message key="139" /></label><input type="text"
-			wicket:id="address.street"/> <input
-			type="text" wicket:id="address.additionalname"/>
+		<label wicket:for="address.street" class="col-3 text-right"><wicket:message key="139" /></label>
+		<input type="text" wicket:id="address.street" class="col-6"/>
+		<input type="text" wicket:id="address.additionalname" class="col-2"/>
 	</div>
 	<div class="formelement">
-		<label wicket:for="address.town"><wicket:message key="140" /></label><input type="text"
-			wicket:id="address.zip"/> <input type="text"
-			wicket:id="address.town"/>
+		<label wicket:for="address.town" class="col-3 text-right"><wicket:message key="140" /></label>
+		<input type="text" wicket:id="address.zip" class="col-2"/> <input type="text" wicket:id="address.town" class="col-6"/>
 	</div>
 	<div class="formelement">
-		<label wicket:for="address.country"><wicket:message key="141" /></label><select wicket:id="address.country" />
+		<label wicket:for="address.country" class="col-3 text-right"><wicket:message key="141" /></label>
+		<select wicket:id="address.country" class="custom-select col-8"/>
 	</div>
 	<div class="formelement">
-		<label wicket:for="address.comment"><wicket:message key="142" /></label>
-		<textarea wicket:id="address.comment" />
+		<label wicket:for="address.comment" class="col-3 text-right"><wicket:message key="142" /></label>
+		<textarea wicket:id="address.comment" class="col-8"/>
 	</div>
 	<div class="formelement">
-		<label wicket:for="groupUsers"><wicket:message key="161" /></label><div class="om-select2"><select class="input" wicket:id="groupUsers"></select></div>
+		<label wicket:for="groupUsers" class="col-3 text-right"><wicket:message key="161" /></label>
+		<div class="om-select2 p-0 d-inline-block col-8"><select class="input w-100" wicket:id="groupUsers"></select></div>
 	</div>
 </wicket:panel>
 </html>
\ No newline at end of file
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/NicknameDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/NicknameDialog.java
index 9c2e1ba..e099cea 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/NicknameDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/NicknameDialog.java
@@ -65,7 +65,7 @@ public class NicknameDialog extends NonClosableDialog<User> {
 	protected void onInitialize() {
 		getTitle().setObject(getString("1287"));
 		ok = new DialogButton("ok", getString("54"));
-		form.add(feedback);
+		form.add(feedback.setOutputMarkupId(true));
 		form.add(new RequiredTextField<String>("firstname").setLabel(new ResourceModel("135")).add(minimumLength(getMinFnameLength())));
 		form.add(new RequiredTextField<String>("lastname").setLabel(new ResourceModel("136")).add(minimumLength(getMinLnameLength())));
 		form.add(new RequiredTextField<String>("address.email").setLabel(new ResourceModel("119")).add(RfcCompliantEmailAddressValidator.getInstance()));
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/CreatePollDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/CreatePollDialog.java
index 8af14d7..8914cf5 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/CreatePollDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/CreatePollDialog.java
@@ -139,7 +139,7 @@ public class CreatePollDialog extends AbstractFormDialog<RoomPoll> {
 						}
 					})
 					.setRequired(true).setLabel(new ResourceModel("21")));
-			add(feedback);
+			add(feedback.setOutputMarkupId(true));
 			super.onInitialize();
 		}
 	}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/VoteDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/VoteDialog.java
index 34711aa..dd60495 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/VoteDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/VoteDialog.java
@@ -155,7 +155,7 @@ public class VoteDialog extends AbstractFormDialog<RoomPollAnswer> {
 
 		PollAnswerForm(String id, IModel<RoomPollAnswer> model) {
 			super(id, model);
-			add(feedback);
+			add(feedback.setOutputMarkupId(true));
 			add(new Label("user", user));
 			add(new Label("roomPoll.question"));
 			add(typeBool.add(new RadioGroup<Boolean>("answer").setRequired(true)
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.html
index 468f29f..724a6dc 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/InviteUserToRoomDialog.html
@@ -21,7 +21,7 @@
 <!DOCTYPE html>
 <html xmlns:wicket="http://wicket.apache.org">
 <wicket:extend>
-	<div class="rooms desc info-text"><wicket:message key="1132"/></div>
+	<div class="rooms desc"><i class="fas fa-info-circle m-1"></i><wicket:message key="1132"/></div>
 	<div class="rooms title"><wicket:message key="777"/></div>
 	<div class="room list container">
 		<div wicket:id="publicRooms"></div>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.html
index 1a530e4..072325e 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.html
@@ -63,7 +63,7 @@
 									</tr>
 								</table>
 							</td>
-							<td><div class="info-text"><wicket:message key="1221" /></div></td>
+							<td><i class="fas fa-info-circle m-1"></i><wicket:message key="1221" /></td>
 						</tr>
 					</table>
 				</td>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.html
index 4fab5a0..8131d36 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.html
@@ -21,17 +21,19 @@
 <!DOCTYPE html>
 <html xmlns:wicket="http://wicket.apache.org">
 <wicket:panel>
-	<div class="room-list">
-		<div wicket:id="list" class="room-row">
-			<div class="container" wicket:id="roomContainer">
-				<div><span wicket:id="roomName">[room name]</span>&nbsp;<span wicket:id="info" class="info-text">&nbsp;</span></div>
-				<div>
-					<wicket:message key="398" />&nbsp;<span wicket:id="curUsers"></span>&nbsp;/&nbsp;<span
-						wicket:id="totalUsers"></span>&nbsp;&nbsp;<span wicket:id="refresh"><wicket:message key="lbl.refresh"/></span>
+	<table class="room-list table table-striped table-hover">
+		<tr wicket:id="list" class="room-row">
+			<td class="position-relative">
+				<div class="container" wicket:id="roomContainer">
+					<div><span wicket:id="roomName">[room name]</span>&nbsp;<i wicket:id="info" class="fas fa-info-circle info-text"></i></div>
+					<div>
+						<wicket:message key="398" />&nbsp;<span wicket:id="curUsers"></span>&nbsp;/&nbsp;<span
+							wicket:id="totalUsers"></span>&nbsp;&nbsp;<button wicket:id="refresh" class="refresh btn-sm m2"></button>
+					</div>
 				</div>
-			</div>
-			<button wicket:id="btn"><span wicket:id="label"></span></button>
-		</div>
-	</div>
+				<button wicket:id="btn" class="enter btn btn-outline-primary"><span wicket:id="label"></span></button>
+			</td>
+		</tr>
+	</table>
 </wicket:panel>
 </html>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.java
index 1e256be..9ea63bf 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomListPanel.java
@@ -21,12 +21,14 @@ package org.apache.openmeetings.web.user.rooms;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_TITLE;
 import static org.apache.openmeetings.web.common.BasePanel.EVT_CLICK;
 
+import java.io.Serializable;
 import java.util.List;
 
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.web.app.ClientManager;
 import org.apache.openmeetings.web.pages.MainPage;
 import org.apache.wicket.AttributeModifier;
+import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
@@ -35,16 +37,18 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
+import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
-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.form.button.Button;
-import com.googlecode.wicket.jquery.ui.markup.html.link.AjaxLink;
 import com.googlecode.wicket.jquery.ui.widget.tooltip.TooltipBehavior;
 
+import de.agilecoders.wicket.core.markup.html.bootstrap.behavior.CssClassNameAppender;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome5IconType;
+
 public class RoomListPanel extends Panel {
 	private static final long serialVersionUID = 1L;
 	private final ListView<Room> list;
@@ -76,7 +80,7 @@ public class RoomListPanel extends Panel {
 				final Label curUsers = new Label("curUsers", new Model<>(cm.listByRoom(r.getId()).size()));
 				roomContainer.add(curUsers.setOutputMarkupId(true));
 				roomContainer.add(new Label("totalUsers", r.getCapacity()));
-				item.add(new Button("btn").add(new Label("label", label)).add(new RoomEnterBehavior(r.getId()) {
+				item.add(new WebMarkupContainer("btn").add(new Label("label", label)).add(new RoomEnterBehavior(r.getId()) {
 					private static final long serialVersionUID = 1L;
 
 					@Override
@@ -84,21 +88,24 @@ public class RoomListPanel extends Panel {
 						onRoomEnter(target, roomId);
 					}
 				}));
-				roomContainer.add(new AjaxLink<String>("refresh") {
+				roomContainer.add(new BootstrapAjaxLink<String>("refresh", null, Buttons.Type.Outline_Info, new ResourceModel("lbl.refresh")) {
 					private static final long serialVersionUID = 1L;
 
+					{
+						setIconType(FontAwesome5IconType.sync_alt_s);
+					}
+
 					@Override
-					public void onClick(AjaxRequestTarget target) {
-						target.add(curUsers.setDefaultModelObject(cm.listByRoom(r.getId()).size()));
-						onRefreshClick(target, r);
+					protected <L extends Serializable> Component newLabel(String markupId, IModel<L> model) {
+						return super.newLabel(markupId, model).setRenderBodyOnly(false).add(new CssClassNameAppender("sr-only"));
 					}
 
 					@Override
-					public void onConfigure(JQueryBehavior behavior) {
-						behavior.setOption("icon", Options.asString(JQueryIcon.REFRESH));
-						behavior.setOption("showLabel", false);
+					public void onClick(AjaxRequestTarget target) {
+						target.add(curUsers.setDefaultModelObject(cm.listByRoom(r.getId()).size()));
+						onRefreshClick(target, r);
 					}
-				});
+				}.add(AttributeModifier.append(ATTR_TITLE, new ResourceModel("lbl.refresh"))));
 			}
 		});
 		add(new TooltipBehavior(".info-text"));
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsSelectorPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsSelectorPanel.html
index 9ce81bb..b4cd629 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsSelectorPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsSelectorPanel.html
@@ -23,7 +23,7 @@
 <wicket:panel>
 	<div class="rooms-header">
 		<div wicket:id="title" class="rooms title"></div>
-		<div wicket:id="desc" class="rooms desc info-text"></div>
+		<i class="fas fa-info-circle m-1"></i><div wicket:id="desc" class="rooms desc"></div>
 	</div>
 	<div class="rooms-area" wicket:id="rooms"></div>
 </wicket:panel>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsSelectorPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsSelectorPanel.java
index 2554380..94c84a4 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsSelectorPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsSelectorPanel.java
@@ -61,7 +61,7 @@ public class RoomsSelectorPanel extends UserBasePanel {
 	@Override
 	protected void onInitialize() {
 		add(new Label("title", getString(title)));
-		add(new Label("desc", getString(desc)));
+		add(new Label("desc", getString(desc)).setRenderBodyOnly(true));
 		super.onInitialize();
 	}
 }
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsTabbedPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsTabbedPanel.html
index 2f45a05..c762062 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsTabbedPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsTabbedPanel.html
@@ -21,11 +21,6 @@
 <!DOCTYPE html>
 <html xmlns:wicket="http://wicket.apache.org">
 <wicket:panel>
-	<div id="orgTabs">
-		<ul>
-			<li wicket:id="orgTabs"><a wicket:id="link"><wicket:container wicket:id="name"></wicket:container></a></li>
-		</ul>
-		<wicket:container wicket:id="orgRooms"><div wicket:id="rooms"></div></wicket:container>
-	</div>
+	<div wicket:id="orgTabs" id="orgTabs"></div>
 </wicket:panel>
 </html>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsTabbedPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsTabbedPanel.java
index c09fe0f..bf84df6 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsTabbedPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/rooms/RoomsTabbedPanel.java
@@ -20,21 +20,18 @@ package org.apache.openmeetings.web.user.rooms;
 
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
+import java.util.stream.Collectors;
+
 import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
-import org.apache.openmeetings.db.entity.user.Group;
-import org.apache.openmeetings.db.entity.user.GroupUser;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.web.common.UserPanel;
-import org.apache.wicket.AttributeModifier;
+import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
 import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.list.ListItem;
-import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
-import com.googlecode.wicket.jquery.core.JQueryBehavior;
+import de.agilecoders.wicket.core.markup.html.bootstrap.tabs.AjaxBootstrapTabbedPanel;
 
 public class RoomsTabbedPanel extends UserPanel {
 	private static final long serialVersionUID = 1L;
@@ -52,28 +49,13 @@ public class RoomsTabbedPanel extends UserPanel {
 	protected void onInitialize() {
 		super.onInitialize();
 		User u = userDao.get(getUserId());
-		add(new ListView<>("orgTabs", u.getGroupUsers()) {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void populateItem(ListItem<GroupUser> item) {
-				Group org = item.getModelObject().getGroup();
-				item.add(new WebMarkupContainer("link")
-					.add(new Label("name", Model.of(org.getName())))
-					.add(AttributeModifier.replace("href", "#org" + org.getId())));
-			}
-		});
-		add(new ListView<>("orgRooms", u.getGroupUsers()) {
+		add(new AjaxBootstrapTabbedPanel<>("orgTabs", u.getGroupUsers().stream().map(gu -> new AbstractTab(Model.of(gu.getGroup().getName())) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
-			protected void populateItem(ListItem<GroupUser> item) {
-				Group org = item.getModelObject().getGroup();
-				item.add(new RoomsPanel("rooms"
-					, roomDao.getGroupRooms(org.getId()))
-					.setMarkupId("org" + org.getId())).setRenderBodyOnly(true);
+			public WebMarkupContainer getPanel(String panelId) {
+				return new RoomsPanel(panelId, roomDao.getGroupRooms(gu.getGroup().getId()));
 			}
-		});
-		add(new JQueryBehavior("#orgTabs", "tabs"));
+		}).collect(Collectors.toList())));
 	}
 }
diff --git a/openmeetings-web/src/main/webapp/css/raw-admin.css b/openmeetings-web/src/main/webapp/css/raw-admin.css
index 0b98f16..fb3238a 100644
--- a/openmeetings-web/src/main/webapp/css/raw-admin.css
+++ b/openmeetings-web/src/main/webapp/css/raw-admin.css
@@ -36,75 +36,17 @@
 	height: var(--actions-height);
 	padding-top: 5px;
 }
-.adminPanelColumnTable .list-table .ui-button.ui-widget {
-	padding: 0;
-}
 .adminPanelColumnForm div.scrollcontent {
 	height: calc(100% - var(--actions-height));
 	vertical-align: top;
 	overflow-y: auto;
 }
-.adminForm .input, .adminForm input, .adminForm input.formcheckbox
-,.adminForm textarea, .adminForm select, .adminForm label
- {
-	display: block;
-	float: left;
-	font-size: 14px;
-	padding: 0px 0px;
-	margin: 2px 2px;
-}
-.adminForm .input {
-	border: solid 1px #aacfe4;
-	width: 280px;
-	min-height: 20px;
-	white-space: normal; /* IE */
-	white-space: initial;
-}
-.adminForm input {
-	border: solid 1px #aacfe4;
-	width: 280px;
-	height: 20px;
-}
-.adminForm input[type=checkbox], .adminForm input[type=radio] {
-	width: auto;
-}
-.adminForm input.formcheckbox {
-	border: none;
-	width: 20px;
-	height: 20px;
-}
-.adminForm fieldset {
-	margin-top: 4px;
-	padding: 4px;
-}
 .adminForm legend {
 	padding: 0.2em 0.5em;
 	margin: 0px 10px;
 	font-style: italic;
 	text-align: right;
 }
-.adminForm textarea {
-	border: solid 1px #aacfe4;
-	width: 280px;
-	height: 60px;
-}
-.adminForm div.formelement {
-	display: block;
-	clear: both;
-	max-width: 540px;
-	white-space: nowrap;
-}
-.adminForm select {
-	height: 20px;
-	border: solid 1px #aacfe4;
-	width: 282px;
-}
-.adminForm label {
-	font-weight: bold;
-	text-align: right;
-	width: 180px;
-	white-space: normal;
-}
 .adminForm .group.logo .profile img {
 	height: 16px;
 	width: auto;
diff --git a/openmeetings-web/src/main/webapp/css/raw-general-rtl.css b/openmeetings-web/src/main/webapp/css/raw-general-rtl.css
index 980958c..edd32bf 100644
--- a/openmeetings-web/src/main/webapp/css/raw-general-rtl.css
+++ b/openmeetings-web/src/main/webapp/css/raw-general-rtl.css
@@ -22,11 +22,6 @@ html[dir="rtl"] #busy-indicator {
 html[dir="rtl"] .ui-tabs .ui-tabs-nav li {
 	float: right !important;
 }
-html[dir="rtl"] .info-text {
-	background-position: right top !important;
-	padding-left: initial !important;
-	padding-right: 20px;
-}
 html[dir="rtl"] .start_step1
 , html[dir="rtl"] .start_step2
 , html[dir="rtl"] .start_step3
@@ -48,9 +43,6 @@ html[dir="rtl"] .start_step4 {
 	margin-left: initial !important;
 	margin-right: 60px !important;
 }
-html[dir="rtl"] form .input {
-	float: right !important;
-}
 html[dir="rtl"] .ui-dialog .ui-dialog-title {
 	float: right !important;
 }
diff --git a/openmeetings-web/src/main/webapp/css/raw-general.css b/openmeetings-web/src/main/webapp/css/raw-general.css
index f2d11b5..17b2902 100644
--- a/openmeetings-web/src/main/webapp/css/raw-general.css
+++ b/openmeetings-web/src/main/webapp/css/raw-general.css
@@ -96,18 +96,6 @@ html, body {
 	max-width: 100%;
 	height: calc(100% - 50px);
 }
-.formelementradiobox {
-	margin-left: 100px;
-}
-.formelementradiobox input {
-	margin: 0px 0px;
-	border: none;
-	width: 20px;
-}
-.formelementradiobox label {
-	width: 260px;
-	margin: 0px
-}
 .pagedEntityListPanel {
 	margin-left: 2px;
 	display: inline-block;
@@ -370,16 +358,6 @@ textarea.messages.body {
 select.messages.selector {
 	width: 220px;
 }
-.info-text {
-	background-image: url(images/information.png);
-	background-repeat: no-repeat;
-	background-position: left top;
-	cursor: default;
-	border: none;
-	padding-left: 20px;
-	font-style: italic;
-	white-space: normal;
-}
 .info-title {
 	background-image: url(images/information.png);
 	background-repeat: no-repeat;
@@ -406,21 +384,10 @@ select.messages.selector {
 #ui-datepicker-div {
 	z-index: 100 !important;
 }
-.room-list {
-	border-collapse: collapse;
-	min-width: 400px;
-}
-.room-list .room-row {
-	border: 1px solid transparent;
-	background-color: rgb(248, 248, 248);
-	margin-bottom: 4px;
-	padding: 5px;
-	position: relative;
-}
-.room-list .room-row .container {
-	margin-right: 120px;
+.room-list .room-row button.refresh {
+	padding: 0 0.25rem;
 }
-.room-list .room-row button {
+.room-list .room-row button.enter {
 	position: absolute;
 	right: 10px;
 	top: 10px;
@@ -498,7 +465,7 @@ select.messages.selector {
 .rooms-area {
 	display: flex;
 }
-#orgTabs.ui-tabs .ui-tabs-panel {
+#orgTabs .tab-content {
 	display: flex;
 	padding-bottom: 0;
 	height: calc(100% - var(--tabs-height));
@@ -539,14 +506,6 @@ select.messages.selector {
 	bottom: 0;
 	position: fixed;
 }
-form .input {
-	display: block;
-	float: left;
-	font-size: 14px;
-	padding: 0px 0px;
-	width: 280px;
-	margin: 2px 2px;
-}
 .profile {
 	position: relative;
 }